From efa16fe99b5f0e18c6dbe09bf58cd3bbfe4c27d7 Mon Sep 17 00:00:00 2001 From: sandeepindia Date: Wed, 29 Nov 2023 19:13:49 +0000 Subject: [PATCH] RICAPP-224:- F1AP gnbDuConfigurationUpdate parser Change-Id: I393e58404eebcc011e0099eff2c53cf44b15ec0d Signed-off-by: sandeepindia --- Dockerfile | 32 +- control/control.go | 108 +- control/f1ap.go | 14 + control/types.go | 4 + e2ap/asn1/Makefile.am.libasncodec | 483 + e2ap/asn1/commonDefinition.asn | 28 + e2ap/asn1/constantDefinition.asn | 127 + e2ap/asn1/containerDefinition.asn | 131 + e2ap/asn1/elementryProcedureDefinition.asn | 252 + e2ap/asn1/informationElementDefinition.asn | 496 + e2ap/asn1/pduDefinition.asn | 934 + e2ap/headers/AMFName.h | 47 + e2ap/headers/ANY.h | 45 +- e2ap/headers/BIT_STRING.h | 45 +- e2ap/headers/Cause.h | 19 +- e2ap/headers/CauseE2node.h | 56 + e2ap/headers/CauseMisc.h | 11 +- e2ap/headers/CauseProtocol.h | 11 +- e2ap/headers/CauseRIC.h | 65 - e2ap/headers/CauseRICrequest.h | 69 + e2ap/headers/CauseRICservice.h | 13 +- e2ap/headers/CauseTransport.h | 11 +- e2ap/headers/Criticality.h | 11 +- e2ap/headers/CriticalityDiagnostics-IE-Item.h | 10 +- e2ap/headers/CriticalityDiagnostics-IE-List.h | 12 +- e2ap/headers/CriticalityDiagnostics.h | 10 +- e2ap/headers/E2AP-PDU.h | 10 +- e2ap/headers/E2connectionSetupFailed-Item.h | 46 + e2ap/headers/E2connectionSetupFailed-List.h | 44 + e2ap/headers/E2connectionUpdate-Item.h | 46 + e2ap/headers/E2connectionUpdate-List.h | 44 + e2ap/headers/E2connectionUpdate.h | 44 + e2ap/headers/E2connectionUpdateAcknowledge.h | 44 + e2ap/headers/E2connectionUpdateFailure.h | 44 + e2ap/headers/E2connectionUpdateRemove-Item.h | 44 + e2ap/headers/E2connectionUpdateRemove-List.h | 44 + e2ap/headers/E2nodeComponentConfigAddition-Item.h | 48 + e2ap/headers/E2nodeComponentConfigAddition-List.h | 44 + .../E2nodeComponentConfigAdditionAck-Item.h | 48 + .../E2nodeComponentConfigAdditionAck-List.h | 44 + e2ap/headers/E2nodeComponentConfigRemoval-Item.h | 46 + e2ap/headers/E2nodeComponentConfigRemoval-List.h | 44 + .../headers/E2nodeComponentConfigRemovalAck-Item.h | 48 + .../headers/E2nodeComponentConfigRemovalAck-List.h | 44 + e2ap/headers/E2nodeComponentConfigUpdate-Item.h | 48 + e2ap/headers/E2nodeComponentConfigUpdate-List.h | 44 + e2ap/headers/E2nodeComponentConfigUpdateAck-Item.h | 48 + e2ap/headers/E2nodeComponentConfigUpdateAck-List.h | 44 + e2ap/headers/E2nodeComponentConfiguration.h | 45 + e2ap/headers/E2nodeComponentConfigurationAck.h | 58 + e2ap/headers/E2nodeComponentID.h | 76 + e2ap/headers/E2nodeComponentInterfaceE1.h | 44 + e2ap/headers/E2nodeComponentInterfaceF1.h | 44 + e2ap/headers/E2nodeComponentInterfaceNG.h | 44 + e2ap/headers/E2nodeComponentInterfaceS1.h | 44 + e2ap/headers/E2nodeComponentInterfaceType.h | 62 + e2ap/headers/E2nodeComponentInterfaceW1.h | 44 + e2ap/headers/E2nodeComponentInterfaceX2.h | 48 + e2ap/headers/E2nodeComponentInterfaceXn.h | 44 + e2ap/headers/E2nodeConfigurationUpdate.h | 44 + .../headers/E2nodeConfigurationUpdateAcknowledge.h | 44 + e2ap/headers/E2nodeConfigurationUpdateFailure.h | 44 + e2ap/headers/E2nodeTNLassociationRemoval-Item.h | 45 + e2ap/headers/E2nodeTNLassociationRemoval-List.h | 44 + e2ap/headers/E2setupFailure.h | 14 +- e2ap/headers/E2setupRequest.h | 14 +- e2ap/headers/E2setupResponse.h | 14 +- e2ap/headers/ENB-ID-Choice.h | 12 +- e2ap/headers/ENB-ID.h | 12 +- e2ap/headers/ENGNB-ID.h | 12 +- e2ap/headers/EXTERNAL.h | 65 + e2ap/headers/ErrorIndication.h | 14 +- e2ap/headers/GNB-CU-UP-ID.h | 11 +- e2ap/headers/GNB-DU-ID.h | 11 +- e2ap/headers/GNB-ID-Choice.h | 12 +- e2ap/headers/GlobalE2node-ID.h | 10 +- e2ap/headers/GlobalE2node-eNB-ID.h | 10 +- e2ap/headers/GlobalE2node-en-gNB-ID.h | 18 +- e2ap/headers/GlobalE2node-gNB-ID.h | 16 +- e2ap/headers/GlobalE2node-ng-eNB-ID.h | 18 +- e2ap/headers/GlobalENB-ID.h | 10 +- e2ap/headers/GlobalNG-RANNode-ID.h | 61 + e2ap/headers/GlobalRIC-ID.h | 12 +- e2ap/headers/GlobalenGNB-ID.h | 10 +- e2ap/headers/GlobalgNB-ID.h | 10 +- e2ap/headers/GlobalngeNB-ID.h | 10 +- e2ap/headers/GraphicString.h | 56 + e2ap/headers/INTEGER.h | 43 +- e2ap/headers/InitiatingMessage.h | 33 +- e2ap/headers/MMEname.h | 47 + e2ap/headers/NGENB-DU-ID.h | 47 + e2ap/headers/NativeEnumerated.h | 45 +- e2ap/headers/NativeInteger.h | 31 +- e2ap/headers/OBJECT_IDENTIFIER.h | 184 + e2ap/headers/OCTET_STRING.h | 77 +- e2ap/headers/OPEN_TYPE.h | 118 +- e2ap/headers/ObjectDescriptor.h | 54 + e2ap/headers/PLMN-Identity.h | 11 +- e2ap/headers/Presence.h | 11 +- e2ap/headers/PrintableString.h | 56 + e2ap/headers/ProcedureCode.h | 14 +- e2ap/headers/ProtocolIE-Container.h | 329 +- e2ap/headers/ProtocolIE-ContainerList.h | 8 +- e2ap/headers/ProtocolIE-ContainerPair.h | 8 +- e2ap/headers/ProtocolIE-ContainerPairList.h | 8 +- e2ap/headers/ProtocolIE-Field.h | 633 +- e2ap/headers/ProtocolIE-FieldPair.h | 8 +- e2ap/headers/ProtocolIE-ID.h | 38 +- e2ap/headers/ProtocolIE-SingleContainer.h | 370 +- e2ap/headers/RANfunction-Item.h | 14 +- e2ap/headers/RANfunctionDefinition.h | 11 +- e2ap/headers/RANfunctionID-Item.h | 10 +- e2ap/headers/RANfunctionID.h | 11 +- e2ap/headers/RANfunctionIDcause-Item.h | 10 +- e2ap/headers/RANfunctionOID.h | 47 + e2ap/headers/RANfunctionRevision.h | 11 +- e2ap/headers/RANfunctions-List.h | 12 +- e2ap/headers/RANfunctionsID-List.h | 12 +- e2ap/headers/RANfunctionsIDcause-List.h | 12 +- e2ap/headers/RICaction-Admitted-Item.h | 10 +- e2ap/headers/RICaction-Admitted-List.h | 12 +- e2ap/headers/RICaction-NotAdmitted-Item.h | 10 +- e2ap/headers/RICaction-NotAdmitted-List.h | 12 +- e2ap/headers/RICaction-ToBeSetup-Item.h | 10 +- e2ap/headers/RICactionDefinition.h | 11 +- e2ap/headers/RICactionID.h | 11 +- e2ap/headers/RICactionType.h | 11 +- e2ap/headers/RICactions-ToBeSetup-List.h | 12 +- e2ap/headers/RICcallProcessID.h | 11 +- e2ap/headers/RICcontrolAckRequest.h | 14 +- e2ap/headers/RICcontrolAcknowledge.h | 14 +- e2ap/headers/RICcontrolFailure.h | 14 +- e2ap/headers/RICcontrolHeader.h | 11 +- e2ap/headers/RICcontrolMessage.h | 11 +- e2ap/headers/RICcontrolOutcome.h | 11 +- e2ap/headers/RICcontrolRequest.h | 14 +- e2ap/headers/RICcontrolStatus.h | 57 - e2ap/headers/RICeventTriggerDefinition.h | 11 +- e2ap/headers/RICindication.h | 14 +- e2ap/headers/RICindicationHeader.h | 11 +- e2ap/headers/RICindicationMessage.h | 11 +- e2ap/headers/RICindicationSN.h | 11 +- e2ap/headers/RICindicationType.h | 11 +- e2ap/headers/RICrequestID.h | 12 +- e2ap/headers/RICserviceQuery.h | 14 +- e2ap/headers/RICserviceUpdate.h | 14 +- e2ap/headers/RICserviceUpdateAcknowledge.h | 14 +- e2ap/headers/RICserviceUpdateFailure.h | 14 +- e2ap/headers/RICsubscription-List-withCause.h | 44 + e2ap/headers/RICsubscription-withCause-Item.h | 48 + e2ap/headers/RICsubscriptionDeleteFailure.h | 14 +- e2ap/headers/RICsubscriptionDeleteRequest.h | 14 +- e2ap/headers/RICsubscriptionDeleteRequired.h | 44 + e2ap/headers/RICsubscriptionDeleteResponse.h | 14 +- e2ap/headers/RICsubscriptionDetails.h | 10 +- e2ap/headers/RICsubscriptionFailure.h | 14 +- e2ap/headers/RICsubscriptionRequest.h | 14 +- e2ap/headers/RICsubscriptionResponse.h | 14 +- e2ap/headers/RICsubsequentAction.h | 10 +- e2ap/headers/RICsubsequentActionType.h | 11 +- e2ap/headers/RICtimeToWait.h | 46 +- e2ap/headers/ResetRequest.h | 14 +- e2ap/headers/ResetResponse.h | 14 +- e2ap/headers/SuccessfulOutcome.h | 29 +- e2ap/headers/TNLinformation.h | 45 + e2ap/headers/TNLusage.h | 58 + e2ap/headers/TimeToWait.h | 11 +- e2ap/headers/TransactionID.h | 47 + e2ap/headers/TriggeringMessage.h | 11 +- e2ap/headers/TypeOfError.h | 11 +- e2ap/headers/UnsuccessfulOutcome.h | 31 +- e2ap/headers/aper_decoder.h | 47 + e2ap/headers/aper_encoder.h | 63 + e2ap/headers/aper_opentype.h | 30 + e2ap/headers/aper_support.h | 63 + e2ap/headers/asn_application.h | 4 +- e2ap/headers/asn_bit_data.h | 2 +- e2ap/headers/asn_codecs_prim.h | 21 +- e2ap/headers/asn_config.h | 2 + e2ap/headers/asn_constant.h | 21 + e2ap/headers/asn_internal.h | 46 +- e2ap/headers/asn_system.h | 21 +- e2ap/headers/constr_CHOICE.h | 41 +- e2ap/headers/constr_SEQUENCE.h | 29 +- e2ap/headers/constr_SEQUENCE_OF.h | 48 +- e2ap/headers/constr_SET_OF.h | 55 +- e2ap/headers/constr_TYPE.h | 67 +- e2ap/headers/constraints.h | 1 + e2ap/headers/jer_encoder.h | 86 + e2ap/headers/per_decoder.h | 52 - e2ap/headers/per_encoder.h | 73 +- e2ap/headers/per_opentype.h | 34 +- e2ap/headers/per_support.h | 77 +- e2ap/headers/uper_decoder.h | 47 + e2ap/headers/uper_encoder.h | 62 + e2ap/headers/uper_opentype.h | 34 + e2ap/headers/uper_support.h | 77 + e2ap/headers/xer_encoder.h | 2 +- e2ap/headers/xer_support.h | 4 +- e2sm/lib/GNB-CU-CP-Name.c => e2ap/lib/AMFName.c | 58 +- e2ap/lib/ANY.c | 500 +- e2ap/lib/ANY_aper.c | 190 + e2ap/lib/ANY_ber.c | 116 + e2ap/lib/ANY_jer.c | 17 + e2ap/lib/ANY_uper.c | 108 + e2ap/lib/ANY_xer.c | 22 + e2ap/lib/BIT_STRING.c | 597 +- e2ap/lib/BIT_STRING_jer.c | 60 + e2ap/lib/BIT_STRING_oer.c | 6 - e2ap/lib/BIT_STRING_print.c | 69 + e2ap/lib/BIT_STRING_rfill.c | 124 + e2ap/lib/BIT_STRING_uper.c | 244 + e2ap/lib/BIT_STRING_xer.c | 70 + e2ap/lib/Cause.c | 108 +- e2ap/lib/CauseE2node.c | 68 + e2ap/lib/CauseMisc.c | 18 +- e2ap/lib/CauseProtocol.c | 18 +- e2ap/lib/CauseRIC.c | 76 - e2ap/lib/CauseRICrequest.c | 94 + e2ap/lib/CauseRICservice.c | 22 +- e2ap/lib/CauseTransport.c | 18 +- e2ap/lib/Criticality.c | 18 +- e2ap/lib/CriticalityDiagnostics-IE-Item.c | 44 +- e2ap/lib/CriticalityDiagnostics-IE-List.c | 28 +- e2ap/lib/CriticalityDiagnostics.c | 64 +- e2ap/lib/E2AP-PDU.c | 48 +- e2ap/lib/E2connectionSetupFailed-Item.c | 84 + e2ap/lib/E2connectionSetupFailed-List.c | 73 + e2ap/lib/E2connectionUpdate-Item.c | 84 + e2ap/lib/E2connectionUpdate-List.c | 73 + e2ap/lib/E2connectionUpdate.c | 66 + e2ap/lib/E2connectionUpdateAcknowledge.c | 66 + e2ap/lib/E2connectionUpdateFailure.c | 66 + e2ap/lib/E2connectionUpdateRemove-Item.c | 66 + e2ap/lib/E2connectionUpdateRemove-List.c | 73 + e2ap/lib/E2nodeComponentConfigAddition-Item.c | 102 + e2ap/lib/E2nodeComponentConfigAddition-List.c | 73 + e2ap/lib/E2nodeComponentConfigAdditionAck-Item.c | 102 + e2ap/lib/E2nodeComponentConfigAdditionAck-List.c | 73 + e2ap/lib/E2nodeComponentConfigRemoval-Item.c | 84 + e2ap/lib/E2nodeComponentConfigRemoval-List.c | 73 + e2ap/lib/E2nodeComponentConfigRemovalAck-Item.c | 102 + e2ap/lib/E2nodeComponentConfigRemovalAck-List.c | 73 + e2ap/lib/E2nodeComponentConfigUpdate-Item.c | 102 + e2ap/lib/E2nodeComponentConfigUpdate-List.c | 73 + e2ap/lib/E2nodeComponentConfigUpdateAck-Item.c | 102 + e2ap/lib/E2nodeComponentConfigUpdateAck-List.c | 73 + e2ap/lib/E2nodeComponentConfiguration.c | 84 + e2ap/lib/E2nodeComponentConfigurationAck.c | 150 + e2ap/lib/E2nodeComponentID.c | 190 + e2ap/lib/E2nodeComponentInterfaceE1.c | 66 + e2ap/lib/E2nodeComponentInterfaceF1.c | 66 + e2ap/lib/E2nodeComponentInterfaceNG.c | 66 + e2ap/lib/E2nodeComponentInterfaceS1.c | 66 + e2ap/lib/E2nodeComponentInterfaceType.c | 80 + e2ap/lib/E2nodeComponentInterfaceW1.c | 66 + e2ap/lib/E2nodeComponentInterfaceX2.c | 88 + e2ap/lib/E2nodeComponentInterfaceXn.c | 66 + e2ap/lib/E2nodeConfigurationUpdate.c | 66 + e2ap/lib/E2nodeConfigurationUpdateAcknowledge.c | 66 + e2ap/lib/E2nodeConfigurationUpdateFailure.c | 66 + e2ap/lib/E2nodeTNLassociationRemoval-Item.c | 84 + e2ap/lib/E2nodeTNLassociationRemoval-List.c | 73 + e2ap/lib/E2setupFailure.c | 30 +- e2ap/lib/E2setupRequest.c | 30 +- e2ap/lib/E2setupResponse.c | 30 +- e2ap/lib/ENB-ID-Choice.c | 66 +- e2ap/lib/ENB-ID.c | 82 +- e2ap/lib/ENGNB-ID.c | 34 +- e2ap/lib/EXTERNAL.c | 228 + e2ap/lib/ErrorIndication.c | 30 +- e2ap/lib/GNB-CU-UP-ID.c | 20 +- e2ap/lib/GNB-DU-ID.c | 20 +- e2ap/lib/GNB-ID-Choice.c | 34 +- e2ap/lib/GlobalE2node-ID.c | 58 +- e2ap/lib/GlobalE2node-eNB-ID.c | 24 +- e2ap/lib/GlobalE2node-en-gNB-ID.c | 76 +- e2ap/lib/GlobalE2node-gNB-ID.c | 81 +- e2ap/lib/GlobalE2node-ng-eNB-ID.c | 73 +- e2ap/lib/GlobalENB-ID.c | 34 +- e2ap/lib/GlobalNG-RANNode-ID.c | 95 + e2ap/lib/GlobalRIC-ID.c | 40 +- e2ap/lib/GlobalenGNB-ID.c | 34 +- e2ap/lib/GlobalgNB-ID.c | 34 +- e2ap/lib/GlobalngeNB-ID.c | 34 +- e2ap/lib/GraphicString.c | 91 + e2ap/lib/INTEGER.c | 1365 +- e2ap/lib/INTEGER_aper.c | 308 + e2ap/lib/INTEGER_ber.c | 72 + e2ap/lib/INTEGER_jer.c | 26 + e2ap/lib/INTEGER_oer.c | 5 - e2ap/lib/INTEGER_print.c | 26 + e2ap/lib/INTEGER_rfill.c | 92 + e2ap/lib/INTEGER_uper.c | 236 + e2ap/lib/INTEGER_xer.c | 351 + e2ap/lib/InitiatingMessage.c | 285 +- e2sm/lib/GNB-CU-UP-Name.c => e2ap/lib/MMEname.c | 58 +- e2ap/lib/NGENB-DU-ID.c | 82 + e2ap/lib/NativeEnumerated.c | 419 +- e2ap/lib/NativeEnumerated_aper.c | 157 + e2ap/lib/NativeEnumerated_jer.c | 36 + e2ap/lib/NativeEnumerated_oer.c | 5 - e2ap/lib/NativeEnumerated_uper.c | 135 + e2ap/lib/NativeEnumerated_xer.c | 36 + e2ap/lib/NativeInteger.c | 538 +- e2ap/lib/NativeInteger_aper.c | 69 + e2ap/lib/NativeInteger_ber.c | 130 + e2ap/lib/NativeInteger_jer.c | 32 + e2ap/lib/NativeInteger_oer.c | 5 - e2ap/lib/NativeInteger_print.c | 43 + e2ap/lib/NativeInteger_rfill.c | 83 + e2ap/lib/NativeInteger_uper.c | 70 + e2ap/lib/NativeInteger_xer.c | 78 + e2ap/lib/OBJECT_IDENTIFIER.c | 532 + e2ap/lib/OBJECT_IDENTIFIER_jer.c | 28 + e2ap/lib/OBJECT_IDENTIFIER_print.c | 30 + e2ap/lib/OBJECT_IDENTIFIER_rfill.c | 73 + e2ap/lib/OBJECT_IDENTIFIER_xer.c | 80 + e2ap/lib/OCTET_STRING.c | 2458 +- e2ap/lib/OCTET_STRING_aper.c | 414 + e2ap/lib/OCTET_STRING_ber.c | 525 + e2ap/lib/OCTET_STRING_jer.c | 148 + e2ap/lib/OCTET_STRING_oer.c | 5 - e2ap/lib/OCTET_STRING_print.c | 65 + e2ap/lib/OCTET_STRING_rfill.c | 209 + e2ap/lib/OCTET_STRING_uper.c | 319 + e2ap/lib/OCTET_STRING_xer.c | 627 + e2ap/lib/OPEN_TYPE.c | 548 +- e2ap/lib/OPEN_TYPE_aper.c | 173 + e2ap/lib/OPEN_TYPE_ber.c | 90 + e2ap/lib/OPEN_TYPE_oer.c | 1 - e2ap/lib/OPEN_TYPE_uper.c | 119 + e2ap/lib/OPEN_TYPE_xer.c | 166 + e2ap/lib/ObjectDescriptor.c | 91 + e2ap/lib/PLMN-Identity.c | 20 +- e2ap/lib/Presence.c | 18 +- e2ap/lib/PrintableString.c | 165 + e2ap/lib/ProcedureCode.c | 20 +- e2ap/lib/ProtocolIE-Container.c | 1565 +- e2ap/lib/ProtocolIE-ContainerList.c | 4 +- e2ap/lib/ProtocolIE-ContainerPair.c | 4 +- e2ap/lib/ProtocolIE-ContainerPairList.c | 4 +- e2ap/lib/ProtocolIE-Field.c | 13292 +- e2ap/lib/ProtocolIE-FieldPair.c | 4 +- e2ap/lib/ProtocolIE-ID.c | 20 +- e2ap/lib/ProtocolIE-SingleContainer.c | 513 +- e2ap/lib/RANfunction-Item.c | 70 +- e2ap/lib/RANfunctionDefinition.c | 14 +- e2ap/lib/RANfunctionID-Item.c | 34 +- e2ap/lib/RANfunctionID.c | 20 +- e2ap/lib/RANfunctionIDcause-Item.c | 34 +- .../lib/RANfunctionOID.c | 60 +- e2ap/lib/RANfunctionRevision.c | 20 +- e2ap/lib/RANfunctions-List.c | 34 +- e2ap/lib/RANfunctionsID-List.c | 34 +- e2ap/lib/RANfunctionsIDcause-List.c | 34 +- e2ap/lib/RICaction-Admitted-Item.c | 24 +- e2ap/lib/RICaction-Admitted-List.c | 30 +- e2ap/lib/RICaction-NotAdmitted-Item.c | 34 +- e2ap/lib/RICaction-NotAdmitted-List.c | 30 +- e2ap/lib/RICaction-ToBeSetup-Item.c | 54 +- e2ap/lib/RICactionDefinition.c | 14 +- e2ap/lib/RICactionID.c | 20 +- e2ap/lib/RICactionType.c | 18 +- e2ap/lib/RICactions-ToBeSetup-List.c | 30 +- e2ap/lib/RICcallProcessID.c | 14 +- e2ap/lib/RICcontrolAckRequest.c | 28 +- e2ap/lib/RICcontrolAcknowledge.c | 30 +- e2ap/lib/RICcontrolFailure.c | 30 +- e2ap/lib/RICcontrolHeader.c | 14 +- e2ap/lib/RICcontrolMessage.c | 14 +- e2ap/lib/RICcontrolOutcome.c | 14 +- e2ap/lib/RICcontrolRequest.c | 30 +- e2ap/lib/RICcontrolStatus.c | 60 - e2ap/lib/RICeventTriggerDefinition.c | 14 +- e2ap/lib/RICindication.c | 30 +- e2ap/lib/RICindicationHeader.c | 14 +- e2ap/lib/RICindicationMessage.c | 14 +- e2ap/lib/RICindicationSN.c | 20 +- e2ap/lib/RICindicationType.c | 18 +- e2ap/lib/RICrequestID.c | 46 +- e2ap/lib/RICserviceQuery.c | 30 +- e2ap/lib/RICserviceUpdate.c | 30 +- e2ap/lib/RICserviceUpdateAcknowledge.c | 30 +- e2ap/lib/RICserviceUpdateFailure.c | 30 +- e2ap/lib/RICsubscription-List-withCause.c | 73 + e2ap/lib/RICsubscription-withCause-Item.c | 102 + e2ap/lib/RICsubscriptionDeleteFailure.c | 30 +- e2ap/lib/RICsubscriptionDeleteRequest.c | 30 +- e2ap/lib/RICsubscriptionDeleteRequired.c | 66 + e2ap/lib/RICsubscriptionDeleteResponse.c | 30 +- e2ap/lib/RICsubscriptionDetails.c | 34 +- e2ap/lib/RICsubscriptionFailure.c | 30 +- e2ap/lib/RICsubscriptionRequest.c | 30 +- e2ap/lib/RICsubscriptionResponse.c | 30 +- e2ap/lib/RICsubsequentAction.c | 34 +- e2ap/lib/RICsubsequentActionType.c | 18 +- e2ap/lib/RICtimeToWait.c | 94 +- e2ap/lib/ResetRequest.c | 30 +- e2ap/lib/ResetResponse.c | 30 +- e2ap/lib/SuccessfulOutcome.c | 231 +- e2ap/lib/TNLinformation.c | 172 + e2ap/lib/TNLusage.c | 72 + e2ap/lib/TimeToWait.c | 18 +- e2ap/lib/TransactionID.c | 76 + e2ap/lib/TriggeringMessage.c | 18 +- e2ap/lib/TypeOfError.c | 18 +- e2ap/lib/UnsuccessfulOutcome.c | 219 +- e2ap/lib/aper_decoder.c | 91 + e2ap/lib/aper_encoder.c | 129 + e2ap/lib/aper_opentype.c | 149 + e2ap/lib/aper_support.c | 239 + e2ap/lib/asn_application.c | 151 +- e2ap/lib/asn_codecs_prim.c | 286 - e2ap/lib/asn_codecs_prim_ber.c | 115 + e2ap/lib/asn_codecs_prim_xer.c | 184 + e2ap/lib/asn_internal.c | 2 +- e2ap/lib/asn_random_fill.c | 16 +- e2ap/lib/ber_tlv_tag.c | 2 +- e2ap/lib/constr_CHOICE.c | 1345 +- e2ap/lib/constr_CHOICE_aper.c | 181 + e2ap/lib/constr_CHOICE_ber.c | 447 + e2ap/lib/constr_CHOICE_jer.c | 79 + e2ap/lib/constr_CHOICE_oer.c | 7 +- e2ap/lib/constr_CHOICE_print.c | 48 + e2ap/lib/constr_CHOICE_rfill.c | 60 + e2ap/lib/constr_CHOICE_uper.c | 191 + e2ap/lib/constr_CHOICE_xer.c | 316 + e2ap/lib/constr_SEQUENCE.c | 1988 +- e2ap/lib/constr_SEQUENCE_OF.c | 376 +- e2ap/lib/constr_SEQUENCE_OF_aper.c | 88 + e2ap/lib/constr_SEQUENCE_OF_ber.c | 88 + e2ap/lib/constr_SEQUENCE_OF_jer.c | 65 + e2ap/lib/constr_SEQUENCE_OF_uper.c | 92 + e2ap/lib/constr_SEQUENCE_OF_xer.c | 60 + e2ap/lib/constr_SEQUENCE_aper.c | 457 + e2ap/lib/constr_SEQUENCE_ber.c | 612 + e2ap/lib/constr_SEQUENCE_jer.c | 84 + e2ap/lib/constr_SEQUENCE_oer.c | 8 +- e2ap/lib/constr_SEQUENCE_print.c | 55 + e2ap/lib/constr_SEQUENCE_rfill.c | 74 + e2ap/lib/constr_SEQUENCE_uper.c | 429 + e2ap/lib/constr_SEQUENCE_xer.c | 348 + e2ap/lib/constr_SET_OF.c | 1218 +- e2ap/lib/constr_SET_OF_aper.c | 186 + e2ap/lib/constr_SET_OF_ber.c | 355 + e2ap/lib/constr_SET_OF_jer.c | 144 + e2ap/lib/constr_SET_OF_oer.c | 16 +- e2ap/lib/constr_SET_OF_print.c | 39 + e2ap/lib/constr_SET_OF_rfill.c | 152 + e2ap/lib/constr_SET_OF_uper.c | 201 + e2ap/lib/constr_SET_OF_xer.c | 314 + e2ap/lib/constr_TYPE.c | 2 +- e2ap/lib/constraints.c | 1 + e2ap/lib/jer_encoder.c | 69 + e2ap/lib/per_decoder.c | 182 +- e2ap/lib/per_encoder.c | 234 +- e2ap/lib/per_opentype.c | 507 +- e2ap/lib/per_support.c | 482 +- e2ap/lib/uper_decoder.c | 96 + e2ap/lib/uper_encoder.c | 127 + e2ap/lib/uper_opentype.c | 372 + e2ap/lib/uper_support.c | 311 + e2ap/lib/xer_decoder.c | 2 +- e2ap/wrapper.h | 18 +- e2sm/asn1/Makefile.am.libasncodec | 480 + e2sm/asn1/e2sm2_0.asn | 541 + e2sm/asn1/kpm2_0.asn | 327 + e2sm/headers/AMF-UE-NGAP-ID.h | 7 +- e2sm/headers/AMFPointer.h | 7 +- e2sm/headers/AMFRegionID.h | 7 +- e2sm/headers/AMFSetID.h | 7 +- e2sm/headers/ANY.h | 45 +- e2sm/headers/BIT_STRING.h | 45 +- e2sm/headers/BMPString.h | 39 - e2sm/headers/BOOLEAN.h | 35 +- e2sm/headers/C-RNTI.h | 46 - e2sm/headers/CGI.h | 4 +- .../CU-CP-Usage-Report-CellResourceReportItem.h | 55 - e2sm/headers/CU-CP-Usage-Report-Per-UE.h | 53 - .../CU-CP-Usage-Report-UeResourceReportItem.h | 47 - .../CU-UP-Usage-Report-CellResourceReportItem.h | 55 - e2sm/headers/CU-UP-Usage-Report-Per-UE.h | 53 - .../CU-UP-Usage-Report-UeResourceReportItem.h | 47 - e2sm/headers/CUUPMeasurement-Container.h | 53 - e2sm/headers/CellResourceReportListItem.h | 58 - e2sm/headers/CoreCPID.h | 4 +- .../DU-Usage-Report-CellResourceReportItem.h | 55 - e2sm/headers/DU-Usage-Report-Per-UE.h | 53 - .../headers/DU-Usage-Report-UeResourceReportItem.h | 47 - e2sm/headers/E-UTRA-ARFCN.h | 7 +- e2sm/headers/E-UTRA-PCI.h | 7 +- e2sm/headers/E-UTRA-TAC.h | 7 +- e2sm/headers/E2SM-KPM-ActionDefinition-Format1.h | 4 +- e2sm/headers/E2SM-KPM-ActionDefinition-Format2.h | 4 +- e2sm/headers/E2SM-KPM-ActionDefinition-Format3.h | 4 +- e2sm/headers/E2SM-KPM-ActionDefinition.h | 6 +- .../E2SM-KPM-EventTriggerDefinition-Format1.h | 4 +- e2sm/headers/E2SM-KPM-EventTriggerDefinition.h | 4 +- e2sm/headers/E2SM-KPM-IndicationHeader-Format1.h | 4 +- e2sm/headers/E2SM-KPM-IndicationHeader.h | 4 +- e2sm/headers/E2SM-KPM-IndicationMessage-Format1.h | 4 +- e2sm/headers/E2SM-KPM-IndicationMessage-Format2.h | 4 +- e2sm/headers/E2SM-KPM-IndicationMessage.h | 4 +- e2sm/headers/E2SM-KPM-RANfunction-Description.h | 4 +- e2sm/headers/EN-GNB-ID.h | 4 +- e2sm/headers/ENB-ID-Choice.h | 60 - e2sm/headers/ENB-ID.h | 4 +- e2sm/headers/ENB-UE-X2AP-ID-Extension.h | 7 +- e2sm/headers/ENB-UE-X2AP-ID.h | 7 +- e2sm/headers/ENGNB-ID.h | 56 - e2sm/headers/ENUMERATED.h | 40 - e2sm/headers/EPC-CUUP-PM-Format.h | 53 - e2sm/headers/EPC-DU-PM-Container.h | 53 - e2sm/headers/EUTRA-CGI.h | 4 +- e2sm/headers/EUTRACellIdentity.h | 7 +- e2sm/headers/EXTERNAL.h | 65 + e2sm/headers/FGC-CUUP-PM-Format.h | 53 - e2sm/headers/FGC-DU-PM-Container.h | 53 - e2sm/headers/FQIPERSlicesPerPlmnListItem.h | 47 - e2sm/headers/FQIPERSlicesPerPlmnPerCellListItem.h | 46 - e2sm/headers/FiveGS-TAC.h | 7 +- e2sm/headers/FiveQI.h | 7 +- e2sm/headers/FreqBandNrItem.h | 6 +- e2sm/headers/GNB-CU-CP-Name.h | 46 - e2sm/headers/GNB-CU-CP-UE-E1AP-ID.h | 7 +- e2sm/headers/GNB-CU-UE-F1AP-ID.h | 7 +- e2sm/headers/GNB-CU-UP-ID.h | 7 +- e2sm/headers/GNB-CU-UP-Name.h | 46 - e2sm/headers/GNB-DU-ID.h | 7 +- e2sm/headers/GNB-DU-Name.h | 46 - e2sm/headers/GNB-ID-Choice.h | 56 - e2sm/headers/GNB-ID.h | 4 +- e2sm/headers/GNB-Name.h | 62 - e2sm/headers/GUAMI.h | 4 +- e2sm/headers/GUMMEI.h | 4 +- e2sm/headers/GeneralString.h | 36 - e2sm/headers/GeneralizedTime.h | 80 - e2sm/headers/GlobalENB-ID.h | 4 +- e2sm/headers/GlobalGNB-ID.h | 4 +- e2sm/headers/GlobalKPMnode-ID.h | 67 - e2sm/headers/GlobalKPMnode-eNB-ID.h | 44 - e2sm/headers/GlobalKPMnode-en-gNB-ID.h | 44 - e2sm/headers/GlobalKPMnode-gNB-ID.h | 48 - e2sm/headers/GlobalKPMnode-ng-eNB-ID.h | 44 - e2sm/headers/GlobalNGRANNodeID.h | 61 - e2sm/headers/GlobalNgENB-ID.h | 4 +- e2sm/headers/GlobalRANNodeID.h | 61 + e2sm/headers/GlobalenGNB-ID.h | 4 +- e2sm/headers/GlobalgNB-ID.h | 46 - e2sm/headers/GlobalngeNB-ID.h | 46 - e2sm/headers/GranularityPeriod.h | 7 +- e2sm/headers/GraphicString.h | 44 +- e2sm/headers/GroupID.h | 4 +- e2sm/headers/IA5String.h | 40 - e2sm/headers/INTEGER.h | 43 +- e2sm/headers/ISO646String.h | 37 - e2sm/headers/IndexToRFSP.h | 7 +- e2sm/headers/Interface-MessageID.h | 4 +- e2sm/headers/InterfaceID-E1.h | 8 +- e2sm/headers/InterfaceID-F1.h | 8 +- e2sm/headers/InterfaceID-NG.h | 4 +- e2sm/headers/InterfaceID-S1.h | 4 +- e2sm/headers/InterfaceID-W1.h | 4 +- e2sm/headers/InterfaceID-X2.h | 4 +- e2sm/headers/InterfaceID-Xn.h | 8 +- e2sm/headers/InterfaceIdentifier.h | 4 +- e2sm/headers/InterfaceType.h | 7 +- e2sm/headers/LabelInfoItem.h | 4 +- e2sm/headers/LabelInfoList.h | 4 +- e2sm/headers/MME-Code.h | 7 +- e2sm/headers/MME-Group-ID.h | 7 +- e2sm/headers/MME-UE-S1AP-ID.h | 7 +- e2sm/headers/MatchingCondItem.h | 4 +- e2sm/headers/MatchingCondList.h | 4 +- e2sm/headers/MatchingUEidItem.h | 4 +- e2sm/headers/MatchingUEidList.h | 4 +- e2sm/headers/MeasurementCondItem.h | 4 +- e2sm/headers/MeasurementCondList.h | 4 +- e2sm/headers/MeasurementCondUEidItem.h | 4 +- e2sm/headers/MeasurementCondUEidList.h | 4 +- e2sm/headers/MeasurementData.h | 4 +- e2sm/headers/MeasurementDataItem.h | 4 +- e2sm/headers/MeasurementInfo-Action-Item.h | 4 +- e2sm/headers/MeasurementInfo-Action-List.h | 4 +- e2sm/headers/MeasurementInfoItem.h | 4 +- e2sm/headers/MeasurementInfoList.h | 4 +- e2sm/headers/MeasurementLabel.h | 4 +- e2sm/headers/MeasurementRecord.h | 4 +- e2sm/headers/MeasurementRecordItem.h | 4 +- e2sm/headers/MeasurementType.h | 4 +- e2sm/headers/MeasurementTypeID.h | 7 +- e2sm/headers/MeasurementTypeName.h | 7 +- e2sm/headers/NG-RANnodeUEXnAPID.h | 7 +- e2sm/headers/NGENB-CU-UE-W1AP-ID.h | 7 +- e2sm/headers/NGENB-DU-ID.h | 7 +- e2sm/headers/NI-Type.h | 57 - e2sm/headers/NR-ARFCN.h | 17 +- e2sm/headers/NR-CGI.h | 4 +- e2sm/headers/NR-PCI.h | 7 +- e2sm/headers/NRCGI.h | 42 - e2sm/headers/NRCellIdentity.h | 7 +- e2sm/headers/NRFrequencyBand-List.h | 44 - e2sm/headers/NRFrequencyBandItem.h | 46 - e2sm/headers/NRFrequencyInfo.h | 46 - e2sm/headers/NRFrequencyShift7p5khz.h | 54 - e2sm/headers/NULL.h | 38 +- e2sm/headers/NativeEnumerated.h | 45 +- e2sm/headers/NativeInteger.h | 31 +- e2sm/headers/NativeReal.h | 43 +- e2sm/headers/NgENB-ID.h | 4 +- e2sm/headers/NumericString.h | 37 - e2sm/headers/OBJECT_IDENTIFIER.h | 52 +- e2sm/headers/OCTET_STRING.h | 77 +- e2sm/headers/OCUCP-PF-Container.h | 47 - e2sm/headers/OCUUP-PF-Container.h | 55 - e2sm/headers/ODU-PF-Container.h | 53 - e2sm/headers/OPEN_TYPE.h | 118 +- e2sm/headers/ObjectDescriptor.h | 41 +- e2sm/headers/PF-Container.h | 64 - e2sm/headers/PF-ContainerListItem.h | 46 - e2sm/headers/PLMN-Identity.h | 46 - e2sm/headers/PLMNIdentity.h | 7 +- e2sm/headers/PM-Containers-List.h | 48 - e2sm/headers/PerQCIReportListItem.h | 46 - e2sm/headers/PerQCIReportListItemFormat.h | 47 - e2sm/headers/PlmnID-List.h | 50 - e2sm/headers/PrintableString.h | 41 +- e2sm/headers/QCI.h | 7 +- e2sm/headers/QoSID.h | 4 +- e2sm/headers/QosFlowIdentifier.h | 7 +- e2sm/headers/RAN-Container.h | 75 - e2sm/headers/RANUEID.h | 7 +- e2sm/headers/RANcallProcess-ID-string.h | 45 - e2sm/headers/RANfunction-Name.h | 4 +- e2sm/headers/REAL.h | 71 +- e2sm/headers/RELATIVE-OID.h | 53 - e2sm/headers/RIC-EventTriggerStyle-Item.h | 4 +- e2sm/headers/RIC-EventTriggerStyle-List.h | 48 - e2sm/headers/RIC-Format-Type.h | 7 +- e2sm/headers/RIC-ReportStyle-Item.h | 4 +- e2sm/headers/RIC-ReportStyle-List.h | 49 - e2sm/headers/RIC-Style-Name.h | 7 +- e2sm/headers/RIC-Style-Type.h | 7 +- e2sm/headers/RRC-MessageID.h | 4 +- e2sm/headers/RRCclass-LTE.h | 7 +- e2sm/headers/RRCclass-NR.h | 7 +- e2sm/headers/RT-Period-IE.h | 74 - e2sm/headers/S-NSSAI.h | 4 +- e2sm/headers/SD.h | 7 +- e2sm/headers/SNSSAI.h | 41 - e2sm/headers/SST.h | 7 +- e2sm/headers/ServedPlmnPerCellListItem.h | 50 - e2sm/headers/ServingCell-ARFCN.h | 4 +- e2sm/headers/ServingCell-PCI.h | 4 +- e2sm/headers/SlicePerPlmnPerCellListItem.h | 55 - e2sm/headers/SliceToReportListItem.h | 55 - e2sm/headers/SubscriberProfileIDforRFP.h | 7 +- e2sm/headers/SupportedSULBandList.h | 44 - e2sm/headers/SupportedSULFreqBandItem.h | 44 - e2sm/headers/T61String.h | 36 - e2sm/headers/TeletexString.h | 36 - e2sm/headers/TestCond-Expression.h | 7 +- e2sm/headers/TestCond-Type.h | 4 +- e2sm/headers/TestCond-Value.h | 4 +- e2sm/headers/TestCondInfo.h | 4 +- e2sm/headers/TimeStamp.h | 7 +- e2sm/headers/Timestamp.h | 45 - e2sm/headers/Trigger-ConditionIE-Item.h | 44 - e2sm/headers/UE-Report-Type.h | 57 - e2sm/headers/UEID-EN-GNB.h | 4 +- e2sm/headers/UEID-ENB.h | 4 +- e2sm/headers/UEID-GNB-CU-CP-E1AP-ID-Item.h | 4 +- e2sm/headers/UEID-GNB-CU-CP-E1AP-ID-List.h | 4 +- e2sm/headers/UEID-GNB-CU-CP-F1AP-ID-Item.h | 4 +- e2sm/headers/UEID-GNB-CU-F1AP-ID-List.h | 4 +- e2sm/headers/UEID-GNB-CU-UP.h | 4 +- e2sm/headers/UEID-GNB-DU.h | 4 +- e2sm/headers/UEID-GNB.h | 8 +- e2sm/headers/UEID-NG-ENB-DU.h | 4 +- e2sm/headers/UEID-NG-ENB.h | 8 +- e2sm/headers/UEID.h | 4 +- e2sm/headers/UTCTime.h | 50 - e2sm/headers/UTF8String.h | 63 - e2sm/headers/UniversalString.h | 38 - e2sm/headers/VideotexString.h | 36 - e2sm/headers/VisibleString.h | 38 - e2sm/headers/aper_decoder.h | 47 + e2sm/headers/aper_encoder.h | 63 + e2sm/headers/aper_opentype.h | 30 + e2sm/headers/aper_support.h | 63 + e2sm/headers/asn_application.h | 4 +- e2sm/headers/asn_bit_data.h | 2 +- e2sm/headers/asn_codecs_prim.h | 21 +- e2sm/headers/asn_config.h | 2 + e2sm/headers/asn_constant.h | 30 + e2sm/headers/asn_internal.h | 46 +- e2sm/headers/asn_system.h | 21 +- e2sm/headers/constr_CHOICE.h | 41 +- e2sm/headers/constr_SEQUENCE.h | 29 +- e2sm/headers/constr_SEQUENCE_OF.h | 48 +- e2sm/headers/constr_SET.h | 87 - e2sm/headers/constr_SET_OF.h | 55 +- e2sm/headers/constr_TYPE.h | 67 +- e2sm/headers/constraints.h | 1 + e2sm/headers/jer_encoder.h | 86 + e2sm/headers/per_decoder.h | 52 - e2sm/headers/per_encoder.h | 73 +- e2sm/headers/per_opentype.h | 34 +- e2sm/headers/per_support.h | 77 +- e2sm/headers/uper_decoder.h | 47 + e2sm/headers/uper_encoder.h | 62 + e2sm/headers/uper_opentype.h | 34 + e2sm/headers/uper_support.h | 77 + e2sm/headers/xer_encoder.h | 2 +- e2sm/headers/xer_support.h | 4 +- e2sm/lib/AMF-UE-NGAP-ID.c | 23 +- e2sm/lib/AMFPointer.c | 23 +- e2sm/lib/AMFRegionID.c | 23 +- e2sm/lib/AMFSetID.c | 23 +- e2sm/lib/ANY.c | 500 +- e2sm/lib/ANY_aper.c | 190 + e2sm/lib/ANY_ber.c | 116 + e2sm/lib/ANY_jer.c | 17 + e2sm/lib/ANY_uper.c | 108 + e2sm/lib/ANY_xer.c | 22 + e2sm/lib/BIT_STRING.c | 597 +- e2sm/lib/BIT_STRING_jer.c | 60 + e2sm/lib/BIT_STRING_oer.c | 6 - e2sm/lib/BIT_STRING_print.c | 69 + e2sm/lib/BIT_STRING_rfill.c | 124 + e2sm/lib/BIT_STRING_uper.c | 244 + e2sm/lib/BIT_STRING_xer.c | 70 + e2sm/lib/BMPString.c | 233 - e2sm/lib/BOOLEAN.c | 504 +- e2sm/lib/BOOLEAN_aper.c | 61 + e2sm/lib/BOOLEAN_ber.c | 104 + e2sm/lib/BOOLEAN_jer.c | 32 + e2sm/lib/BOOLEAN_oer.c | 54 + e2sm/lib/BOOLEAN_print.c | 33 + e2sm/lib/BOOLEAN_rfill.c | 56 + e2sm/lib/BOOLEAN_uper.c | 58 + e2sm/lib/BOOLEAN_xer.c | 74 + e2sm/lib/C-RNTI.c | 65 - e2sm/lib/CGI.c | 41 +- .../CU-CP-Usage-Report-CellResourceReportItem.c | 140 - e2sm/lib/CU-CP-Usage-Report-Per-UE.c | 130 - e2sm/lib/CU-CP-Usage-Report-UeResourceReportItem.c | 72 - .../CU-UP-Usage-Report-CellResourceReportItem.c | 140 - e2sm/lib/CU-UP-Usage-Report-Per-UE.c | 130 - e2sm/lib/CU-UP-Usage-Report-UeResourceReportItem.c | 150 - e2sm/lib/CUUPMeasurement-Container.c | 130 - e2sm/lib/CellResourceReportListItem.c | 228 - e2sm/lib/CoreCPID.c | 41 +- e2sm/lib/DU-Usage-Report-CellResourceReportItem.c | 140 - e2sm/lib/DU-Usage-Report-Per-UE.c | 130 - e2sm/lib/DU-Usage-Report-UeResourceReportItem.c | 138 - e2sm/lib/E-UTRA-ARFCN.c | 23 +- e2sm/lib/E-UTRA-PCI.c | 23 +- e2sm/lib/E-UTRA-TAC.c | 23 +- e2sm/lib/E2SM-KPM-ActionDefinition-Format1.c | 44 +- e2sm/lib/E2SM-KPM-ActionDefinition-Format2.c | 34 +- e2sm/lib/E2SM-KPM-ActionDefinition-Format3.c | 44 +- e2sm/lib/E2SM-KPM-ActionDefinition.c | 81 +- e2sm/lib/E2SM-KPM-EventTriggerDefinition-Format1.c | 52 +- e2sm/lib/E2SM-KPM-EventTriggerDefinition.c | 51 +- e2sm/lib/E2SM-KPM-IndicationHeader-Format1.c | 100 +- e2sm/lib/E2SM-KPM-IndicationHeader.c | 51 +- e2sm/lib/E2SM-KPM-IndicationMessage-Format1.c | 44 +- e2sm/lib/E2SM-KPM-IndicationMessage-Format2.c | 44 +- e2sm/lib/E2SM-KPM-IndicationMessage.c | 61 +- e2sm/lib/E2SM-KPM-RANfunction-Description.c | 120 +- e2sm/lib/EN-GNB-ID.c | 40 +- e2sm/lib/ENB-ID-Choice.c | 192 - e2sm/lib/ENB-ID.c | 97 +- e2sm/lib/ENB-UE-X2AP-ID-Extension.c | 23 +- e2sm/lib/ENB-UE-X2AP-ID.c | 23 +- e2sm/lib/ENGNB-ID.c | 94 - e2sm/lib/ENUMERATED.c | 180 - e2sm/lib/EPC-CUUP-PM-Format.c | 130 - e2sm/lib/EPC-DU-PM-Container.c | 130 - e2sm/lib/EUTRA-CGI.c | 34 +- e2sm/lib/EUTRACellIdentity.c | 23 +- e2sm/lib/EXTERNAL.c | 228 + e2sm/lib/FGC-CUUP-PM-Format.c | 130 - e2sm/lib/FGC-DU-PM-Container.c | 130 - e2sm/lib/FQIPERSlicesPerPlmnListItem.c | 183 - e2sm/lib/FQIPERSlicesPerPlmnPerCellListItem.c | 171 - e2sm/lib/FiveGS-TAC.c | 23 +- e2sm/lib/FiveQI.c | 23 +- e2sm/lib/FreqBandNrItem.c | 37 +- e2sm/lib/GNB-CU-CP-UE-E1AP-ID.c | 21 +- e2sm/lib/GNB-CU-UE-F1AP-ID.c | 21 +- e2sm/lib/GNB-CU-UP-ID.c | 23 +- e2sm/lib/GNB-DU-ID.c | 23 +- e2sm/lib/GNB-DU-Name.c | 109 - e2sm/lib/GNB-ID-Choice.c | 94 - e2sm/lib/GNB-ID.c | 40 +- e2sm/lib/GNB-Name.c | 75 - e2sm/lib/GUAMI.c | 54 +- e2sm/lib/GUMMEI.c | 44 +- e2sm/lib/GeneralString.c | 58 - e2sm/lib/GeneralizedTime.c | 833 - e2sm/lib/GlobalENB-ID.c | 34 +- e2sm/lib/GlobalGNB-ID.c | 34 +- e2sm/lib/GlobalKPMnode-ID.c | 89 - e2sm/lib/GlobalKPMnode-eNB-ID.c | 50 - e2sm/lib/GlobalKPMnode-en-gNB-ID.c | 50 - e2sm/lib/GlobalKPMnode-gNB-ID.c | 72 - e2sm/lib/GlobalKPMnode-ng-eNB-ID.c | 50 - e2sm/lib/GlobalNGRANNodeID.c | 64 - e2sm/lib/GlobalNgENB-ID.c | 34 +- e2sm/lib/GlobalRANNodeID.c | 95 + e2sm/lib/GlobalenGNB-ID.c | 34 +- e2sm/lib/GlobalgNB-ID.c | 60 - e2sm/lib/GlobalngeNB-ID.c | 60 - e2sm/lib/GranularityPeriod.c | 23 +- e2sm/lib/GraphicString.c | 117 +- e2sm/lib/GroupID.c | 41 +- e2sm/lib/IA5String.c | 97 - e2sm/lib/INTEGER.c | 1365 +- e2sm/lib/INTEGER_aper.c | 308 + e2sm/lib/INTEGER_ber.c | 72 + e2sm/lib/INTEGER_jer.c | 26 + e2sm/lib/INTEGER_oer.c | 5 - e2sm/lib/INTEGER_print.c | 26 + e2sm/lib/INTEGER_rfill.c | 92 + e2sm/lib/INTEGER_uper.c | 236 + e2sm/lib/INTEGER_xer.c | 351 + e2sm/lib/ISO646String.c | 62 - e2sm/lib/IndexToRFSP.c | 23 +- e2sm/lib/Interface-MessageID.c | 51 +- e2sm/lib/InterfaceID-E1.c | 44 +- e2sm/lib/InterfaceID-F1.c | 44 +- e2sm/lib/InterfaceID-NG.c | 24 +- e2sm/lib/InterfaceID-S1.c | 24 +- e2sm/lib/InterfaceID-W1.c | 34 +- e2sm/lib/InterfaceID-X2.c | 61 +- e2sm/lib/InterfaceID-Xn.c | 26 +- e2sm/lib/InterfaceIdentifier.c | 91 +- e2sm/lib/InterfaceType.c | 21 +- e2sm/lib/LabelInfoItem.c | 24 +- e2sm/lib/LabelInfoList.c | 31 +- e2sm/lib/MME-Code.c | 23 +- e2sm/lib/MME-Group-ID.c | 23 +- e2sm/lib/MME-UE-S1AP-ID.c | 21 +- e2sm/lib/MatchingCondItem.c | 41 +- e2sm/lib/MatchingCondList.c | 31 +- e2sm/lib/MatchingUEidItem.c | 24 +- e2sm/lib/MatchingUEidList.c | 31 +- e2sm/lib/MeasurementCondItem.c | 34 +- e2sm/lib/MeasurementCondList.c | 31 +- e2sm/lib/MeasurementCondUEidItem.c | 44 +- e2sm/lib/MeasurementCondUEidList.c | 31 +- e2sm/lib/MeasurementData.c | 31 +- e2sm/lib/MeasurementDataItem.c | 51 +- e2sm/lib/MeasurementInfo-Action-Item.c | 34 +- e2sm/lib/MeasurementInfo-Action-List.c | 31 +- e2sm/lib/MeasurementInfoItem.c | 34 +- e2sm/lib/MeasurementInfoList.c | 31 +- e2sm/lib/MeasurementLabel.c | 406 +- e2sm/lib/MeasurementRecord.c | 31 +- e2sm/lib/MeasurementRecordItem.c | 75 +- e2sm/lib/MeasurementType.c | 41 +- e2sm/lib/MeasurementTypeID.c | 23 +- e2sm/lib/MeasurementTypeName.c | 23 +- e2sm/lib/NG-RANnodeUEXnAPID.c | 21 +- e2sm/lib/NGENB-CU-UE-W1AP-ID.c | 21 +- e2sm/lib/NGENB-DU-ID.c | 23 +- e2sm/lib/NI-Type.c | 60 - e2sm/lib/NR-ARFCN.c | 163 +- e2sm/lib/NR-CGI.c | 34 +- e2sm/lib/NR-PCI.c | 23 +- e2sm/lib/NRCGI.c | 60 - e2sm/lib/NRCellIdentity.c | 23 +- e2sm/lib/NRFrequencyBand-List.c | 50 - e2sm/lib/NRFrequencyBandItem.c | 90 - e2sm/lib/NRFrequencyInfo.c | 72 - e2sm/lib/NRFrequencyShift7p5khz.c | 55 - e2sm/lib/NULL.c | 356 +- e2sm/lib/NULL_aper.c | 52 + e2sm/lib/NULL_ber.c | 63 + e2sm/lib/NULL_jer.c | 26 + e2sm/lib/NULL_oer.c | 48 + e2sm/lib/NULL_print.c | 20 + e2sm/lib/NULL_rfill.c | 31 + e2sm/lib/NULL_uper.c | 52 + e2sm/lib/NULL_xer.c | 52 + e2sm/lib/NativeEnumerated.c | 419 +- e2sm/lib/NativeEnumerated_aper.c | 157 + e2sm/lib/NativeEnumerated_jer.c | 36 + e2sm/lib/NativeEnumerated_oer.c | 5 - e2sm/lib/NativeEnumerated_uper.c | 135 + e2sm/lib/NativeEnumerated_xer.c | 36 + e2sm/lib/NativeInteger.c | 538 +- e2sm/lib/NativeInteger_aper.c | 69 + e2sm/lib/NativeInteger_ber.c | 130 + e2sm/lib/NativeInteger_jer.c | 32 + e2sm/lib/NativeInteger_oer.c | 5 - e2sm/lib/NativeInteger_print.c | 43 + e2sm/lib/NativeInteger_rfill.c | 83 + e2sm/lib/NativeInteger_uper.c | 70 + e2sm/lib/NativeInteger_xer.c | 78 + e2sm/lib/NativeReal.c | 709 +- e2sm/lib/NativeReal_aper.c | 74 + e2sm/lib/NativeReal_ber.c | 120 + e2sm/lib/NativeReal_jer.c | 23 + e2sm/lib/NativeReal_oer.c | 228 + e2sm/lib/NativeReal_print.c | 24 + e2sm/lib/NativeReal_rfill.c | 69 + e2sm/lib/NativeReal_uper.c | 73 + e2sm/lib/NativeReal_xer.c | 50 + e2sm/lib/NgENB-ID.c | 78 +- e2sm/lib/NumericString.c | 121 - e2sm/lib/OBJECT_IDENTIFIER.c | 282 +- e2sm/lib/OBJECT_IDENTIFIER_jer.c | 28 + e2sm/lib/OBJECT_IDENTIFIER_print.c | 30 + e2sm/lib/OBJECT_IDENTIFIER_rfill.c | 73 + e2sm/lib/OBJECT_IDENTIFIER_xer.c | 80 + e2sm/lib/OCTET_STRING.c | 2458 +- e2sm/lib/OCTET_STRING_aper.c | 414 + e2sm/lib/OCTET_STRING_ber.c | 525 + e2sm/lib/OCTET_STRING_jer.c | 148 + e2sm/lib/OCTET_STRING_oer.c | 5 - e2sm/lib/OCTET_STRING_print.c | 65 + e2sm/lib/OCTET_STRING_rfill.c | 209 + e2sm/lib/OCTET_STRING_uper.c | 319 + e2sm/lib/OCTET_STRING_xer.c | 627 + e2sm/lib/OCUCP-PF-Container.c | 140 - e2sm/lib/OCUUP-PF-Container.c | 142 - e2sm/lib/ODU-PF-Container.c | 130 - e2sm/lib/OPEN_TYPE.c | 548 +- e2sm/lib/OPEN_TYPE_aper.c | 173 + e2sm/lib/OPEN_TYPE_ber.c | 90 + e2sm/lib/OPEN_TYPE_oer.c | 1 - e2sm/lib/OPEN_TYPE_uper.c | 119 + e2sm/lib/OPEN_TYPE_xer.c | 166 + e2sm/lib/ObjectDescriptor.c | 117 +- e2sm/lib/PF-Container.c | 78 - e2sm/lib/PF-ContainerListItem.c | 60 - e2sm/lib/PLMN-Identity.c | 65 - e2sm/lib/PLMNIdentity.c | 23 +- e2sm/lib/PM-Containers-List.c | 64 - e2sm/lib/PerQCIReportListItem.c | 171 - e2sm/lib/PerQCIReportListItemFormat.c | 183 - e2sm/lib/PlmnID-List.c | 74 - e2sm/lib/PrintableString.c | 131 +- e2sm/lib/QCI.c | 23 +- e2sm/lib/QoSID.c | 41 +- e2sm/lib/QosFlowIdentifier.c | 23 +- e2sm/lib/RAN-Container.c | 130 - e2sm/lib/RANUEID.c | 23 +- e2sm/lib/RANfunction-Name.c | 81 +- e2sm/lib/REAL.c | 462 +- e2sm/lib/REAL_aper.c | 25 + e2sm/lib/REAL_jer.c | 26 + e2sm/lib/REAL_oer.c | 89 + e2sm/lib/REAL_print.c | 27 + e2sm/lib/REAL_rfill.c | 66 + e2sm/lib/REAL_uper.c | 25 + e2sm/lib/REAL_xer.c | 103 + e2sm/lib/RELATIVE-OID.c | 336 - e2sm/lib/RIC-EventTriggerStyle-Item.c | 44 +- e2sm/lib/RIC-EventTriggerStyle-List.c | 70 - e2sm/lib/RIC-Format-Type.c | 14 +- e2sm/lib/RIC-ReportStyle-Item.c | 74 +- e2sm/lib/RIC-ReportStyle-List.c | 80 - e2sm/lib/RIC-Style-Name.c | 23 +- e2sm/lib/RIC-Style-Type.c | 14 +- e2sm/lib/RRC-MessageID.c | 71 +- e2sm/lib/RRCclass-LTE.c | 21 +- e2sm/lib/RRCclass-NR.c | 21 +- e2sm/lib/RT-Period-IE.c | 94 - e2sm/lib/S-NSSAI.c | 34 +- e2sm/lib/SD.c | 23 +- e2sm/lib/SNSSAI.c | 130 - e2sm/lib/SST.c | 23 +- e2sm/lib/ServedPlmnPerCellListItem.c | 74 - e2sm/lib/ServingCell-ARFCN.c | 41 +- e2sm/lib/ServingCell-PCI.c | 41 +- e2sm/lib/SlicePerPlmnPerCellListItem.c | 140 - e2sm/lib/SliceToReportListItem.c | 140 - e2sm/lib/SubscriberProfileIDforRFP.c | 23 +- e2sm/lib/SupportedSULBandList.c | 50 - e2sm/lib/SupportedSULFreqBandItem.c | 80 - e2sm/lib/T61String.c | 58 - e2sm/lib/TeletexString.c | 194 - e2sm/lib/TestCond-Expression.c | 21 +- e2sm/lib/TestCond-Type.c | 183 +- e2sm/lib/TestCond-Value.c | 81 +- e2sm/lib/TestCondInfo.c | 44 +- e2sm/lib/TimeStamp.c | 23 +- e2sm/lib/Timestamp.c | 31 - e2sm/lib/Trigger-ConditionIE-Item.c | 50 - e2sm/lib/UE-Report-Type.c | 60 - e2sm/lib/UEID-EN-GNB.c | 74 +- e2sm/lib/UEID-ENB.c | 64 +- e2sm/lib/UEID-GNB-CU-CP-E1AP-ID-Item.c | 24 +- e2sm/lib/UEID-GNB-CU-CP-E1AP-ID-List.c | 31 +- e2sm/lib/UEID-GNB-CU-CP-F1AP-ID-Item.c | 24 +- e2sm/lib/UEID-GNB-CU-F1AP-ID-List.c | 31 +- e2sm/lib/UEID-GNB-CU-UP.c | 34 +- e2sm/lib/UEID-GNB-DU.c | 34 +- e2sm/lib/UEID-GNB.c | 115 +- e2sm/lib/UEID-NG-ENB-DU.c | 24 +- e2sm/lib/UEID-NG-ENB.c | 91 +- e2sm/lib/UEID.c | 91 +- e2sm/lib/UTCTime.c | 277 - e2sm/lib/UTF8String.c | 294 - e2sm/lib/UniversalString.c | 243 - e2sm/lib/VideotexString.c | 58 - e2sm/lib/VisibleString.c | 99 - e2sm/lib/aper_decoder.c | 91 + e2sm/lib/aper_encoder.c | 129 + e2sm/lib/aper_opentype.c | 149 + e2sm/lib/aper_support.c | 239 + e2sm/lib/asn_application.c | 151 +- e2sm/lib/asn_codecs_prim.c | 286 - e2sm/lib/asn_codecs_prim_ber.c | 115 + e2sm/lib/asn_codecs_prim_xer.c | 184 + e2sm/lib/asn_internal.c | 5 +- e2sm/lib/asn_random_fill.c | 16 +- e2sm/lib/ber_tlv_tag.c | 2 +- e2sm/lib/constr_CHOICE.c | 1345 +- e2sm/lib/constr_CHOICE_aper.c | 181 + e2sm/lib/constr_CHOICE_ber.c | 447 + e2sm/lib/constr_CHOICE_jer.c | 79 + e2sm/lib/constr_CHOICE_oer.c | 7 +- e2sm/lib/constr_CHOICE_print.c | 48 + e2sm/lib/constr_CHOICE_rfill.c | 60 + e2sm/lib/constr_CHOICE_uper.c | 191 + e2sm/lib/constr_CHOICE_xer.c | 316 + e2sm/lib/constr_SEQUENCE.c | 1988 +- e2sm/lib/constr_SEQUENCE_OF.c | 376 +- e2sm/lib/constr_SEQUENCE_OF_aper.c | 88 + e2sm/lib/constr_SEQUENCE_OF_ber.c | 88 + e2sm/lib/constr_SEQUENCE_OF_jer.c | 65 + e2sm/lib/constr_SEQUENCE_OF_uper.c | 92 + e2sm/lib/constr_SEQUENCE_OF_xer.c | 60 + e2sm/lib/constr_SEQUENCE_aper.c | 457 + e2sm/lib/constr_SEQUENCE_ber.c | 612 + e2sm/lib/constr_SEQUENCE_jer.c | 84 + e2sm/lib/constr_SEQUENCE_oer.c | 8 +- e2sm/lib/constr_SEQUENCE_print.c | 55 + e2sm/lib/constr_SEQUENCE_rfill.c | 74 + e2sm/lib/constr_SEQUENCE_uper.c | 429 + e2sm/lib/constr_SEQUENCE_xer.c | 348 + e2sm/lib/constr_SET.c | 1149 - e2sm/lib/constr_SET_OF.c | 1218 +- e2sm/lib/constr_SET_OF_aper.c | 186 + e2sm/lib/constr_SET_OF_ber.c | 355 + e2sm/lib/constr_SET_OF_jer.c | 144 + e2sm/lib/constr_SET_OF_oer.c | 16 +- e2sm/lib/constr_SET_OF_print.c | 39 + e2sm/lib/constr_SET_OF_rfill.c | 152 + e2sm/lib/constr_SET_OF_uper.c | 201 + e2sm/lib/constr_SET_OF_xer.c | 314 + e2sm/lib/constr_TYPE.c | 2 +- e2sm/lib/constraints.c | 1 + e2sm/lib/cscope.out | 116022 ------------------ e2sm/lib/jer_encoder.c | 69 + e2sm/lib/per_decoder.c | 182 +- e2sm/lib/per_encoder.c | 234 +- e2sm/lib/per_opentype.c | 507 +- e2sm/lib/per_support.c | 485 +- e2sm/lib/uper_decoder.c | 96 + e2sm/lib/uper_encoder.c | 127 + e2sm/lib/uper_opentype.c | 372 + e2sm/lib/uper_support.c | 311 + e2sm/lib/xer_decoder.c | 2 +- e2sm/wrapper.c | 92 +- e2sm/wrapper.h | 7 +- entripoint.sh | 3 + f1ap.tar.gz | Bin 0 -> 2705138 bytes f1apHelper/f1apServer.go | 125 + f1apPackage/f1apPackage.go | 27 + isolation/isolation.go | 10 + 1077 files changed, 68373 insertions(+), 163268 deletions(-) create mode 100644 control/f1ap.go create mode 100644 e2ap/asn1/Makefile.am.libasncodec create mode 100644 e2ap/asn1/commonDefinition.asn create mode 100644 e2ap/asn1/constantDefinition.asn create mode 100644 e2ap/asn1/containerDefinition.asn create mode 100644 e2ap/asn1/elementryProcedureDefinition.asn create mode 100644 e2ap/asn1/informationElementDefinition.asn create mode 100644 e2ap/asn1/pduDefinition.asn create mode 100644 e2ap/headers/AMFName.h create mode 100644 e2ap/headers/CauseE2node.h delete mode 100644 e2ap/headers/CauseRIC.h create mode 100644 e2ap/headers/CauseRICrequest.h create mode 100644 e2ap/headers/E2connectionSetupFailed-Item.h create mode 100644 e2ap/headers/E2connectionSetupFailed-List.h create mode 100644 e2ap/headers/E2connectionUpdate-Item.h create mode 100644 e2ap/headers/E2connectionUpdate-List.h create mode 100644 e2ap/headers/E2connectionUpdate.h create mode 100644 e2ap/headers/E2connectionUpdateAcknowledge.h create mode 100644 e2ap/headers/E2connectionUpdateFailure.h create mode 100644 e2ap/headers/E2connectionUpdateRemove-Item.h create mode 100644 e2ap/headers/E2connectionUpdateRemove-List.h create mode 100644 e2ap/headers/E2nodeComponentConfigAddition-Item.h create mode 100644 e2ap/headers/E2nodeComponentConfigAddition-List.h create mode 100644 e2ap/headers/E2nodeComponentConfigAdditionAck-Item.h create mode 100644 e2ap/headers/E2nodeComponentConfigAdditionAck-List.h create mode 100644 e2ap/headers/E2nodeComponentConfigRemoval-Item.h create mode 100644 e2ap/headers/E2nodeComponentConfigRemoval-List.h create mode 100644 e2ap/headers/E2nodeComponentConfigRemovalAck-Item.h create mode 100644 e2ap/headers/E2nodeComponentConfigRemovalAck-List.h create mode 100644 e2ap/headers/E2nodeComponentConfigUpdate-Item.h create mode 100644 e2ap/headers/E2nodeComponentConfigUpdate-List.h create mode 100644 e2ap/headers/E2nodeComponentConfigUpdateAck-Item.h create mode 100644 e2ap/headers/E2nodeComponentConfigUpdateAck-List.h create mode 100644 e2ap/headers/E2nodeComponentConfiguration.h create mode 100644 e2ap/headers/E2nodeComponentConfigurationAck.h create mode 100644 e2ap/headers/E2nodeComponentID.h create mode 100644 e2ap/headers/E2nodeComponentInterfaceE1.h create mode 100644 e2ap/headers/E2nodeComponentInterfaceF1.h create mode 100644 e2ap/headers/E2nodeComponentInterfaceNG.h create mode 100644 e2ap/headers/E2nodeComponentInterfaceS1.h create mode 100644 e2ap/headers/E2nodeComponentInterfaceType.h create mode 100644 e2ap/headers/E2nodeComponentInterfaceW1.h create mode 100644 e2ap/headers/E2nodeComponentInterfaceX2.h create mode 100644 e2ap/headers/E2nodeComponentInterfaceXn.h create mode 100644 e2ap/headers/E2nodeConfigurationUpdate.h create mode 100644 e2ap/headers/E2nodeConfigurationUpdateAcknowledge.h create mode 100644 e2ap/headers/E2nodeConfigurationUpdateFailure.h create mode 100644 e2ap/headers/E2nodeTNLassociationRemoval-Item.h create mode 100644 e2ap/headers/E2nodeTNLassociationRemoval-List.h create mode 100644 e2ap/headers/EXTERNAL.h create mode 100644 e2ap/headers/GlobalNG-RANNode-ID.h create mode 100644 e2ap/headers/GraphicString.h create mode 100644 e2ap/headers/MMEname.h create mode 100644 e2ap/headers/NGENB-DU-ID.h create mode 100644 e2ap/headers/OBJECT_IDENTIFIER.h create mode 100644 e2ap/headers/ObjectDescriptor.h create mode 100644 e2ap/headers/PrintableString.h create mode 100644 e2ap/headers/RANfunctionOID.h delete mode 100644 e2ap/headers/RICcontrolStatus.h create mode 100644 e2ap/headers/RICsubscription-List-withCause.h create mode 100644 e2ap/headers/RICsubscription-withCause-Item.h create mode 100644 e2ap/headers/RICsubscriptionDeleteRequired.h create mode 100644 e2ap/headers/TNLinformation.h create mode 100644 e2ap/headers/TNLusage.h create mode 100644 e2ap/headers/TransactionID.h create mode 100644 e2ap/headers/aper_decoder.h create mode 100644 e2ap/headers/aper_encoder.h create mode 100644 e2ap/headers/aper_opentype.h create mode 100644 e2ap/headers/aper_support.h create mode 100644 e2ap/headers/asn_config.h create mode 100644 e2ap/headers/jer_encoder.h create mode 100644 e2ap/headers/uper_decoder.h create mode 100644 e2ap/headers/uper_encoder.h create mode 100644 e2ap/headers/uper_opentype.h create mode 100644 e2ap/headers/uper_support.h rename e2sm/lib/GNB-CU-CP-Name.c => e2ap/lib/AMFName.c (61%) create mode 100644 e2ap/lib/ANY_aper.c create mode 100644 e2ap/lib/ANY_ber.c create mode 100644 e2ap/lib/ANY_jer.c create mode 100644 e2ap/lib/ANY_uper.c create mode 100644 e2ap/lib/ANY_xer.c create mode 100644 e2ap/lib/BIT_STRING_jer.c create mode 100644 e2ap/lib/BIT_STRING_print.c create mode 100644 e2ap/lib/BIT_STRING_rfill.c create mode 100644 e2ap/lib/BIT_STRING_uper.c create mode 100644 e2ap/lib/BIT_STRING_xer.c create mode 100644 e2ap/lib/CauseE2node.c delete mode 100644 e2ap/lib/CauseRIC.c create mode 100644 e2ap/lib/CauseRICrequest.c create mode 100644 e2ap/lib/E2connectionSetupFailed-Item.c create mode 100644 e2ap/lib/E2connectionSetupFailed-List.c create mode 100644 e2ap/lib/E2connectionUpdate-Item.c create mode 100644 e2ap/lib/E2connectionUpdate-List.c create mode 100644 e2ap/lib/E2connectionUpdate.c create mode 100644 e2ap/lib/E2connectionUpdateAcknowledge.c create mode 100644 e2ap/lib/E2connectionUpdateFailure.c create mode 100644 e2ap/lib/E2connectionUpdateRemove-Item.c create mode 100644 e2ap/lib/E2connectionUpdateRemove-List.c create mode 100644 e2ap/lib/E2nodeComponentConfigAddition-Item.c create mode 100644 e2ap/lib/E2nodeComponentConfigAddition-List.c create mode 100644 e2ap/lib/E2nodeComponentConfigAdditionAck-Item.c create mode 100644 e2ap/lib/E2nodeComponentConfigAdditionAck-List.c create mode 100644 e2ap/lib/E2nodeComponentConfigRemoval-Item.c create mode 100644 e2ap/lib/E2nodeComponentConfigRemoval-List.c create mode 100644 e2ap/lib/E2nodeComponentConfigRemovalAck-Item.c create mode 100644 e2ap/lib/E2nodeComponentConfigRemovalAck-List.c create mode 100644 e2ap/lib/E2nodeComponentConfigUpdate-Item.c create mode 100644 e2ap/lib/E2nodeComponentConfigUpdate-List.c create mode 100644 e2ap/lib/E2nodeComponentConfigUpdateAck-Item.c create mode 100644 e2ap/lib/E2nodeComponentConfigUpdateAck-List.c create mode 100644 e2ap/lib/E2nodeComponentConfiguration.c create mode 100644 e2ap/lib/E2nodeComponentConfigurationAck.c create mode 100644 e2ap/lib/E2nodeComponentID.c create mode 100644 e2ap/lib/E2nodeComponentInterfaceE1.c create mode 100644 e2ap/lib/E2nodeComponentInterfaceF1.c create mode 100644 e2ap/lib/E2nodeComponentInterfaceNG.c create mode 100644 e2ap/lib/E2nodeComponentInterfaceS1.c create mode 100644 e2ap/lib/E2nodeComponentInterfaceType.c create mode 100644 e2ap/lib/E2nodeComponentInterfaceW1.c create mode 100644 e2ap/lib/E2nodeComponentInterfaceX2.c create mode 100644 e2ap/lib/E2nodeComponentInterfaceXn.c create mode 100644 e2ap/lib/E2nodeConfigurationUpdate.c create mode 100644 e2ap/lib/E2nodeConfigurationUpdateAcknowledge.c create mode 100644 e2ap/lib/E2nodeConfigurationUpdateFailure.c create mode 100644 e2ap/lib/E2nodeTNLassociationRemoval-Item.c create mode 100644 e2ap/lib/E2nodeTNLassociationRemoval-List.c create mode 100644 e2ap/lib/EXTERNAL.c create mode 100644 e2ap/lib/GlobalNG-RANNode-ID.c create mode 100644 e2ap/lib/GraphicString.c create mode 100644 e2ap/lib/INTEGER_aper.c create mode 100644 e2ap/lib/INTEGER_ber.c create mode 100644 e2ap/lib/INTEGER_jer.c create mode 100644 e2ap/lib/INTEGER_print.c create mode 100644 e2ap/lib/INTEGER_rfill.c create mode 100644 e2ap/lib/INTEGER_uper.c create mode 100644 e2ap/lib/INTEGER_xer.c rename e2sm/lib/GNB-CU-UP-Name.c => e2ap/lib/MMEname.c (61%) create mode 100644 e2ap/lib/NGENB-DU-ID.c create mode 100644 e2ap/lib/NativeEnumerated_aper.c create mode 100644 e2ap/lib/NativeEnumerated_jer.c create mode 100644 e2ap/lib/NativeEnumerated_uper.c create mode 100644 e2ap/lib/NativeEnumerated_xer.c create mode 100644 e2ap/lib/NativeInteger_aper.c create mode 100644 e2ap/lib/NativeInteger_ber.c create mode 100644 e2ap/lib/NativeInteger_jer.c create mode 100644 e2ap/lib/NativeInteger_print.c create mode 100644 e2ap/lib/NativeInteger_rfill.c create mode 100644 e2ap/lib/NativeInteger_uper.c create mode 100644 e2ap/lib/NativeInteger_xer.c create mode 100644 e2ap/lib/OBJECT_IDENTIFIER.c create mode 100644 e2ap/lib/OBJECT_IDENTIFIER_jer.c create mode 100644 e2ap/lib/OBJECT_IDENTIFIER_print.c create mode 100644 e2ap/lib/OBJECT_IDENTIFIER_rfill.c create mode 100644 e2ap/lib/OBJECT_IDENTIFIER_xer.c create mode 100644 e2ap/lib/OCTET_STRING_aper.c create mode 100644 e2ap/lib/OCTET_STRING_ber.c create mode 100644 e2ap/lib/OCTET_STRING_jer.c create mode 100644 e2ap/lib/OCTET_STRING_print.c create mode 100644 e2ap/lib/OCTET_STRING_rfill.c create mode 100644 e2ap/lib/OCTET_STRING_uper.c create mode 100644 e2ap/lib/OCTET_STRING_xer.c create mode 100644 e2ap/lib/OPEN_TYPE_aper.c create mode 100644 e2ap/lib/OPEN_TYPE_ber.c create mode 100644 e2ap/lib/OPEN_TYPE_uper.c create mode 100644 e2ap/lib/OPEN_TYPE_xer.c create mode 100644 e2ap/lib/ObjectDescriptor.c create mode 100644 e2ap/lib/PrintableString.c rename e2sm/lib/RANcallProcess-ID-string.c => e2ap/lib/RANfunctionOID.c (57%) delete mode 100644 e2ap/lib/RICcontrolStatus.c create mode 100644 e2ap/lib/RICsubscription-List-withCause.c create mode 100644 e2ap/lib/RICsubscription-withCause-Item.c create mode 100644 e2ap/lib/RICsubscriptionDeleteRequired.c create mode 100644 e2ap/lib/TNLinformation.c create mode 100644 e2ap/lib/TNLusage.c create mode 100644 e2ap/lib/TransactionID.c create mode 100644 e2ap/lib/aper_decoder.c create mode 100644 e2ap/lib/aper_encoder.c create mode 100644 e2ap/lib/aper_opentype.c create mode 100644 e2ap/lib/aper_support.c create mode 100644 e2ap/lib/asn_codecs_prim_ber.c create mode 100644 e2ap/lib/asn_codecs_prim_xer.c create mode 100644 e2ap/lib/constr_CHOICE_aper.c create mode 100644 e2ap/lib/constr_CHOICE_ber.c create mode 100644 e2ap/lib/constr_CHOICE_jer.c create mode 100644 e2ap/lib/constr_CHOICE_print.c create mode 100644 e2ap/lib/constr_CHOICE_rfill.c create mode 100644 e2ap/lib/constr_CHOICE_uper.c create mode 100644 e2ap/lib/constr_CHOICE_xer.c create mode 100644 e2ap/lib/constr_SEQUENCE_OF_aper.c create mode 100644 e2ap/lib/constr_SEQUENCE_OF_ber.c create mode 100644 e2ap/lib/constr_SEQUENCE_OF_jer.c create mode 100644 e2ap/lib/constr_SEQUENCE_OF_uper.c create mode 100644 e2ap/lib/constr_SEQUENCE_OF_xer.c create mode 100644 e2ap/lib/constr_SEQUENCE_aper.c create mode 100644 e2ap/lib/constr_SEQUENCE_ber.c create mode 100644 e2ap/lib/constr_SEQUENCE_jer.c create mode 100644 e2ap/lib/constr_SEQUENCE_print.c create mode 100644 e2ap/lib/constr_SEQUENCE_rfill.c create mode 100644 e2ap/lib/constr_SEQUENCE_uper.c create mode 100644 e2ap/lib/constr_SEQUENCE_xer.c create mode 100644 e2ap/lib/constr_SET_OF_aper.c create mode 100644 e2ap/lib/constr_SET_OF_ber.c create mode 100644 e2ap/lib/constr_SET_OF_jer.c create mode 100644 e2ap/lib/constr_SET_OF_print.c create mode 100644 e2ap/lib/constr_SET_OF_rfill.c create mode 100644 e2ap/lib/constr_SET_OF_uper.c create mode 100644 e2ap/lib/constr_SET_OF_xer.c create mode 100644 e2ap/lib/jer_encoder.c create mode 100644 e2ap/lib/uper_decoder.c create mode 100644 e2ap/lib/uper_encoder.c create mode 100644 e2ap/lib/uper_opentype.c create mode 100644 e2ap/lib/uper_support.c create mode 100644 e2sm/asn1/Makefile.am.libasncodec create mode 100644 e2sm/asn1/e2sm2_0.asn create mode 100644 e2sm/asn1/kpm2_0.asn delete mode 100644 e2sm/headers/BMPString.h delete mode 100644 e2sm/headers/C-RNTI.h delete mode 100644 e2sm/headers/CU-CP-Usage-Report-CellResourceReportItem.h delete mode 100644 e2sm/headers/CU-CP-Usage-Report-Per-UE.h delete mode 100644 e2sm/headers/CU-CP-Usage-Report-UeResourceReportItem.h delete mode 100644 e2sm/headers/CU-UP-Usage-Report-CellResourceReportItem.h delete mode 100644 e2sm/headers/CU-UP-Usage-Report-Per-UE.h delete mode 100644 e2sm/headers/CU-UP-Usage-Report-UeResourceReportItem.h delete mode 100644 e2sm/headers/CUUPMeasurement-Container.h delete mode 100644 e2sm/headers/CellResourceReportListItem.h delete mode 100644 e2sm/headers/DU-Usage-Report-CellResourceReportItem.h delete mode 100644 e2sm/headers/DU-Usage-Report-Per-UE.h delete mode 100644 e2sm/headers/DU-Usage-Report-UeResourceReportItem.h delete mode 100644 e2sm/headers/ENB-ID-Choice.h delete mode 100644 e2sm/headers/ENGNB-ID.h delete mode 100644 e2sm/headers/ENUMERATED.h delete mode 100644 e2sm/headers/EPC-CUUP-PM-Format.h delete mode 100644 e2sm/headers/EPC-DU-PM-Container.h create mode 100644 e2sm/headers/EXTERNAL.h delete mode 100644 e2sm/headers/FGC-CUUP-PM-Format.h delete mode 100644 e2sm/headers/FGC-DU-PM-Container.h delete mode 100644 e2sm/headers/FQIPERSlicesPerPlmnListItem.h delete mode 100644 e2sm/headers/FQIPERSlicesPerPlmnPerCellListItem.h delete mode 100644 e2sm/headers/GNB-CU-CP-Name.h delete mode 100644 e2sm/headers/GNB-CU-UP-Name.h delete mode 100644 e2sm/headers/GNB-DU-Name.h delete mode 100644 e2sm/headers/GNB-ID-Choice.h delete mode 100644 e2sm/headers/GNB-Name.h delete mode 100644 e2sm/headers/GeneralString.h delete mode 100644 e2sm/headers/GeneralizedTime.h delete mode 100644 e2sm/headers/GlobalKPMnode-ID.h delete mode 100644 e2sm/headers/GlobalKPMnode-eNB-ID.h delete mode 100644 e2sm/headers/GlobalKPMnode-en-gNB-ID.h delete mode 100644 e2sm/headers/GlobalKPMnode-gNB-ID.h delete mode 100644 e2sm/headers/GlobalKPMnode-ng-eNB-ID.h delete mode 100644 e2sm/headers/GlobalNGRANNodeID.h create mode 100644 e2sm/headers/GlobalRANNodeID.h delete mode 100644 e2sm/headers/GlobalgNB-ID.h delete mode 100644 e2sm/headers/GlobalngeNB-ID.h delete mode 100644 e2sm/headers/IA5String.h delete mode 100644 e2sm/headers/ISO646String.h delete mode 100644 e2sm/headers/NI-Type.h delete mode 100644 e2sm/headers/NRCGI.h delete mode 100644 e2sm/headers/NRFrequencyBand-List.h delete mode 100644 e2sm/headers/NRFrequencyBandItem.h delete mode 100644 e2sm/headers/NRFrequencyInfo.h delete mode 100644 e2sm/headers/NRFrequencyShift7p5khz.h delete mode 100644 e2sm/headers/NumericString.h delete mode 100644 e2sm/headers/OCUCP-PF-Container.h delete mode 100644 e2sm/headers/OCUUP-PF-Container.h delete mode 100644 e2sm/headers/ODU-PF-Container.h delete mode 100644 e2sm/headers/PF-Container.h delete mode 100644 e2sm/headers/PF-ContainerListItem.h delete mode 100644 e2sm/headers/PLMN-Identity.h delete mode 100644 e2sm/headers/PM-Containers-List.h delete mode 100644 e2sm/headers/PerQCIReportListItem.h delete mode 100644 e2sm/headers/PerQCIReportListItemFormat.h delete mode 100644 e2sm/headers/PlmnID-List.h delete mode 100644 e2sm/headers/RAN-Container.h delete mode 100644 e2sm/headers/RANcallProcess-ID-string.h delete mode 100644 e2sm/headers/RELATIVE-OID.h delete mode 100644 e2sm/headers/RIC-EventTriggerStyle-List.h delete mode 100644 e2sm/headers/RIC-ReportStyle-List.h delete mode 100644 e2sm/headers/RT-Period-IE.h delete mode 100644 e2sm/headers/SNSSAI.h delete mode 100644 e2sm/headers/ServedPlmnPerCellListItem.h delete mode 100644 e2sm/headers/SlicePerPlmnPerCellListItem.h delete mode 100644 e2sm/headers/SliceToReportListItem.h delete mode 100644 e2sm/headers/SupportedSULBandList.h delete mode 100644 e2sm/headers/SupportedSULFreqBandItem.h delete mode 100644 e2sm/headers/T61String.h delete mode 100644 e2sm/headers/TeletexString.h delete mode 100644 e2sm/headers/Timestamp.h delete mode 100644 e2sm/headers/Trigger-ConditionIE-Item.h delete mode 100644 e2sm/headers/UE-Report-Type.h delete mode 100644 e2sm/headers/UTCTime.h delete mode 100644 e2sm/headers/UTF8String.h delete mode 100644 e2sm/headers/UniversalString.h delete mode 100644 e2sm/headers/VideotexString.h delete mode 100644 e2sm/headers/VisibleString.h create mode 100644 e2sm/headers/aper_decoder.h create mode 100644 e2sm/headers/aper_encoder.h create mode 100644 e2sm/headers/aper_opentype.h create mode 100644 e2sm/headers/aper_support.h create mode 100644 e2sm/headers/asn_config.h delete mode 100644 e2sm/headers/constr_SET.h create mode 100644 e2sm/headers/jer_encoder.h create mode 100644 e2sm/headers/uper_decoder.h create mode 100644 e2sm/headers/uper_encoder.h create mode 100644 e2sm/headers/uper_opentype.h create mode 100644 e2sm/headers/uper_support.h create mode 100644 e2sm/lib/ANY_aper.c create mode 100644 e2sm/lib/ANY_ber.c create mode 100644 e2sm/lib/ANY_jer.c create mode 100644 e2sm/lib/ANY_uper.c create mode 100644 e2sm/lib/ANY_xer.c create mode 100644 e2sm/lib/BIT_STRING_jer.c create mode 100644 e2sm/lib/BIT_STRING_print.c create mode 100644 e2sm/lib/BIT_STRING_rfill.c create mode 100644 e2sm/lib/BIT_STRING_uper.c create mode 100644 e2sm/lib/BIT_STRING_xer.c delete mode 100644 e2sm/lib/BMPString.c create mode 100644 e2sm/lib/BOOLEAN_aper.c create mode 100644 e2sm/lib/BOOLEAN_ber.c create mode 100644 e2sm/lib/BOOLEAN_jer.c create mode 100644 e2sm/lib/BOOLEAN_oer.c create mode 100644 e2sm/lib/BOOLEAN_print.c create mode 100644 e2sm/lib/BOOLEAN_rfill.c create mode 100644 e2sm/lib/BOOLEAN_uper.c create mode 100644 e2sm/lib/BOOLEAN_xer.c delete mode 100644 e2sm/lib/C-RNTI.c delete mode 100644 e2sm/lib/CU-CP-Usage-Report-CellResourceReportItem.c delete mode 100644 e2sm/lib/CU-CP-Usage-Report-Per-UE.c delete mode 100644 e2sm/lib/CU-CP-Usage-Report-UeResourceReportItem.c delete mode 100644 e2sm/lib/CU-UP-Usage-Report-CellResourceReportItem.c delete mode 100644 e2sm/lib/CU-UP-Usage-Report-Per-UE.c delete mode 100644 e2sm/lib/CU-UP-Usage-Report-UeResourceReportItem.c delete mode 100644 e2sm/lib/CUUPMeasurement-Container.c delete mode 100644 e2sm/lib/CellResourceReportListItem.c delete mode 100644 e2sm/lib/DU-Usage-Report-CellResourceReportItem.c delete mode 100644 e2sm/lib/DU-Usage-Report-Per-UE.c delete mode 100644 e2sm/lib/DU-Usage-Report-UeResourceReportItem.c delete mode 100644 e2sm/lib/ENB-ID-Choice.c delete mode 100644 e2sm/lib/ENGNB-ID.c delete mode 100644 e2sm/lib/ENUMERATED.c delete mode 100644 e2sm/lib/EPC-CUUP-PM-Format.c delete mode 100644 e2sm/lib/EPC-DU-PM-Container.c create mode 100644 e2sm/lib/EXTERNAL.c delete mode 100644 e2sm/lib/FGC-CUUP-PM-Format.c delete mode 100644 e2sm/lib/FGC-DU-PM-Container.c delete mode 100644 e2sm/lib/FQIPERSlicesPerPlmnListItem.c delete mode 100644 e2sm/lib/FQIPERSlicesPerPlmnPerCellListItem.c delete mode 100644 e2sm/lib/GNB-DU-Name.c delete mode 100644 e2sm/lib/GNB-ID-Choice.c delete mode 100644 e2sm/lib/GNB-Name.c delete mode 100644 e2sm/lib/GeneralString.c delete mode 100644 e2sm/lib/GeneralizedTime.c delete mode 100644 e2sm/lib/GlobalKPMnode-ID.c delete mode 100644 e2sm/lib/GlobalKPMnode-eNB-ID.c delete mode 100644 e2sm/lib/GlobalKPMnode-en-gNB-ID.c delete mode 100644 e2sm/lib/GlobalKPMnode-gNB-ID.c delete mode 100644 e2sm/lib/GlobalKPMnode-ng-eNB-ID.c delete mode 100644 e2sm/lib/GlobalNGRANNodeID.c create mode 100644 e2sm/lib/GlobalRANNodeID.c delete mode 100644 e2sm/lib/GlobalgNB-ID.c delete mode 100644 e2sm/lib/GlobalngeNB-ID.c delete mode 100644 e2sm/lib/IA5String.c create mode 100644 e2sm/lib/INTEGER_aper.c create mode 100644 e2sm/lib/INTEGER_ber.c create mode 100644 e2sm/lib/INTEGER_jer.c create mode 100644 e2sm/lib/INTEGER_print.c create mode 100644 e2sm/lib/INTEGER_rfill.c create mode 100644 e2sm/lib/INTEGER_uper.c create mode 100644 e2sm/lib/INTEGER_xer.c delete mode 100644 e2sm/lib/ISO646String.c delete mode 100644 e2sm/lib/NI-Type.c delete mode 100644 e2sm/lib/NRCGI.c delete mode 100644 e2sm/lib/NRFrequencyBand-List.c delete mode 100644 e2sm/lib/NRFrequencyBandItem.c delete mode 100644 e2sm/lib/NRFrequencyInfo.c delete mode 100644 e2sm/lib/NRFrequencyShift7p5khz.c create mode 100644 e2sm/lib/NULL_aper.c create mode 100644 e2sm/lib/NULL_ber.c create mode 100644 e2sm/lib/NULL_jer.c create mode 100644 e2sm/lib/NULL_oer.c create mode 100644 e2sm/lib/NULL_print.c create mode 100644 e2sm/lib/NULL_rfill.c create mode 100644 e2sm/lib/NULL_uper.c create mode 100644 e2sm/lib/NULL_xer.c create mode 100644 e2sm/lib/NativeEnumerated_aper.c create mode 100644 e2sm/lib/NativeEnumerated_jer.c create mode 100644 e2sm/lib/NativeEnumerated_uper.c create mode 100644 e2sm/lib/NativeEnumerated_xer.c create mode 100644 e2sm/lib/NativeInteger_aper.c create mode 100644 e2sm/lib/NativeInteger_ber.c create mode 100644 e2sm/lib/NativeInteger_jer.c create mode 100644 e2sm/lib/NativeInteger_print.c create mode 100644 e2sm/lib/NativeInteger_rfill.c create mode 100644 e2sm/lib/NativeInteger_uper.c create mode 100644 e2sm/lib/NativeInteger_xer.c create mode 100644 e2sm/lib/NativeReal_aper.c create mode 100644 e2sm/lib/NativeReal_ber.c create mode 100644 e2sm/lib/NativeReal_jer.c create mode 100644 e2sm/lib/NativeReal_oer.c create mode 100644 e2sm/lib/NativeReal_print.c create mode 100644 e2sm/lib/NativeReal_rfill.c create mode 100644 e2sm/lib/NativeReal_uper.c create mode 100644 e2sm/lib/NativeReal_xer.c delete mode 100644 e2sm/lib/NumericString.c create mode 100644 e2sm/lib/OBJECT_IDENTIFIER_jer.c create mode 100644 e2sm/lib/OBJECT_IDENTIFIER_print.c create mode 100644 e2sm/lib/OBJECT_IDENTIFIER_rfill.c create mode 100644 e2sm/lib/OBJECT_IDENTIFIER_xer.c create mode 100644 e2sm/lib/OCTET_STRING_aper.c create mode 100644 e2sm/lib/OCTET_STRING_ber.c create mode 100644 e2sm/lib/OCTET_STRING_jer.c create mode 100644 e2sm/lib/OCTET_STRING_print.c create mode 100644 e2sm/lib/OCTET_STRING_rfill.c create mode 100644 e2sm/lib/OCTET_STRING_uper.c create mode 100644 e2sm/lib/OCTET_STRING_xer.c delete mode 100644 e2sm/lib/OCUCP-PF-Container.c delete mode 100644 e2sm/lib/OCUUP-PF-Container.c delete mode 100644 e2sm/lib/ODU-PF-Container.c create mode 100644 e2sm/lib/OPEN_TYPE_aper.c create mode 100644 e2sm/lib/OPEN_TYPE_ber.c create mode 100644 e2sm/lib/OPEN_TYPE_uper.c create mode 100644 e2sm/lib/OPEN_TYPE_xer.c delete mode 100644 e2sm/lib/PF-Container.c delete mode 100644 e2sm/lib/PF-ContainerListItem.c delete mode 100644 e2sm/lib/PLMN-Identity.c delete mode 100644 e2sm/lib/PM-Containers-List.c delete mode 100644 e2sm/lib/PerQCIReportListItem.c delete mode 100644 e2sm/lib/PerQCIReportListItemFormat.c delete mode 100644 e2sm/lib/PlmnID-List.c delete mode 100644 e2sm/lib/RAN-Container.c create mode 100644 e2sm/lib/REAL_aper.c create mode 100644 e2sm/lib/REAL_jer.c create mode 100644 e2sm/lib/REAL_oer.c create mode 100644 e2sm/lib/REAL_print.c create mode 100644 e2sm/lib/REAL_rfill.c create mode 100644 e2sm/lib/REAL_uper.c create mode 100644 e2sm/lib/REAL_xer.c delete mode 100644 e2sm/lib/RELATIVE-OID.c delete mode 100644 e2sm/lib/RIC-EventTriggerStyle-List.c delete mode 100644 e2sm/lib/RIC-ReportStyle-List.c delete mode 100644 e2sm/lib/RT-Period-IE.c delete mode 100644 e2sm/lib/SNSSAI.c delete mode 100644 e2sm/lib/ServedPlmnPerCellListItem.c delete mode 100644 e2sm/lib/SlicePerPlmnPerCellListItem.c delete mode 100644 e2sm/lib/SliceToReportListItem.c delete mode 100644 e2sm/lib/SupportedSULBandList.c delete mode 100644 e2sm/lib/SupportedSULFreqBandItem.c delete mode 100644 e2sm/lib/T61String.c delete mode 100644 e2sm/lib/TeletexString.c delete mode 100644 e2sm/lib/Timestamp.c delete mode 100644 e2sm/lib/Trigger-ConditionIE-Item.c delete mode 100644 e2sm/lib/UE-Report-Type.c delete mode 100644 e2sm/lib/UTCTime.c delete mode 100644 e2sm/lib/UTF8String.c delete mode 100644 e2sm/lib/UniversalString.c delete mode 100644 e2sm/lib/VideotexString.c delete mode 100644 e2sm/lib/VisibleString.c create mode 100644 e2sm/lib/aper_decoder.c create mode 100644 e2sm/lib/aper_encoder.c create mode 100644 e2sm/lib/aper_opentype.c create mode 100644 e2sm/lib/aper_support.c create mode 100644 e2sm/lib/asn_codecs_prim_ber.c create mode 100644 e2sm/lib/asn_codecs_prim_xer.c create mode 100644 e2sm/lib/constr_CHOICE_aper.c create mode 100644 e2sm/lib/constr_CHOICE_ber.c create mode 100644 e2sm/lib/constr_CHOICE_jer.c create mode 100644 e2sm/lib/constr_CHOICE_print.c create mode 100644 e2sm/lib/constr_CHOICE_rfill.c create mode 100644 e2sm/lib/constr_CHOICE_uper.c create mode 100644 e2sm/lib/constr_CHOICE_xer.c create mode 100644 e2sm/lib/constr_SEQUENCE_OF_aper.c create mode 100644 e2sm/lib/constr_SEQUENCE_OF_ber.c create mode 100644 e2sm/lib/constr_SEQUENCE_OF_jer.c create mode 100644 e2sm/lib/constr_SEQUENCE_OF_uper.c create mode 100644 e2sm/lib/constr_SEQUENCE_OF_xer.c create mode 100644 e2sm/lib/constr_SEQUENCE_aper.c create mode 100644 e2sm/lib/constr_SEQUENCE_ber.c create mode 100644 e2sm/lib/constr_SEQUENCE_jer.c create mode 100644 e2sm/lib/constr_SEQUENCE_print.c create mode 100644 e2sm/lib/constr_SEQUENCE_rfill.c create mode 100644 e2sm/lib/constr_SEQUENCE_uper.c create mode 100644 e2sm/lib/constr_SEQUENCE_xer.c delete mode 100644 e2sm/lib/constr_SET.c create mode 100644 e2sm/lib/constr_SET_OF_aper.c create mode 100644 e2sm/lib/constr_SET_OF_ber.c create mode 100644 e2sm/lib/constr_SET_OF_jer.c create mode 100644 e2sm/lib/constr_SET_OF_print.c create mode 100644 e2sm/lib/constr_SET_OF_rfill.c create mode 100644 e2sm/lib/constr_SET_OF_uper.c create mode 100644 e2sm/lib/constr_SET_OF_xer.c delete mode 100644 e2sm/lib/cscope.out create mode 100644 e2sm/lib/jer_encoder.c create mode 100644 e2sm/lib/uper_decoder.c create mode 100644 e2sm/lib/uper_encoder.c create mode 100644 e2sm/lib/uper_opentype.c create mode 100644 e2sm/lib/uper_support.c create mode 100755 entripoint.sh create mode 100644 f1ap.tar.gz create mode 100644 f1apHelper/f1apServer.go create mode 100644 f1apPackage/f1apPackage.go create mode 100644 isolation/isolation.go diff --git a/Dockerfile b/Dockerfile index 5af9b09..60ec0c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ # FROM ubuntu:18.04 -FROM nexus3.o-ran-sc.org:10002/o-ran-sc/bldr-ubuntu18-c-go:1.9.0 as build-kpimon +#FROM nexus3.o-ran-sc.org:10002/o-ran-sc/bldr-ubuntu18-c-go:1.9.0 as build-kpimon +FROM nexus3.o-ran-sc.org:10002/o-ran-sc/bldr-ubuntu20-c-go:1.0.0 as build-kpimon WORKDIR /opt # Install RMR client #COPY bin/rmr* ./ @@ -11,11 +12,14 @@ RUN wget --content-disposition https://packagecloud.io/o-ran-sc/release/packages RUN wget --content-disposition https://packagecloud.io/o-ran-sc/release/packages/debian/stretch/rmr-dev_${RMRVERSION}_amd64.deb/download.deb && dpkg -i rmr-dev_${RMRVERSION}_amd64.deb RUN rm -f rmr_${RMRVERSION}_amd64.deb rmr-dev_${RMRVERSION}_amd64.deb - RUN apt-get update && \ - apt-get -y install gcc + apt-get -y install g++ + COPY e2ap/ e2ap/ COPY e2sm/ e2sm/ +# f1ap size is 35 mb which makes repo size to exceede gerrit size limit +#COPY f1ap/ f1ap/ +COPY f1ap.tar.gz f1ap.tar.gz # "COMPILING E2AP Wrapper" RUN cd e2ap && \ gcc -c -fPIC -Iheaders/ lib/*.c wrapper.c && \ @@ -33,9 +37,22 @@ RUN cd e2sm && \ mkdir /usr/local/include/e2sm && \ cp wrapper.h headers/*.h /usr/local/include/e2sm && \ ldconfig +RUN apt-get install tar +# "COMPILING F1AP Wrapper and F1AP Parser " +RUN tar -xzvf f1ap.tar.gz +RUN cd f1ap && \ + gcc -c -fPIC -Iheaders/ lib/*.c wrapper.c && \ + gcc *.o -shared -o libf1apwrapper.so&& \ + cp libf1apwrapper.so /usr/local/lib/ && \ + mkdir /usr/local/include/f1ap && \ + cp wrapper.h headers/*.h /usr/local/include/f1ap && \ + ldconfig +#RUN cp -r /usr/include/x86_64-linux-gnu/c++/9/bits /usr/include/c++/9 # Setup running environment COPY control/ control/ +COPY f1apPackage/ f1apPackage/ +COPY isolation/ isolation/ COPY ./go.mod ./go.mod COPY ./kpimon.go ./kpimon.go COPY testfile1.txt testfile1.txt @@ -49,11 +66,16 @@ ENV PATH=$DEFAULTPATH:/usr/local/go/bin:/opt/go/bin:/root/go/bin COPY go.sum go.sum RUN go build ./kpimon.go +COPY f1apHelper/ f1apHelper/ +RUN go build f1apHelper/f1apServer.go COPY config-file.yaml . ENV CFG_FILE=/opt/config-file.yaml COPY routes.txt . ENV RMR_SEED_RT=/opt/routes.txt ENV RMR_SRC_ID=service-ricxapp-kpimon-go-rmr.ricxapp:4560 - -ENTRYPOINT ["env","LD_LIBRARY_PATH=/usr/local/lib","./kpimon"] +ENV LD_LIBRARY_PATH=/usr/local/lib +ENV C_INCLUDE_PATH=/usr/local/include +COPY entripoint.sh entripoint.sh +ENTRYPOINT ["env","LD_LIBRARY_PATH=/usr/local/lib","./entripoint.sh"] +#ENTRYPOINT ["env","LD_LIBRARY_PATH=/usr/local/lib","f1apHelper/f1apServer","./kpimon"] diff --git a/control/control.go b/control/control.go index e101eaf..7b8fc61 100644 --- a/control/control.go +++ b/control/control.go @@ -1,8 +1,8 @@ package control /* #include -#cgo LDFLAGS: -le2smwrapper -lm -#cgo CFLAGS: -I/usr/local/include/e2sm +#cgo LDFLAGS: -lm -le2smwrapper +#cgo CFLAGS: -I/usr/local/include/e2sm */ import "C" import ( @@ -17,8 +17,8 @@ import ( // "bytes" // "encoding/binary" "strconv" - "encoding/base64" - "strings" + //"encoding/base64" + //"strings" "fmt" "reflect" "errors" @@ -44,6 +44,8 @@ var ( clientEndpoint = clientmodel.SubscriptionParamsClientEndpoint{Host: "service-ricxapp-kpimon-go-http.ricxapp", HTTPPort: &hPort, RMRPort: &rPort} ) var Glob_cell = make(map[string]bool) +var Glob_Ran_cell = make(map[string][]string) +var Glob_cell_Plmn = make(map[string]string) var ranUeKpi = make(map[string][]string) var ranCellKpi = make(map[string][]string) func (c Control) Consume(msg *xapp.RMRParams) error { @@ -187,7 +189,7 @@ func encode_action_format1(plmn string, cellid string, meid string) clientmodel. result:=C.encode_action_Definition(cString, C.int(determine)) for i := 0; i < int(result.length); i++ { - value := int64(*(*int64)(unsafe.Pointer(uintptr(unsafe.Pointer(result.array)) + uintptr(i*8)))) + value := int64(*(*int32)(unsafe.Pointer(uintptr(unsafe.Pointer(result.array)) + uintptr(i*4)))) format1 = append(format1, value) } format1 = append(format1, lol1...) //appending plmn @@ -244,7 +246,7 @@ func encode_action_format3(meid string) clientmodel.ActionDefinition { result:=C.encode_action_Definition(cString, C.int(determine)) for i := 0; i < int(result.length); i++ { - value := int64(*(*int64)(unsafe.Pointer(uintptr(unsafe.Pointer(result.array)) + uintptr(i*8)))) + value := int64(*(*int32)(unsafe.Pointer(uintptr(unsafe.Pointer(result.array)) + uintptr(i*4)))) format3 = append(format3, value) } @@ -255,6 +257,7 @@ func encode_action_format3(meid string) clientmodel.ActionDefinition { } func encode_actionsToBeSetup(meid string) clientmodel.ActionsToBeSetup { var l clientmodel.ActionsToBeSetup + /* link:="http://service-ricplt-e2mgr-http.ricplt.svc.cluster.local:3800/v1/nodeb/" link=link+meid tmpr,err := http.Get(link) @@ -306,18 +309,34 @@ func encode_actionsToBeSetup(meid string) clientmodel.ActionsToBeSetup { fmt.Println(message[i : i+10]) } } + */ var n int64 = 1 + cells:=Glob_Ran_cell[meid] + fmt.Println("len of Tonga cells= ",len(cells)) + fmt.Println("Tonga cells = ", cells) + fmt.Println("Tonga = ", Glob_Ran_cell) + + var tempCells []string + for _, ele:=range cells{ + if ele!=""{ + tempCells =append(tempCells,ele) + } + } + fmt.Println("len of Tonga tmep cells= ",len(tempCells)) + fmt.Println("Tonga temp cells = ", tempCells) + //var ue int64 = 1 //get no of ue connected to du(if required) //for action def 1 - for n <= int64(len(cells)) { + for n <= int64(len(tempCells)) { + //fix double length issue/empty cell sting in Glob_Ran_cell map var tmp int64 = n var lol *int64 = &tmp s := clientmodel.ActionToBeSetup{ ActionID: lol, ActionType: &actionType, - ActionDefinition: encode_action_format1(resp.GlobalNbId.PlmnId, cells[n-1],meid), + ActionDefinition: encode_action_format1(Glob_cell_Plmn[tempCells[n-1]], tempCells[n-1],meid), SubsequentAction: &clientmodel.SubsequentAction{ SubsequentActionType: &subsequentActionType, TimeToWait: &timeToWait, @@ -965,13 +984,80 @@ func (c Control) xAppStartCB(d interface{}) { ueSlice = append(ueSlice, C.GoString(v)) } ranUeKpi[nb.InventoryName]=ueSlice + fmt.Println("len of ranUeKpi= ",len(ranUeKpi)) + fmt.Println("ranUeKpi map = ", ranUeKpi) + cellSlice := make([]string, result.cellKpiSize) for _, v := range unsafe.Slice(result.cellKpi, result.cellKpiSize) { cellSlice = append(cellSlice, C.GoString(v)) } - ranCellKpi[nb.InventoryName]=cellSlice + ranCellKpi[nb.InventoryName]=cellSlice + fmt.Println("len of ranCellKpi= ",len(ranCellKpi)) + fmt.Println("ranCellKpi map = ", ranCellKpi) + /* + counter = 0 + for i := 0; i < len(resp.Gnb.NodeConfigs); i++ { + if resp.Gnb.NodeConfigs[i].E2nodeComponentInterfaceType == "f1" { + counter = i + break + } + } + + + tm := resp.Gnb.NodeConfigs[counter].E2nodeComponentRequestPart + base64Text := make([]byte, base64.StdEncoding.DecodedLen(len(tm))) + nl, _ := base64.StdEncoding.Decode(base64Text, []byte(tm)) + message := string(base64Text[:nl]) + */ + /* + cString2 := C.CString(message) + fmt.Println("Ponga = ",tm) + fmt.Println("Ponga = ",message) + defer C.free(unsafe.Pointer(cString2)) // Free the allocated C string when done + result2:=C.decodeF1apGetCellIds(cString2) + cellList:=make([]string, result2.size) + for _, v := range unsafe.Slice(result2.cellids, result2.size) { + cellList = append(cellList, C.GoString(v)) + } + plmnList:=make([]string, result2.size) + for _, v := range unsafe.Slice(result2.plmn, result2.size) { + plmnList = append(plmnList, C.GoString(v)) + } + + */ + /* + var f1ap *F1ap + fmt.Println("Ponga = ",tm) + cellList,plmnList:=f1ap.F1apGetCellIds(message) + Glob_Ran_cell[nb.InventoryName]=cellList + for i := 0; i < len(cellList); i++ { + Glob_cell_Plmn[cellList[i]]=plmnList[i] + } + */ + response, err4 := http.Get("http://localhost:8090/getdata?gnbid="+nb.InventoryName) + if err4 != nil { + fmt.Println("Error:", err4) + panic(err4) + } + defer response.Body.Close() + + var response2 APIResponse + if err5 := json.NewDecoder(response.Body).Decode(&response2); err5 != nil { + fmt.Println("Error decoding response:", err5) + panic(err5) + } + + fmt.Printf("f1apSever Response: %+v\n", response2) + + Glob_Ran_cell[nb.InventoryName]=response2.Cellids + for i := 0; i < len(response2.Cellids); i++ { + Glob_cell_Plmn[response2.Cellids[i]]=response2.PlmnIds[i] + } + + fmt.Println("len of Glob_cell_Plmn= ",len(Glob_cell_Plmn)) + fmt.Println("Glob_cell_Plmn map = ", Glob_cell_Plmn) //C.freeMemorydRanCellUeKpi(result) @@ -991,8 +1077,8 @@ func (c Control) xAppStartCB(d interface{}) { } } - fmt.Println("len of Glob_cell= ",len(Glob_cell)) - fmt.Println("Glob_cell map = ", Glob_cell) + fmt.Println("len of Glob_Ran_cell= ",len(Glob_Ran_cell)) + fmt.Println("Glob_Ran_cell map = ", Glob_Ran_cell) go c.controlLoop() //go c.queryUEReports() diff --git a/control/f1ap.go b/control/f1ap.go new file mode 100644 index 0000000..3f60f57 --- /dev/null +++ b/control/f1ap.go @@ -0,0 +1,14 @@ +package control +import( + "fmt" + //"example.com/kpimon/f1apPackage" + "example.com/kpimon/isolation" +) +type F1ap struct { +} +func (c *F1ap)F1apGetCellIds(message string)(cellList [] string,plmnList [] string){ + fmt.Println("Ponga2 = ",message) + //cellList,plmnList=f1apPackage.GetCellIdsPlmnIds(message) + cellList,plmnList=isolation.IntermediateCaller(message) + return +} diff --git a/control/types.go b/control/types.go index 688a630..f999998 100644 --- a/control/types.go +++ b/control/types.go @@ -1,6 +1,10 @@ package control const MAX_SUBSCRIPTION_ATTEMPTS = 100 +type APIResponse struct { +Cellids []string `json:"Cellids"` +PlmnIds []string `json:"PlmnIds"` +} type RanFunctions struct { RanFunctionId int RanFunctionDefinition string diff --git a/e2ap/asn1/Makefile.am.libasncodec b/e2ap/asn1/Makefile.am.libasncodec new file mode 100644 index 0000000..50cb55a --- /dev/null +++ b/e2ap/asn1/Makefile.am.libasncodec @@ -0,0 +1,483 @@ +ASN_MODULE_SRCS= \ + Criticality.c \ + Presence.c \ + ProcedureCode.c \ + ProtocolIE-ID.c \ + TriggeringMessage.c \ + ProtocolIE-Container.c \ + ProtocolIE-SingleContainer.c \ + ProtocolIE-Field.c \ + ProtocolIE-ContainerPair.c \ + ProtocolIE-FieldPair.c \ + ProtocolIE-ContainerList.c \ + ProtocolIE-ContainerPairList.c \ + E2AP-PDU.c \ + InitiatingMessage.c \ + SuccessfulOutcome.c \ + UnsuccessfulOutcome.c \ + AMFName.c \ + Cause.c \ + CauseE2node.c \ + CauseMisc.c \ + CauseProtocol.c \ + CauseRICrequest.c \ + CauseRICservice.c \ + CauseTransport.c \ + CriticalityDiagnostics.c \ + CriticalityDiagnostics-IE-List.c \ + CriticalityDiagnostics-IE-Item.c \ + E2nodeComponentConfiguration.c \ + E2nodeComponentConfigurationAck.c \ + E2nodeComponentInterfaceType.c \ + E2nodeComponentID.c \ + E2nodeComponentInterfaceE1.c \ + E2nodeComponentInterfaceF1.c \ + E2nodeComponentInterfaceNG.c \ + E2nodeComponentInterfaceS1.c \ + E2nodeComponentInterfaceX2.c \ + E2nodeComponentInterfaceXn.c \ + E2nodeComponentInterfaceW1.c \ + ENB-ID.c \ + ENB-ID-Choice.c \ + ENGNB-ID.c \ + GlobalE2node-ID.c \ + GlobalE2node-en-gNB-ID.c \ + GlobalE2node-eNB-ID.c \ + GlobalE2node-gNB-ID.c \ + GlobalE2node-ng-eNB-ID.c \ + GlobalENB-ID.c \ + GlobalenGNB-ID.c \ + GlobalgNB-ID.c \ + GlobalngeNB-ID.c \ + GlobalNG-RANNode-ID.c \ + GlobalRIC-ID.c \ + GNB-CU-UP-ID.c \ + GNB-DU-ID.c \ + GNB-ID-Choice.c \ + MMEname.c \ + NGENB-DU-ID.c \ + PLMN-Identity.c \ + RANfunctionDefinition.c \ + RANfunctionID.c \ + RANfunctionOID.c \ + RANfunctionRevision.c \ + RICactionDefinition.c \ + RICactionID.c \ + RICactionType.c \ + RICcallProcessID.c \ + RICcontrolAckRequest.c \ + RICcontrolHeader.c \ + RICcontrolMessage.c \ + RICcontrolOutcome.c \ + RICeventTriggerDefinition.c \ + RICindicationHeader.c \ + RICindicationMessage.c \ + RICindicationSN.c \ + RICindicationType.c \ + RICrequestID.c \ + RICsubsequentAction.c \ + RICsubsequentActionType.c \ + RICtimeToWait.c \ + TimeToWait.c \ + TNLinformation.c \ + TNLusage.c \ + TransactionID.c \ + TypeOfError.c \ + RICsubscriptionRequest.c \ + RICsubscriptionDetails.c \ + RICactions-ToBeSetup-List.c \ + RICaction-ToBeSetup-Item.c \ + RICsubscriptionResponse.c \ + RICaction-Admitted-List.c \ + RICaction-Admitted-Item.c \ + RICaction-NotAdmitted-List.c \ + RICaction-NotAdmitted-Item.c \ + RICsubscriptionFailure.c \ + RICsubscriptionDeleteRequest.c \ + RICsubscriptionDeleteResponse.c \ + RICsubscriptionDeleteFailure.c \ + RICsubscriptionDeleteRequired.c \ + RICsubscription-List-withCause.c \ + RICsubscription-withCause-Item.c \ + RICindication.c \ + RICcontrolRequest.c \ + RICcontrolAcknowledge.c \ + RICcontrolFailure.c \ + ErrorIndication.c \ + E2setupRequest.c \ + E2setupResponse.c \ + E2setupFailure.c \ + E2connectionUpdate.c \ + E2connectionUpdate-List.c \ + E2connectionUpdate-Item.c \ + E2connectionUpdateRemove-List.c \ + E2connectionUpdateRemove-Item.c \ + E2connectionUpdateAcknowledge.c \ + E2connectionSetupFailed-List.c \ + E2connectionSetupFailed-Item.c \ + E2connectionUpdateFailure.c \ + E2nodeConfigurationUpdate.c \ + E2nodeComponentConfigAddition-List.c \ + E2nodeComponentConfigAddition-Item.c \ + E2nodeComponentConfigUpdate-List.c \ + E2nodeComponentConfigUpdate-Item.c \ + E2nodeComponentConfigRemoval-List.c \ + E2nodeComponentConfigRemoval-Item.c \ + E2nodeTNLassociationRemoval-List.c \ + E2nodeTNLassociationRemoval-Item.c \ + E2nodeConfigurationUpdateAcknowledge.c \ + E2nodeComponentConfigAdditionAck-List.c \ + E2nodeComponentConfigAdditionAck-Item.c \ + E2nodeComponentConfigUpdateAck-List.c \ + E2nodeComponentConfigUpdateAck-Item.c \ + E2nodeComponentConfigRemovalAck-List.c \ + E2nodeComponentConfigRemovalAck-Item.c \ + E2nodeConfigurationUpdateFailure.c \ + ResetRequest.c \ + ResetResponse.c \ + RICserviceUpdate.c \ + RANfunctions-List.c \ + RANfunction-Item.c \ + RANfunctionsID-List.c \ + RANfunctionID-Item.c \ + RICserviceUpdateAcknowledge.c \ + RANfunctionsIDcause-List.c \ + RANfunctionIDcause-Item.c \ + RICserviceUpdateFailure.c \ + RICserviceQuery.c \ + EXTERNAL.c + +ASN_MODULE_HDRS= \ + Criticality.h \ + Presence.h \ + ProcedureCode.h \ + ProtocolIE-ID.h \ + TriggeringMessage.h \ + ProtocolIE-Container.h \ + ProtocolIE-SingleContainer.h \ + ProtocolIE-Field.h \ + ProtocolIE-ContainerPair.h \ + ProtocolIE-FieldPair.h \ + ProtocolIE-ContainerList.h \ + ProtocolIE-ContainerPairList.h \ + E2AP-PDU.h \ + InitiatingMessage.h \ + SuccessfulOutcome.h \ + UnsuccessfulOutcome.h \ + AMFName.h \ + Cause.h \ + CauseE2node.h \ + CauseMisc.h \ + CauseProtocol.h \ + CauseRICrequest.h \ + CauseRICservice.h \ + CauseTransport.h \ + CriticalityDiagnostics.h \ + CriticalityDiagnostics-IE-List.h \ + CriticalityDiagnostics-IE-Item.h \ + E2nodeComponentConfiguration.h \ + E2nodeComponentConfigurationAck.h \ + E2nodeComponentInterfaceType.h \ + E2nodeComponentID.h \ + E2nodeComponentInterfaceE1.h \ + E2nodeComponentInterfaceF1.h \ + E2nodeComponentInterfaceNG.h \ + E2nodeComponentInterfaceS1.h \ + E2nodeComponentInterfaceX2.h \ + E2nodeComponentInterfaceXn.h \ + E2nodeComponentInterfaceW1.h \ + ENB-ID.h \ + ENB-ID-Choice.h \ + ENGNB-ID.h \ + GlobalE2node-ID.h \ + GlobalE2node-en-gNB-ID.h \ + GlobalE2node-eNB-ID.h \ + GlobalE2node-gNB-ID.h \ + GlobalE2node-ng-eNB-ID.h \ + GlobalENB-ID.h \ + GlobalenGNB-ID.h \ + GlobalgNB-ID.h \ + GlobalngeNB-ID.h \ + GlobalNG-RANNode-ID.h \ + GlobalRIC-ID.h \ + GNB-CU-UP-ID.h \ + GNB-DU-ID.h \ + GNB-ID-Choice.h \ + MMEname.h \ + NGENB-DU-ID.h \ + PLMN-Identity.h \ + RANfunctionDefinition.h \ + RANfunctionID.h \ + RANfunctionOID.h \ + RANfunctionRevision.h \ + RICactionDefinition.h \ + RICactionID.h \ + RICactionType.h \ + RICcallProcessID.h \ + RICcontrolAckRequest.h \ + RICcontrolHeader.h \ + RICcontrolMessage.h \ + RICcontrolOutcome.h \ + RICeventTriggerDefinition.h \ + RICindicationHeader.h \ + RICindicationMessage.h \ + RICindicationSN.h \ + RICindicationType.h \ + RICrequestID.h \ + RICsubsequentAction.h \ + RICsubsequentActionType.h \ + RICtimeToWait.h \ + TimeToWait.h \ + TNLinformation.h \ + TNLusage.h \ + TransactionID.h \ + TypeOfError.h \ + RICsubscriptionRequest.h \ + RICsubscriptionDetails.h \ + RICactions-ToBeSetup-List.h \ + RICaction-ToBeSetup-Item.h \ + RICsubscriptionResponse.h \ + RICaction-Admitted-List.h \ + RICaction-Admitted-Item.h \ + RICaction-NotAdmitted-List.h \ + RICaction-NotAdmitted-Item.h \ + RICsubscriptionFailure.h \ + RICsubscriptionDeleteRequest.h \ + RICsubscriptionDeleteResponse.h \ + RICsubscriptionDeleteFailure.h \ + RICsubscriptionDeleteRequired.h \ + RICsubscription-List-withCause.h \ + RICsubscription-withCause-Item.h \ + RICindication.h \ + RICcontrolRequest.h \ + RICcontrolAcknowledge.h \ + RICcontrolFailure.h \ + ErrorIndication.h \ + E2setupRequest.h \ + E2setupResponse.h \ + E2setupFailure.h \ + E2connectionUpdate.h \ + E2connectionUpdate-List.h \ + E2connectionUpdate-Item.h \ + E2connectionUpdateRemove-List.h \ + E2connectionUpdateRemove-Item.h \ + E2connectionUpdateAcknowledge.h \ + E2connectionSetupFailed-List.h \ + E2connectionSetupFailed-Item.h \ + E2connectionUpdateFailure.h \ + E2nodeConfigurationUpdate.h \ + E2nodeComponentConfigAddition-List.h \ + E2nodeComponentConfigAddition-Item.h \ + E2nodeComponentConfigUpdate-List.h \ + E2nodeComponentConfigUpdate-Item.h \ + E2nodeComponentConfigRemoval-List.h \ + E2nodeComponentConfigRemoval-Item.h \ + E2nodeTNLassociationRemoval-List.h \ + E2nodeTNLassociationRemoval-Item.h \ + E2nodeConfigurationUpdateAcknowledge.h \ + E2nodeComponentConfigAdditionAck-List.h \ + E2nodeComponentConfigAdditionAck-Item.h \ + E2nodeComponentConfigUpdateAck-List.h \ + E2nodeComponentConfigUpdateAck-Item.h \ + E2nodeComponentConfigRemovalAck-List.h \ + E2nodeComponentConfigRemovalAck-Item.h \ + E2nodeConfigurationUpdateFailure.h \ + ResetRequest.h \ + ResetResponse.h \ + RICserviceUpdate.h \ + RANfunctions-List.h \ + RANfunction-Item.h \ + RANfunctionsID-List.h \ + RANfunctionID-Item.h \ + RICserviceUpdateAcknowledge.h \ + RANfunctionsIDcause-List.h \ + RANfunctionIDcause-Item.h \ + RICserviceUpdateFailure.h \ + RICserviceQuery.h \ + EXTERNAL.h + +ASN_MODULE_HDRS+=ANY.h +ASN_MODULE_SRCS+=ANY.c +ASN_MODULE_HDRS+=OCTET_STRING.h +ASN_MODULE_HDRS+=OPEN_TYPE.h +ASN_MODULE_SRCS+=OPEN_TYPE.c +ASN_MODULE_HDRS+=constr_CHOICE.h +ASN_MODULE_HDRS+=GraphicString.h +ASN_MODULE_SRCS+=GraphicString.c +ASN_MODULE_HDRS+=INTEGER.h +ASN_MODULE_SRCS+=INTEGER.c +ASN_MODULE_HDRS+=NativeEnumerated.h +ASN_MODULE_SRCS+=NativeEnumerated.c +ASN_MODULE_HDRS+=NativeInteger.h +ASN_MODULE_SRCS+=NativeInteger.c +ASN_MODULE_HDRS+=OBJECT_IDENTIFIER.h +ASN_MODULE_SRCS+=OBJECT_IDENTIFIER.c +ASN_MODULE_HDRS+=asn_codecs_prim.h +ASN_MODULE_HDRS+=ObjectDescriptor.h +ASN_MODULE_SRCS+=ObjectDescriptor.c +ASN_MODULE_HDRS+=PrintableString.h +ASN_MODULE_SRCS+=PrintableString.c +ASN_MODULE_HDRS+=asn_SEQUENCE_OF.h +ASN_MODULE_SRCS+=asn_SEQUENCE_OF.c +ASN_MODULE_HDRS+=asn_SET_OF.h +ASN_MODULE_SRCS+=asn_SET_OF.c +ASN_MODULE_SRCS+=constr_CHOICE.c +ASN_MODULE_HDRS+=constr_SEQUENCE.h +ASN_MODULE_SRCS+=constr_SEQUENCE.c +ASN_MODULE_HDRS+=constr_SEQUENCE_OF.h +ASN_MODULE_SRCS+=constr_SEQUENCE_OF.c +ASN_MODULE_HDRS+=constr_SET_OF.h +ASN_MODULE_SRCS+=constr_SET_OF.c +ASN_MODULE_HDRS+=asn_application.h +ASN_MODULE_SRCS+=asn_application.c +ASN_MODULE_HDRS+=asn_ioc.h +ASN_MODULE_HDRS+=asn_system.h +ASN_MODULE_HDRS+=asn_codecs.h +ASN_MODULE_HDRS+=asn_internal.h +ASN_MODULE_SRCS+=asn_internal.c +ASN_MODULE_HDRS+=asn_bit_data.h +ASN_MODULE_SRCS+=asn_bit_data.c +ASN_MODULE_SRCS+=OCTET_STRING.c +ASN_MODULE_HDRS+=BIT_STRING.h +ASN_MODULE_SRCS+=BIT_STRING.c +ASN_MODULE_SRCS+=asn_codecs_prim.c +ASN_MODULE_HDRS+=ber_tlv_length.h +ASN_MODULE_SRCS+=ber_tlv_length.c +ASN_MODULE_HDRS+=ber_tlv_tag.h +ASN_MODULE_SRCS+=ber_tlv_tag.c +ASN_MODULE_HDRS+=constr_TYPE.h +ASN_MODULE_SRCS+=constr_TYPE.c +ASN_MODULE_HDRS+=constraints.h +ASN_MODULE_SRCS+=constraints.c +ASN_MODULE_HDRS+=ber_decoder.h +ASN_MODULE_HDRS+=der_encoder.h +ASN_MODULE_SRCS+=ber_decoder.c +ASN_MODULE_SRCS+=der_encoder.c +ASN_MODULE_SRCS+=ANY_ber.c +ASN_MODULE_SRCS+=INTEGER_ber.c +ASN_MODULE_SRCS+=NativeInteger_ber.c +ASN_MODULE_SRCS+=OCTET_STRING_ber.c +ASN_MODULE_SRCS+=OPEN_TYPE_ber.c +ASN_MODULE_SRCS+=asn_codecs_prim_ber.c +ASN_MODULE_SRCS+=constr_CHOICE_ber.c +ASN_MODULE_SRCS+=constr_SEQUENCE_OF_ber.c +ASN_MODULE_SRCS+=constr_SEQUENCE_ber.c +ASN_MODULE_SRCS+=constr_SET_OF_ber.c +ASN_MODULE_HDRS+=xer_support.h +ASN_MODULE_HDRS+=xer_decoder.h +ASN_MODULE_HDRS+=xer_encoder.h +ASN_MODULE_SRCS+=xer_support.c +ASN_MODULE_SRCS+=xer_decoder.c +ASN_MODULE_SRCS+=xer_encoder.c +ASN_MODULE_SRCS+=ANY_xer.c +ASN_MODULE_SRCS+=BIT_STRING_xer.c +ASN_MODULE_SRCS+=INTEGER_xer.c +ASN_MODULE_SRCS+=NativeEnumerated_xer.c +ASN_MODULE_SRCS+=NativeInteger_xer.c +ASN_MODULE_SRCS+=OBJECT_IDENTIFIER_xer.c +ASN_MODULE_SRCS+=OCTET_STRING_xer.c +ASN_MODULE_SRCS+=OPEN_TYPE_xer.c +ASN_MODULE_SRCS+=asn_codecs_prim_xer.c +ASN_MODULE_SRCS+=constr_CHOICE_xer.c +ASN_MODULE_SRCS+=constr_SEQUENCE_OF_xer.c +ASN_MODULE_SRCS+=constr_SEQUENCE_xer.c +ASN_MODULE_SRCS+=constr_SET_OF_xer.c +ASN_MODULE_HDRS+=oer_decoder.h +ASN_MODULE_HDRS+=oer_encoder.h +ASN_MODULE_HDRS+=oer_support.h +ASN_MODULE_SRCS+=oer_decoder.c +ASN_MODULE_SRCS+=oer_encoder.c +ASN_MODULE_SRCS+=oer_support.c +ASN_MODULE_SRCS+=OPEN_TYPE_oer.c +ASN_MODULE_SRCS+=INTEGER_oer.c +ASN_MODULE_SRCS+=BIT_STRING_oer.c +ASN_MODULE_SRCS+=OCTET_STRING_oer.c +ASN_MODULE_SRCS+=NativeInteger_oer.c +ASN_MODULE_SRCS+=NativeEnumerated_oer.c +ASN_MODULE_SRCS+=constr_CHOICE_oer.c +ASN_MODULE_SRCS+=constr_SEQUENCE_oer.c +ASN_MODULE_SRCS+=constr_SET_OF_oer.c +ASN_MODULE_HDRS+=per_decoder.h +ASN_MODULE_HDRS+=per_encoder.h +ASN_MODULE_HDRS+=per_support.h +ASN_MODULE_HDRS+=per_opentype.h +ASN_MODULE_SRCS+=per_decoder.c +ASN_MODULE_SRCS+=per_encoder.c +ASN_MODULE_SRCS+=per_support.c +ASN_MODULE_SRCS+=per_opentype.c +ASN_MODULE_HDRS+=uper_decoder.h +ASN_MODULE_HDRS+=uper_encoder.h +ASN_MODULE_HDRS+=uper_support.h +ASN_MODULE_HDRS+=uper_opentype.h +ASN_MODULE_SRCS+=uper_decoder.c +ASN_MODULE_SRCS+=uper_encoder.c +ASN_MODULE_SRCS+=uper_support.c +ASN_MODULE_SRCS+=uper_opentype.c +ASN_MODULE_SRCS+=ANY_uper.c +ASN_MODULE_SRCS+=BIT_STRING_uper.c +ASN_MODULE_SRCS+=INTEGER_uper.c +ASN_MODULE_SRCS+=NativeEnumerated_uper.c +ASN_MODULE_SRCS+=NativeInteger_uper.c +ASN_MODULE_SRCS+=OCTET_STRING_uper.c +ASN_MODULE_SRCS+=OPEN_TYPE_uper.c +ASN_MODULE_SRCS+=constr_CHOICE_uper.c +ASN_MODULE_SRCS+=constr_SEQUENCE_OF_uper.c +ASN_MODULE_SRCS+=constr_SEQUENCE_uper.c +ASN_MODULE_SRCS+=constr_SET_OF_uper.c +ASN_MODULE_HDRS+=aper_decoder.h +ASN_MODULE_HDRS+=aper_encoder.h +ASN_MODULE_HDRS+=aper_support.h +ASN_MODULE_HDRS+=aper_opentype.h +ASN_MODULE_SRCS+=aper_decoder.c +ASN_MODULE_SRCS+=aper_encoder.c +ASN_MODULE_SRCS+=aper_support.c +ASN_MODULE_SRCS+=aper_opentype.c +ASN_MODULE_SRCS+=ANY_aper.c +ASN_MODULE_SRCS+=INTEGER_aper.c +ASN_MODULE_SRCS+=NativeEnumerated_aper.c +ASN_MODULE_SRCS+=NativeInteger_aper.c +ASN_MODULE_SRCS+=OCTET_STRING_aper.c +ASN_MODULE_SRCS+=OPEN_TYPE_aper.c +ASN_MODULE_SRCS+=constr_CHOICE_aper.c +ASN_MODULE_SRCS+=constr_SEQUENCE_OF_aper.c +ASN_MODULE_SRCS+=constr_SEQUENCE_aper.c +ASN_MODULE_SRCS+=constr_SET_OF_aper.c +ASN_MODULE_SRCS+=BIT_STRING_print.c +ASN_MODULE_SRCS+=INTEGER_print.c +ASN_MODULE_SRCS+=NativeInteger_print.c +ASN_MODULE_SRCS+=OBJECT_IDENTIFIER_print.c +ASN_MODULE_SRCS+=OCTET_STRING_print.c +ASN_MODULE_SRCS+=constr_CHOICE_print.c +ASN_MODULE_SRCS+=constr_SEQUENCE_print.c +ASN_MODULE_SRCS+=constr_SET_OF_print.c +ASN_MODULE_HDRS+=asn_random_fill.h +ASN_MODULE_SRCS+=asn_random_fill.c +ASN_MODULE_SRCS+=BIT_STRING_rfill.c +ASN_MODULE_SRCS+=INTEGER_rfill.c +ASN_MODULE_SRCS+=NativeInteger_rfill.c +ASN_MODULE_SRCS+=OBJECT_IDENTIFIER_rfill.c +ASN_MODULE_SRCS+=OCTET_STRING_rfill.c +ASN_MODULE_SRCS+=constr_CHOICE_rfill.c +ASN_MODULE_SRCS+=constr_SEQUENCE_rfill.c +ASN_MODULE_SRCS+=constr_SET_OF_rfill.c +ASN_MODULE_HDRS+=jer_encoder.h +ASN_MODULE_SRCS+=jer_encoder.c +ASN_MODULE_SRCS+=ANY_jer.c +ASN_MODULE_SRCS+=BIT_STRING_jer.c +ASN_MODULE_SRCS+=INTEGER_jer.c +ASN_MODULE_SRCS+=NativeEnumerated_jer.c +ASN_MODULE_SRCS+=NativeInteger_jer.c +ASN_MODULE_SRCS+=OBJECT_IDENTIFIER_jer.c +ASN_MODULE_SRCS+=OCTET_STRING_jer.c +ASN_MODULE_SRCS+=constr_CHOICE_jer.c +ASN_MODULE_SRCS+=constr_SEQUENCE_OF_jer.c +ASN_MODULE_SRCS+=constr_SEQUENCE_jer.c +ASN_MODULE_SRCS+=constr_SET_OF_jer.c + +ASN_MODULE_CFLAGS= + +lib_LTLIBRARIES+=libasncodec.la +libasncodec_la_SOURCES=$(ASN_MODULE_SRCS) $(ASN_MODULE_HDRS) +libasncodec_la_CPPFLAGS=-I$(top_srcdir)/ +libasncodec_la_CFLAGS=$(ASN_MODULE_CFLAGS) +libasncodec_la_LDFLAGS=-lm diff --git a/e2ap/asn1/commonDefinition.asn b/e2ap/asn1/commonDefinition.asn new file mode 100644 index 0000000..92f7bf9 --- /dev/null +++ b/e2ap/asn1/commonDefinition.asn @@ -0,0 +1,28 @@ +-- ASN1START +-- ************************************************************** +-- +-- Common definitions +-- Derived from 3GPP 38.413 (NGAP) +-- +-- ************************************************************** + +E2AP-CommonDataTypes { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version2 (2) e2ap(1) e2ap-CommonDataTypes (3) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +Criticality ::= ENUMERATED { reject, ignore, notify } + +Presence ::= ENUMERATED { optional, conditional, mandatory } + +ProcedureCode ::= INTEGER (0..255) + +ProtocolIE-ID ::= INTEGER (0..65535) + +TriggeringMessage ::= ENUMERATED { initiating-message, successful-outcome, unsuccessfull-outcome } + +END +-- ASN1STOP + diff --git a/e2ap/asn1/constantDefinition.asn b/e2ap/asn1/constantDefinition.asn new file mode 100644 index 0000000..6d50677 --- /dev/null +++ b/e2ap/asn1/constantDefinition.asn @@ -0,0 +1,127 @@ +-- ASN1START +-- ************************************************************** +-- +-- Constant definitions +-- +-- ************************************************************** + +E2AP-Constants { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version2 (2) e2ap(1) e2ap-Constants (4) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + ProcedureCode, + ProtocolIE-ID +FROM E2AP-CommonDataTypes; + +-- ************************************************************** +-- +-- Elementary Procedures +-- +-- ************************************************************** +id-E2setup ProcedureCode ::= 1 +id-ErrorIndication ProcedureCode ::= 2 +id-Reset ProcedureCode ::= 3 +id-RICcontrol ProcedureCode ::= 4 +id-RICindication ProcedureCode ::= 5 +id-RICserviceQuery ProcedureCode ::= 6 +id-RICserviceUpdate ProcedureCode ::= 7 +id-RICsubscription ProcedureCode ::= 8 +id-RICsubscriptionDelete ProcedureCode ::= 9 +id-E2nodeConfigurationUpdate ProcedureCode ::= 10 +id-E2connectionUpdate ProcedureCode ::= 11 +id-RICsubscriptionDeleteRequired ProcedureCode ::= 12 + +-- ************************************************************** +-- +-- Extension constants +-- +-- ************************************************************** + +maxProtocolIEs INTEGER ::= 65535 + + +-- ************************************************************** +-- +-- Lists +-- +-- ************************************************************** +maxnoofErrors INTEGER ::= 256 +maxofE2nodeComponents INTEGER ::= 1024 +maxofRANfunctionID INTEGER ::= 256 +maxofRICactionID INTEGER ::= 16 +maxofTNLA INTEGER ::= 32 +maxofRICrequestID INTEGER ::= 4294967295 + + +-- ************************************************************** +-- +-- IEs +-- +-- ************************************************************** +id-Cause ProtocolIE-ID ::= 1 +id-CriticalityDiagnostics ProtocolIE-ID ::= 2 +id-GlobalE2node-ID ProtocolIE-ID ::= 3 +id-GlobalRIC-ID ProtocolIE-ID ::= 4 +id-RANfunctionID ProtocolIE-ID ::= 5 +id-RANfunctionID-Item ProtocolIE-ID ::= 6 +id-RANfunctionIEcause-Item ProtocolIE-ID ::= 7 +id-RANfunction-Item ProtocolIE-ID ::= 8 +id-RANfunctionsAccepted ProtocolIE-ID ::= 9 +id-RANfunctionsAdded ProtocolIE-ID ::= 10 +id-RANfunctionsDeleted ProtocolIE-ID ::= 11 +id-RANfunctionsModified ProtocolIE-ID ::= 12 +id-RANfunctionsRejected ProtocolIE-ID ::= 13 +id-RICaction-Admitted-Item ProtocolIE-ID ::= 14 +id-RICactionID ProtocolIE-ID ::= 15 +id-RICaction-NotAdmitted-Item ProtocolIE-ID ::= 16 +id-RICactions-Admitted ProtocolIE-ID ::= 17 +id-RICactions-NotAdmitted ProtocolIE-ID ::= 18 +id-RICaction-ToBeSetup-Item ProtocolIE-ID ::= 19 +id-RICcallProcessID ProtocolIE-ID ::= 20 +id-RICcontrolAckRequest ProtocolIE-ID ::= 21 +id-RICcontrolHeader ProtocolIE-ID ::= 22 +id-RICcontrolMessage ProtocolIE-ID ::= 23 +id-RICcontrolStatus ProtocolIE-ID ::= 24 +id-RICindicationHeader ProtocolIE-ID ::= 25 +id-RICindicationMessage ProtocolIE-ID ::= 26 +id-RICindicationSN ProtocolIE-ID ::= 27 +id-RICindicationType ProtocolIE-ID ::= 28 +id-RICrequestID ProtocolIE-ID ::= 29 +id-RICsubscriptionDetails ProtocolIE-ID ::= 30 +id-TimeToWait ProtocolIE-ID ::= 31 +id-RICcontrolOutcome ProtocolIE-ID ::= 32 +id-E2nodeComponentConfigUpdate ProtocolIE-ID ::= 33 +id-E2nodeComponentConfigUpdate-Item ProtocolIE-ID ::= 34 +id-E2nodeComponentConfigUpdateAck ProtocolIE-ID ::= 35 +id-E2nodeComponentConfigUpdateAck-Item ProtocolIE-ID ::= 36 +id-E2connectionSetup ProtocolIE-ID ::= 39 +id-E2connectionSetupFailed ProtocolIE-ID ::= 40 +id-E2connectionSetupFailed-Item ProtocolIE-ID ::= 41 +id-E2connectionFailed-Item ProtocolIE-ID ::= 42 +id-E2connectionUpdate-Item ProtocolIE-ID ::= 43 +id-E2connectionUpdateAdd ProtocolIE-ID ::= 44 +id-E2connectionUpdateModify ProtocolIE-ID ::= 45 +id-E2connectionUpdateRemove ProtocolIE-ID ::= 46 +id-E2connectionUpdateRemove-Item ProtocolIE-ID ::= 47 +id-TNLinformation ProtocolIE-ID ::= 48 +id-TransactionID ProtocolIE-ID ::= 49 +id-E2nodeComponentConfigAddition ProtocolIE-ID ::= 50 +id-E2nodeComponentConfigAddition-Item ProtocolIE-ID ::= 51 +id-E2nodeComponentConfigAdditionAck ProtocolIE-ID ::= 52 +id-E2nodeComponentConfigAdditionAck-Item ProtocolIE-ID ::= 53 +id-E2nodeComponentConfigRemoval ProtocolIE-ID ::= 54 +id-E2nodeComponentConfigRemoval-Item ProtocolIE-ID ::= 55 +id-E2nodeComponentConfigRemovalAck ProtocolIE-ID ::= 56 +id-E2nodeComponentConfigRemovalAck-Item ProtocolIE-ID ::= 57 +id-E2nodeTNLassociationRemoval ProtocolIE-ID ::= 58 +id-E2nodeTNLassociationRemoval-Item ProtocolIE-ID ::= 59 +id-RICsubscriptionToBeRemoved ProtocolIE-ID ::= 50 +id-RICsubscription-withCause-Item ProtocolIE-ID ::= 51 + +END +-- ASN1STOP + diff --git a/e2ap/asn1/containerDefinition.asn b/e2ap/asn1/containerDefinition.asn new file mode 100644 index 0000000..8c25930 --- /dev/null +++ b/e2ap/asn1/containerDefinition.asn @@ -0,0 +1,131 @@ +-- ASN1START +-- ************************************************************** +-- +-- Container definitions +-- +-- derived from 3GPP 38.413 (NGAP) +-- ************************************************************** + +E2AP-Containers { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version2 (2) e2ap(1) e2ap-Containers (5) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- ************************************************************** +-- +-- IE parameter types from other modules. +-- +-- ************************************************************** + +IMPORTS + + Criticality, + Presence, + ProtocolIE-ID +FROM E2AP-CommonDataTypes + + maxProtocolIEs +FROM E2AP-Constants; + +-- ************************************************************** +-- +-- Class Definition for Protocol IEs +-- +-- ************************************************************** + +E2AP-PROTOCOL-IES ::= CLASS { + &id ProtocolIE-ID UNIQUE, + &criticality Criticality, + &Value, + &presence Presence +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + TYPE &Value + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Class Definition for Protocol IEs +-- +-- ************************************************************** + +E2AP-PROTOCOL-IES-PAIR ::= CLASS { + &id ProtocolIE-ID UNIQUE, + &firstCriticality Criticality, + &FirstValue, + &secondCriticality Criticality, + &SecondValue, + &presence Presence +} +WITH SYNTAX { + ID &id + FIRST CRITICALITY &firstCriticality + FIRST TYPE &FirstValue + SECOND CRITICALITY &secondCriticality + SECOND TYPE &SecondValue + PRESENCE &presence +} + + + + +-- ************************************************************** +-- +-- Container for Protocol IEs +-- +-- ************************************************************** + +ProtocolIE-Container {E2AP-PROTOCOL-IES : IEsSetParam} ::= + SEQUENCE (SIZE (0..maxProtocolIEs)) OF + ProtocolIE-Field {{IEsSetParam}} + +ProtocolIE-SingleContainer {E2AP-PROTOCOL-IES : IEsSetParam} ::= + ProtocolIE-Field {{IEsSetParam}} + +ProtocolIE-Field {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-ContainerPair {E2AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= + SEQUENCE (SIZE (0..maxProtocolIEs)) OF + ProtocolIE-FieldPair {{IEsSetParam}} + +ProtocolIE-FieldPair {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-SingleContainer {{IEsSetParam}} + +ProtocolIE-ContainerPairList {INTEGER : lowerBound, INTEGER : upperBound, E2AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= + SEQUENCE (SIZE (lowerBound..upperBound)) OF + ProtocolIE-ContainerPair {{IEsSetParam}} + + +END +-- ASN1STOP + diff --git a/e2ap/asn1/elementryProcedureDefinition.asn b/e2ap/asn1/elementryProcedureDefinition.asn new file mode 100644 index 0000000..a52523d --- /dev/null +++ b/e2ap/asn1/elementryProcedureDefinition.asn @@ -0,0 +1,252 @@ +-- 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) version2 (2) e2ap(1) e2ap-PDU-Descriptions (0) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- ************************************************************** +-- +-- IE parameter types from other modules. +-- +-- ************************************************************** + +IMPORTS + Criticality, + ProcedureCode +FROM E2AP-CommonDataTypes + + + + E2connectionUpdate, + E2connectionUpdateAcknowledge, + E2connectionUpdateFailure, + E2nodeConfigurationUpdate, + E2nodeConfigurationUpdateAcknowledge, + E2nodeConfigurationUpdateFailure, + E2setupFailure, + E2setupRequest, + E2setupResponse, + ErrorIndication, + ResetRequest, + ResetResponse, + RICcontrolAcknowledge, + RICcontrolFailure, + RICcontrolRequest, + RICindication, + RICserviceQuery, + RICserviceUpdate, + RICserviceUpdateAcknowledge, + RICserviceUpdateFailure, + RICsubscriptionFailure, + RICsubscriptionRequest, + RICsubscriptionResponse, + RICsubscriptionDeleteFailure, + RICsubscriptionDeleteRequest, + RICsubscriptionDeleteResponse, + RICsubscriptionDeleteRequired +FROM E2AP-PDU-Contents + + id-E2connectionUpdate, + id-E2nodeConfigurationUpdate, + id-E2setup, + id-ErrorIndication, + id-Reset, + id-RICcontrol, + id-RICindication, + id-RICserviceQuery, + id-RICserviceUpdate, + id-RICsubscription, + id-RICsubscriptionDelete, + id-RICsubscriptionDeleteRequired +FROM E2AP-Constants; + +-- ************************************************************** +-- +-- Interface Elementary Procedure Class +-- +-- ************************************************************** + +E2AP-ELEMENTARY-PROCEDURE ::= CLASS { + &InitiatingMessage , + &SuccessfulOutcome OPTIONAL , + &UnsuccessfulOutcome OPTIONAL , + &procedureCode ProcedureCode UNIQUE , + &criticality Criticality DEFAULT ignore +} + +WITH SYNTAX { + INITIATING MESSAGE &InitiatingMessage + [SUCCESSFUL OUTCOME &SuccessfulOutcome] + [UNSUCCESSFUL OUTCOME &UnsuccessfulOutcome] + PROCEDURE CODE &procedureCode + [CRITICALITY &criticality] +} + +-- ************************************************************** +-- +-- Interface PDU Definition +-- +-- ************************************************************** + +E2AP-PDU ::= CHOICE { + initiatingMessage InitiatingMessage, + successfulOutcome SuccessfulOutcome, + unsuccessfulOutcome UnsuccessfulOutcome, + ... +} + +InitiatingMessage ::= SEQUENCE { + procedureCode E2AP-ELEMENTARY-PROCEDURE.&procedureCode ({E2AP-ELEMENTARY-PROCEDURES}), + criticality E2AP-ELEMENTARY-PROCEDURE.&criticality ({E2AP-ELEMENTARY-PROCEDURES}{@procedureCode}), + value E2AP-ELEMENTARY-PROCEDURE.&InitiatingMessage ({E2AP-ELEMENTARY-PROCEDURES}{@procedureCode}) +} + +SuccessfulOutcome ::= SEQUENCE { + procedureCode E2AP-ELEMENTARY-PROCEDURE.&procedureCode ({E2AP-ELEMENTARY-PROCEDURES}), + criticality E2AP-ELEMENTARY-PROCEDURE.&criticality ({E2AP-ELEMENTARY-PROCEDURES}{@procedureCode}), + value E2AP-ELEMENTARY-PROCEDURE.&SuccessfulOutcome ({E2AP-ELEMENTARY-PROCEDURES}{@procedureCode}) +} + +UnsuccessfulOutcome ::= SEQUENCE { + procedureCode E2AP-ELEMENTARY-PROCEDURE.&procedureCode ({E2AP-ELEMENTARY-PROCEDURES}), + criticality E2AP-ELEMENTARY-PROCEDURE.&criticality ({E2AP-ELEMENTARY-PROCEDURES}{@procedureCode}), + value E2AP-ELEMENTARY-PROCEDURE.&UnsuccessfulOutcome ({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 | + e2nodeConfigurationUpdate | + e2connectionUpdate | + reset, + ... +} + +E2AP-ELEMENTARY-PROCEDURES-CLASS-2 E2AP-ELEMENTARY-PROCEDURE ::= { + ricIndication | + ricServiceQuery | + errorIndication | + ricSubscriptionDeleteRequired, + ... +} + +-- ************************************************************** +-- +-- Interface Elementary Procedures +-- +-- ************************************************************** + +-- New for v01.01 +e2connectionUpdate E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE E2connectionUpdate + SUCCESSFUL OUTCOME E2connectionUpdateAcknowledge + UNSUCCESSFUL OUTCOME E2connectionUpdateFailure + PROCEDURE CODE id-E2connectionUpdate + CRITICALITY reject +} + +e2nodeConfigurationUpdate E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE E2nodeConfigurationUpdate + SUCCESSFUL OUTCOME E2nodeConfigurationUpdateAcknowledge + UNSUCCESSFUL OUTCOME E2nodeConfigurationUpdateFailure + PROCEDURE CODE id-E2nodeConfigurationUpdate + CRITICALITY reject +} + +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 ErrorIndication + PROCEDURE CODE id-ErrorIndication + 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 +} + +ricSubscriptionDeleteRequired E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE RICsubscriptionDeleteRequired + PROCEDURE CODE id-RICsubscriptionDeleteRequired + CRITICALITY ignore +} + +END +-- ASN1STOP + diff --git a/e2ap/asn1/informationElementDefinition.asn b/e2ap/asn1/informationElementDefinition.asn new file mode 100644 index 0000000..350ff74 --- /dev/null +++ b/e2ap/asn1/informationElementDefinition.asn @@ -0,0 +1,496 @@ +-- ASN1START +-- ************************************************************** +-- E2AP +-- Information Element Definitions +-- +-- ************************************************************** + +E2AP-IEs { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version2 (2) e2ap(1) e2ap-IEs (2)} + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + Criticality, + Presence, + ProcedureCode, + ProtocolIE-ID, + TriggeringMessage +FROM E2AP-CommonDataTypes + + maxnoofErrors, + maxProtocolIEs +FROM E2AP-Constants; + +-- A + +-- ************************************************************** +-- [New for E2AP v02.00] copied from 3GPP 38.413 (NGAP) IEs +-- ************************************************************** +AMFName ::= PrintableString (SIZE(1..150, ...)) + +-- B +-- C +Cause ::= CHOICE { + ricRequest CauseRICrequest, + ricService CauseRICservice, + e2Node CauseE2node, + transport CauseTransport, + protocol CauseProtocol, + misc CauseMisc, + ... +} + +CauseE2node ::= ENUMERATED { + e2node-component-unknown, + ... +} + +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, + ... +} + +CauseRICrequest ::= ENUMERATED { + ran-function-id-invalid, + action-not-supported, + excessive-actions, + duplicate-action, + duplicate-event-trigger, + function-resource-limit, + request-id-unknown, + inconsistent-action-subsequent-action-sequence, + control-message-invalid, + ric-call-process-id-invalid, + control-timer-expired, + control-failed-to-execute, + system-not-ready, + unspecified, + ... +} + +CauseRICservice ::= ENUMERATED{ + ran-function-not-supported, + excessive-functions, + ric-resource-limit, + ... +} +CauseTransport ::= ENUMERATED { + unspecified, + transport-resource-unavailable, + ... +} + +-- ************************************************************** +-- copied from 3GPP 38.413 (NGAP) IEs +-- note: ie-Extensions removed +-- ************************************************************** +CriticalityDiagnostics ::= SEQUENCE { + procedureCode ProcedureCode OPTIONAL, + triggeringMessage TriggeringMessage OPTIONAL, + procedureCriticality Criticality OPTIONAL, + ricRequestorID RICrequestID OPTIONAL, + iEsCriticalityDiagnostics CriticalityDiagnostics-IE-List OPTIONAL, + ... +} + +CriticalityDiagnostics-IE-List ::= SEQUENCE (SIZE(1..maxnoofErrors)) OF CriticalityDiagnostics-IE-Item + +CriticalityDiagnostics-IE-Item ::= SEQUENCE { + iECriticality Criticality, + iE-ID ProtocolIE-ID, + typeOfError TypeOfError, + ... +} + +-- D +-- E + +-- Following IE used to carry 3GPP defined SETUP and RAN Configuration messages defined in F1AP, E1AP, XnAP, etc. +E2nodeComponentConfiguration ::= SEQUENCE{ + e2nodeComponentRequestPart OCTET STRING, + e2nodeComponentResponsePart OCTET STRING, + ... +} + +E2nodeComponentConfigurationAck ::= SEQUENCE{ + updateOutcome ENUMERATED {success, failure, ...}, + failureCause Cause OPTIONAL, + ... +} + +E2nodeComponentInterfaceType ::= ENUMERATED {ng, xn, e1, f1, w1, s1, x2,...} + +E2nodeComponentID ::= CHOICE{ + e2nodeComponentInterfaceTypeNG E2nodeComponentInterfaceNG, + e2nodeComponentInterfaceTypeXn E2nodeComponentInterfaceXn, + e2nodeComponentInterfaceTypeE1 E2nodeComponentInterfaceE1, + e2nodeComponentInterfaceTypeF1 E2nodeComponentInterfaceF1, + e2nodeComponentInterfaceTypeW1 E2nodeComponentInterfaceW1, + e2nodeComponentInterfaceTypeS1 E2nodeComponentInterfaceS1, + e2nodeComponentInterfaceTypeX2 E2nodeComponentInterfaceX2, + ... +} + +E2nodeComponentInterfaceE1 ::= SEQUENCE{ + gNB-CU-CP-ID GNB-CU-UP-ID, + ... +} + +E2nodeComponentInterfaceF1 ::= SEQUENCE{ + gNB-DU-ID GNB-DU-ID, + ... +} + +E2nodeComponentInterfaceNG ::= SEQUENCE{ + amf-name AMFName, + ... +} + +E2nodeComponentInterfaceS1 ::= SEQUENCE{ + mme-name MMEname, + ... +} + +E2nodeComponentInterfaceX2 ::= SEQUENCE{ + global-eNB-ID GlobalENB-ID OPTIONAL, + global-en-gNB-ID GlobalenGNB-ID OPTIONAL, + ... +} + +E2nodeComponentInterfaceXn ::= SEQUENCE{ + global-NG-RAN-Node-ID GlobalNG-RANNode-ID, + ... +} + +E2nodeComponentInterfaceW1 ::= SEQUENCE{ + ng-eNB-DU-ID NGENB-DU-ID, + ... +} + +-- ************************************************************** +-- copied from 3GPP 36.423 (X2AP) IEs +-- 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 (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 36.423 (X2AP) IEs +-- 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-en-gNB-ID GlobalenGNB-ID, + en-gNB-CU-UP-ID GNB-CU-UP-ID OPTIONAL, + en-gNB-DU-ID GNB-DU-ID OPTIONAL, + ... +} +GlobalE2node-eNB-ID ::= SEQUENCE{ + global-eNB-ID GlobalENB-ID, + ... +} +GlobalE2node-gNB-ID ::= SEQUENCE{ + global-gNB-ID GlobalgNB-ID, + global-en-gNB-ID GlobalenGNB-ID OPTIONAL, + gNB-CU-UP-ID GNB-CU-UP-ID OPTIONAL, + gNB-DU-ID GNB-DU-ID OPTIONAL, + ... +} +GlobalE2node-ng-eNB-ID ::= SEQUENCE{ + global-ng-eNB-ID GlobalngeNB-ID, + global-eNB-ID GlobalENB-ID OPTIONAL, + ngENB-DU-ID NGENB-DU-ID OPTIONAL, + ... +} +-- ************************************************************** +-- copied from 3GPP 36.423 (X2AP) IEs +-- note: ie-Extensions removed +-- ************************************************************** + +GlobalENB-ID ::= SEQUENCE { + pLMN-Identity PLMN-Identity, + eNB-ID ENB-ID, + ... +} +-- ************************************************************** +-- copied from 3GPP 36.423 (X2AP) IEs +-- Note: to avoid duplicate names with XnAP, GNB-ID renamed ENGNB-ID, GlobalGNB-ID renamed GlobalenGNB-ID +-- ************************************************************** +GlobalenGNB-ID ::= SEQUENCE { + pLMN-Identity PLMN-Identity, + gNB-ID ENGNB-ID, + ... +} +-- ************************************************************** +-- copied from 3GPP 38.423 (XnAP) IEs +-- ************************************************************** +GlobalgNB-ID ::= SEQUENCE { + plmn-id PLMN-Identity, + gnb-id GNB-ID-Choice, + ... +} + + +-- ************************************************************** +-- copied from 3GPP 38.423 (XnAP) IEs +-- ************************************************************** +GlobalngeNB-ID ::= SEQUENCE { + plmn-id PLMN-Identity, + enb-id ENB-ID-Choice, + ... +} + +-- ************************************************************** +-- [NEW for E2AP v02.00] copied from 3GPP 38.423 (XnAP) IEs +-- Note: extension field removed +-- ************************************************************** + +GlobalNG-RANNode-ID ::= CHOICE { + gNB GlobalgNB-ID, + ng-eNB GlobalngeNB-ID, + ... +} + +GlobalRIC-ID ::= SEQUENCE{ + pLMN-Identity PLMN-Identity, + ric-ID BIT STRING (SIZE (20)), + ... +} + +-- ************************************************************** +-- copied from 3GPP 38.463 (E1AP) IEs +-- ************************************************************** +GNB-CU-UP-ID::= INTEGER (0..68719476735) +GNB-DU-ID::= INTEGER (0..68719476735) + +-- ************************************************************** +-- copied from 3GPP 38.423 (XnAP) IEs +-- ************************************************************** +GNB-ID-Choice ::= CHOICE { + gnb-ID BIT STRING (SIZE(22..32)), + ... +} +-- H +-- I +-- J +-- K +-- L +-- M + +-- ************************************************************** +-- [New for E2AP v02.00] copied from 3GPP 36.413 (S1AP) IEs +-- ************************************************************** +MMEname ::= PrintableString (SIZE (1..150,...)) + +-- N + +-- ************************************************************** +-- copied from 3GPP 37.473 (W1AP) IEs +-- ************************************************************** +NGENB-DU-ID ::= INTEGER (0..68719476735) + + +-- O +-- P +-- ************************************************************** +-- copied from 3GPP 36.423 (X2AP) IEs +-- ************************************************************** +PLMN-Identity ::= OCTET STRING (SIZE(3)) + +-- Q +-- R +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RANfunctionDefinition ::= OCTET STRING + +RANfunctionID ::= INTEGER (0..4095) + +RANfunctionOID ::= PrintableString(SIZE(1..1000,...)) + +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, + ... +} + +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RICcontrolHeader ::= OCTET STRING + +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RICcontrolMessage ::= OCTET STRING + +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RICcontrolOutcome ::= OCTET STRING + +-- ************************************************************** +-- 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{ + 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 +-- ************************************************************** +TimeToWait ::= ENUMERATED {v1s, v2s, v5s, v10s, v20s, v60s, ...} + + +TNLinformation ::= SEQUENCE{ + tnlAddress BIT STRING (SIZE(1..160,...)), + tnlPort BIT STRING (SIZE(16)) OPTIONAL, + ... +} + +TNLusage ::= ENUMERATED{ric-service, support-function, both, ...} + +TransactionID ::= INTEGER (0..255,...) + +-- ************************************************************** +-- copied from 3GPP 38.413 (NGAP) IEs +-- ************************************************************** +TypeOfError ::= ENUMERATED { + not-understood, + missing, + ... +} + +-- U +-- V +-- W +-- X +-- Y +-- Z + +END +-- ASN1STOP + diff --git a/e2ap/asn1/pduDefinition.asn b/e2ap/asn1/pduDefinition.asn new file mode 100644 index 0000000..c7ff4e0 --- /dev/null +++ b/e2ap/asn1/pduDefinition.asn @@ -0,0 +1,934 @@ +-- ASN1START +-- ************************************************************** +-- +-- PDU definitions for E2AP +-- Derived from 3GPP 38.413 (NGAP) +-- +-- ************************************************************** + +E2AP-PDU-Contents { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version2 (2) e2ap(1) e2ap-PDU-Contents (1) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- ************************************************************** +-- +-- IE parameter types from other modules. +-- +-- ************************************************************** + +IMPORTS + Cause, + CriticalityDiagnostics, + E2nodeComponentConfiguration, + E2nodeComponentConfigurationAck, + E2nodeComponentID, + E2nodeComponentInterfaceType, + GlobalE2node-ID, + GlobalRIC-ID, + RANfunctionDefinition, + RANfunctionID, + RANfunctionOID, + RANfunctionRevision, + RICactionDefinition, + RICactionID, + RICactionType, + RICcallProcessID, + RICcontrolAckRequest, + RICcontrolHeader, + RICcontrolMessage, + RICcontrolOutcome, + RICeventTriggerDefinition, + RICindicationHeader, + RICindicationMessage, + RICindicationSN, + RICindicationType, + RICrequestID, + RICsubsequentAction, + TimeToWait, + TNLinformation, + TNLusage, + TransactionID +FROM E2AP-IEs + + ProtocolIE-Container{}, + ProtocolIE-ContainerList{}, + ProtocolIE-SingleContainer{}, + E2AP-PROTOCOL-IES, + E2AP-PROTOCOL-IES-PAIR +FROM E2AP-Containers + + id-Cause, + id-CriticalityDiagnostics, + id-E2connectionSetup, + id-E2connectionSetupFailed, + id-E2connectionSetupFailed-Item, + id-E2connectionFailed-Item, + id-E2connectionUpdate-Item, + id-E2connectionUpdateAdd, + id-E2connectionUpdateModify, + id-E2connectionUpdateRemove, + id-E2connectionUpdateRemove-Item, + id-E2nodeComponentConfigAddition, + id-E2nodeComponentConfigAddition-Item, + id-E2nodeComponentConfigAdditionAck, + id-E2nodeComponentConfigAdditionAck-Item, + id-E2nodeComponentConfigRemoval, + id-E2nodeComponentConfigRemoval-Item, + id-E2nodeComponentConfigRemovalAck, + id-E2nodeComponentConfigRemovalAck-Item, + id-E2nodeComponentConfigUpdate, + id-E2nodeComponentConfigUpdate-Item, + id-E2nodeComponentConfigUpdateAck, + id-E2nodeComponentConfigUpdateAck-Item, + id-E2nodeTNLassociationRemoval, + id-E2nodeTNLassociationRemoval-Item, + 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-RICindicationHeader, + id-RICindicationMessage, + id-RICindicationSN, + id-RICindicationType, + id-RICrequestID, + id-RICserviceQuery, + id-RICsubscriptionDetails, + id-RICsubscriptionToBeRemoved, + id-RICsubscription-withCause-Item, + id-TimeToWait, + id-TNLinformation, + id-TransactionID, + + maxofE2nodeComponents, + maxofRANfunctionID, + maxofRICactionID, + maxofRICrequestID, + maxofTNLA +FROM E2AP-Constants; + + +-- ************************************************************** +-- +-- MESSAGES FOR NEAR-RT RIC FUNCTIONAL PROCEDURES +-- +-- ************************************************************** + +-- ************************************************************** +-- +-- RIC Subscription Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC SUBSCRIPTION REQUEST +-- +-- ************************************************************** +RICsubscriptionRequest ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{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-SingleContainer { {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-Container{{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-SingleContainer{{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-SingleContainer { {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 Cause, + ... +} + +-- ************************************************************** +-- +-- RIC SUBSCRIPTION FAILURE +-- +-- ************************************************************** +RICsubscriptionFailure ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{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-Cause CRITICALITY reject TYPE Cause PRESENCE mandatory }| + { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- RIC Subscription Delete Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC SUBSCRIPTION DELETE REQUEST +-- +-- ************************************************************** +RICsubscriptionDeleteRequest ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{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-Container {{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-Container {{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-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }| + { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- RIC Subscription Delete Required Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC SUBSCRIPTION DELETE REQUIRED +-- +-- ************************************************************** + +RICsubscriptionDeleteRequired ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{RICsubscriptionDeleteRequired-IEs}}, + ... +} + +RICsubscriptionDeleteRequired-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICsubscriptionToBeRemoved CRITICALITY ignore TYPE RICsubscription-List-withCause PRESENCE mandatory }, + ... +} + +RICsubscription-List-withCause ::= SEQUENCE (SIZE(1..maxofRICrequestID)) OF ProtocolIE-SingleContainer { {RICsubscription-withCause-ItemIEs} } + +RICsubscription-withCause-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-RICsubscription-withCause-Item CRITICALITY ignore TYPE RICsubscription-withCause-Item PRESENCE mandatory }, + ... +} + +RICsubscription-withCause-Item ::= SEQUENCE { + ricRequestID RICrequestID, + ranFunctionID RANfunctionID, + cause Cause, + ... +} + +-- ************************************************************** +-- +-- RIC Indication Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC INDICATION +-- +-- ************************************************************** +RICindication ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{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-Container {{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-Container {{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-RICcontrolOutcome CRITICALITY reject TYPE RICcontrolOutcome PRESENCE optional }, + ... +} +-- ************************************************************** +-- +-- RIC CONTROL FAILURE +-- +-- ************************************************************** +RICcontrolFailure ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{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-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }| + { ID id-RICcontrolOutcome CRITICALITY reject TYPE RICcontrolOutcome PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- MESSAGES FOR GLOBAL PROCEDURES +-- +-- ************************************************************** + +-- ************************************************************** +-- +-- Error Indication Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- ERROR INDICATION +-- +-- ************************************************************** +ErrorIndication ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{ErrorIndication-IEs}}, + ... +} + +ErrorIndication-IEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE optional }| + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE optional }| + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE optional }| + { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE optional }| + { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- E2 Setup Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- E2 SETUP REQUEST +-- +-- ************************************************************** + +E2setupRequest ::= SEQUENCE { + protocolIEs ProtocolIE-Container { {E2setupRequestIEs} }, + ... +} + +E2setupRequestIEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-GlobalE2node-ID CRITICALITY reject TYPE GlobalE2node-ID PRESENCE mandatory }| + { ID id-RANfunctionsAdded CRITICALITY reject TYPE RANfunctions-List PRESENCE mandatory }| + { ID id-E2nodeComponentConfigAddition CRITICALITY reject TYPE E2nodeComponentConfigAddition-List PRESENCE mandatory }, + ... +} + +-- ************************************************************** +-- +-- E2 SETUP RESPONSE +-- +-- ************************************************************** + +E2setupResponse ::= SEQUENCE { + protocolIEs ProtocolIE-Container { {E2setupResponseIEs} }, + ... +} + +E2setupResponseIEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { 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 }| + { ID id-E2nodeComponentConfigAdditionAck CRITICALITY reject TYPE E2nodeComponentConfigAdditionAck-List PRESENCE mandatory }, + ... +} + +-- ************************************************************** +-- +-- E2 SETUP FAILURE +-- +-- ************************************************************** + +E2setupFailure ::= SEQUENCE { + protocolIEs ProtocolIE-Container { {E2setupFailureIEs} }, + ... +} + +E2setupFailureIEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }| + { ID id-TimeToWait CRITICALITY ignore TYPE TimeToWait PRESENCE optional }| + { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional }| + { ID id-TNLinformation CRITICALITY ignore TYPE TNLinformation PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- E2 Connection Update Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- E2 CONNECTION UPDATE +-- +-- ************************************************************** +E2connectionUpdate ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{E2connectionUpdate-IEs}}, + ... +} + +E2connectionUpdate-IEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-E2connectionUpdateAdd CRITICALITY reject TYPE E2connectionUpdate-List PRESENCE optional }| + { ID id-E2connectionUpdateRemove CRITICALITY reject TYPE E2connectionUpdateRemove-List PRESENCE optional }| + { ID id-E2connectionUpdateModify CRITICALITY reject TYPE E2connectionUpdate-List PRESENCE optional }, + ... +} + +E2connectionUpdate-List ::= SEQUENCE (SIZE(1..maxofTNLA)) OF ProtocolIE-SingleContainer { {E2connectionUpdate-ItemIEs} } + +E2connectionUpdate-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-E2connectionUpdate-Item CRITICALITY ignore TYPE E2connectionUpdate-Item PRESENCE mandatory }, + ... +} + +E2connectionUpdate-Item ::= SEQUENCE { + tnlInformation TNLinformation, + tnlUsage TNLusage, + ... +} + +E2connectionUpdateRemove-List ::= SEQUENCE (SIZE(1..maxofTNLA)) OF ProtocolIE-SingleContainer { {E2connectionUpdateRemove-ItemIEs} } + +E2connectionUpdateRemove-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-E2connectionUpdateRemove-Item CRITICALITY ignore TYPE E2connectionUpdateRemove-Item PRESENCE mandatory }, + ... +} + +E2connectionUpdateRemove-Item ::= SEQUENCE { + tnlInformation TNLinformation, + ... +} + + + +-- ************************************************************** +-- +-- E2 CONNECTION UPDATE ACKNOWLEDGE +-- +-- ************************************************************** +E2connectionUpdateAcknowledge ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{E2connectionUpdateAck-IEs}}, + ... +} + +E2connectionUpdateAck-IEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-E2connectionSetup CRITICALITY reject TYPE E2connectionUpdate-List PRESENCE optional }| + { ID id-E2connectionSetupFailed CRITICALITY reject TYPE E2connectionSetupFailed-List PRESENCE optional }, + ... +} + +E2connectionSetupFailed-List ::= SEQUENCE (SIZE(1..maxofTNLA)) OF ProtocolIE-SingleContainer { {E2connectionSetupFailed-ItemIEs} } + +E2connectionSetupFailed-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-E2connectionSetupFailed-Item CRITICALITY ignore TYPE E2connectionSetupFailed-Item PRESENCE mandatory }, + ... +} + +E2connectionSetupFailed-Item ::= SEQUENCE { + tnlInformation TNLinformation, + cause Cause, + ... +} + +-- ************************************************************** +-- +-- E2 CONNECTION UPDATE FAILURE +-- +-- ************************************************************** +E2connectionUpdateFailure ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{E2connectionUpdateFailure-IEs}}, + ... +} + +E2connectionUpdateFailure-IEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-Cause CRITICALITY reject TYPE Cause PRESENCE optional }| + { ID id-TimeToWait CRITICALITY ignore TYPE TimeToWait PRESENCE optional }| + { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- E2 Node Configuration Update Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- E2 NODE CONFIGURATION UPDATE +-- +-- ************************************************************** +E2nodeConfigurationUpdate ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{E2nodeConfigurationUpdate-IEs}}, + ... +} + +E2nodeConfigurationUpdate-IEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-GlobalE2node-ID CRITICALITY reject TYPE GlobalE2node-ID PRESENCE optional }| + { ID id-E2nodeComponentConfigAddition CRITICALITY reject TYPE E2nodeComponentConfigAddition-List PRESENCE optional }| + { ID id-E2nodeComponentConfigUpdate CRITICALITY reject TYPE E2nodeComponentConfigUpdate-List PRESENCE optional }| + { ID id-E2nodeComponentConfigRemoval CRITICALITY reject TYPE E2nodeComponentConfigRemoval-List PRESENCE optional }| + { ID id-E2nodeTNLassociationRemoval CRITICALITY reject TYPE E2nodeTNLassociationRemoval-List PRESENCE optional }, + ... +} + +E2nodeComponentConfigAddition-List ::= SEQUENCE (SIZE(1..maxofE2nodeComponents)) OF ProtocolIE-SingleContainer { {E2nodeComponentConfigAddition-ItemIEs} } + +E2nodeComponentConfigAddition-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-E2nodeComponentConfigAddition-Item CRITICALITY reject TYPE E2nodeComponentConfigAddition-Item PRESENCE mandatory }, + ... +} + +E2nodeComponentConfigAddition-Item ::= SEQUENCE { + e2nodeComponentInterfaceType E2nodeComponentInterfaceType, + e2nodeComponentID E2nodeComponentID, + e2nodeComponentConfiguration E2nodeComponentConfiguration, + ... +} + +E2nodeComponentConfigUpdate-List ::= SEQUENCE (SIZE(1..maxofE2nodeComponents)) OF ProtocolIE-SingleContainer { {E2nodeComponentConfigUpdate-ItemIEs} } + +E2nodeComponentConfigUpdate-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-E2nodeComponentConfigUpdate-Item CRITICALITY reject TYPE E2nodeComponentConfigUpdate-Item PRESENCE mandatory }, + ... +} + +E2nodeComponentConfigUpdate-Item ::= SEQUENCE { + e2nodeComponentInterfaceType E2nodeComponentInterfaceType, + e2nodeComponentID E2nodeComponentID, + e2nodeComponentConfiguration E2nodeComponentConfiguration, + ... +} + +E2nodeComponentConfigRemoval-List ::= SEQUENCE (SIZE(1..maxofE2nodeComponents)) OF ProtocolIE-SingleContainer { {E2nodeComponentConfigRemoval-ItemIEs} } + +E2nodeComponentConfigRemoval-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-E2nodeComponentConfigRemoval-Item CRITICALITY reject TYPE E2nodeComponentConfigRemoval-Item PRESENCE mandatory }, + ... +} + +E2nodeComponentConfigRemoval-Item ::= SEQUENCE { + e2nodeComponentInterfaceType E2nodeComponentInterfaceType, + e2nodeComponentID E2nodeComponentID, + ... +} + +E2nodeTNLassociationRemoval-List ::= SEQUENCE (SIZE(1..maxofTNLA)) OF ProtocolIE-SingleContainer { {E2nodeTNLassociationRemoval-ItemIEs} } + +E2nodeTNLassociationRemoval-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-E2nodeTNLassociationRemoval-Item CRITICALITY reject TYPE E2nodeTNLassociationRemoval-Item PRESENCE mandatory }, + ... +} + +E2nodeTNLassociationRemoval-Item ::= SEQUENCE { + tnlInformation TNLinformation, + tnlInformationRIC TNLinformation, + ... +} + +-- ************************************************************** +-- +-- E2 NODE CONFIGURATION UPDATE ACKNOWLEDGE +-- +-- ************************************************************** +E2nodeConfigurationUpdateAcknowledge ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{E2nodeConfigurationUpdateAcknowledge-IEs}}, + ... +} + +E2nodeConfigurationUpdateAcknowledge-IEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-E2nodeComponentConfigAdditionAck CRITICALITY reject TYPE E2nodeComponentConfigAdditionAck-List PRESENCE optional }| + { ID id-E2nodeComponentConfigUpdateAck CRITICALITY reject TYPE E2nodeComponentConfigUpdateAck-List PRESENCE optional }| + { ID id-E2nodeComponentConfigRemovalAck CRITICALITY reject TYPE E2nodeComponentConfigRemovalAck-List PRESENCE optional }, + ... +} + +E2nodeComponentConfigAdditionAck-List ::= SEQUENCE (SIZE(1..maxofE2nodeComponents)) OF ProtocolIE-SingleContainer { {E2nodeComponentConfigAdditionAck-ItemIEs} } + +E2nodeComponentConfigAdditionAck-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-E2nodeComponentConfigAdditionAck-Item CRITICALITY reject TYPE E2nodeComponentConfigAdditionAck-Item PRESENCE mandatory }, + ... +} + +E2nodeComponentConfigAdditionAck-Item ::= SEQUENCE { + e2nodeComponentInterfaceType E2nodeComponentInterfaceType, + e2nodeComponentID E2nodeComponentID, + e2nodeComponentConfigurationAck E2nodeComponentConfigurationAck, + ... +} + +E2nodeComponentConfigUpdateAck-List ::= SEQUENCE (SIZE(1..maxofE2nodeComponents)) OF ProtocolIE-SingleContainer { {E2nodeComponentConfigUpdateAck-ItemIEs} } + +E2nodeComponentConfigUpdateAck-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-E2nodeComponentConfigUpdateAck-Item CRITICALITY reject TYPE E2nodeComponentConfigUpdateAck-Item PRESENCE mandatory }, + ... +} + +E2nodeComponentConfigUpdateAck-Item ::= SEQUENCE { + e2nodeComponentInterfaceType E2nodeComponentInterfaceType, + e2nodeComponentID E2nodeComponentID, + e2nodeComponentConfigurationAck E2nodeComponentConfigurationAck, + ... +} + +E2nodeComponentConfigRemovalAck-List ::= SEQUENCE (SIZE(1..maxofE2nodeComponents)) OF ProtocolIE-SingleContainer { {E2nodeComponentConfigRemovalAck-ItemIEs} } + +E2nodeComponentConfigRemovalAck-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-E2nodeComponentConfigRemovalAck-Item CRITICALITY reject TYPE E2nodeComponentConfigRemovalAck-Item PRESENCE mandatory }, + ... +} + +E2nodeComponentConfigRemovalAck-Item ::= SEQUENCE { + e2nodeComponentInterfaceType E2nodeComponentInterfaceType, + e2nodeComponentID E2nodeComponentID, + e2nodeComponentConfigurationAck E2nodeComponentConfigurationAck, + ... +} + +-- ************************************************************** +-- +-- E2 NODE CONFIGURATION UPDATE FAILURE +-- +-- ************************************************************** +E2nodeConfigurationUpdateFailure ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{E2nodeConfigurationUpdateFailure-IEs}}, + ... +} + +E2nodeConfigurationUpdateFailure-IEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }| + { ID id-TimeToWait CRITICALITY ignore TYPE TimeToWait PRESENCE optional }| + { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- Reset Elementary Procedure +-- +-- ************************************************************** + +-- ************************************************************** +-- +-- RESET REQUEST +-- +-- ************************************************************** + +ResetRequest ::= SEQUENCE { + protocolIEs ProtocolIE-Container { {ResetRequestIEs} }, + ... +} + +ResetRequestIEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }, + ... +} + +-- ************************************************************** +-- +-- RESET RESPONSE +-- +-- ************************************************************** + +ResetResponse ::= SEQUENCE { + protocolIEs ProtocolIE-Container { {ResetResponseIEs} }, + ... +} + +ResetResponseIEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- RIC Service Update Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC SERVICE UPDATE +-- +-- ************************************************************** +RICserviceUpdate ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{RICserviceUpdate-IEs}}, + ... +} + +RICserviceUpdate-IEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { 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(1..maxofRANfunctionID)) OF ProtocolIE-SingleContainer { {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, + ranFunctionOID RANfunctionOID, + ... +} + +RANfunctionsID-List ::= SEQUENCE (SIZE(1..maxofRANfunctionID)) OF ProtocolIE-SingleContainer{{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-Container {{RICserviceUpdateAcknowledge-IEs}}, + ... +} + +RICserviceUpdateAcknowledge-IEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-RANfunctionsAccepted CRITICALITY reject TYPE RANfunctionsID-List PRESENCE mandatory }| + { ID id-RANfunctionsRejected CRITICALITY reject TYPE RANfunctionsIDcause-List PRESENCE optional }, + ... +} + +RANfunctionsIDcause-List ::= SEQUENCE (SIZE(1..maxofRANfunctionID)) OF ProtocolIE-SingleContainer { {RANfunctionIDcause-ItemIEs} } + +RANfunctionIDcause-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-RANfunctionIEcause-Item CRITICALITY ignore TYPE RANfunctionIDcause-Item PRESENCE mandatory }, + ... +} + + +RANfunctionIDcause-Item ::= SEQUENCE { + ranFunctionID RANfunctionID, + cause Cause, + ... +} + + +-- ************************************************************** +-- +-- RIC SERVICE UPDATE FAILURE +-- +-- ************************************************************** +RICserviceUpdateFailure ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{RICserviceUpdateFailure-IEs}}, + ... +} + +RICserviceUpdateFailure-IEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-Cause CRITICALITY reject TYPE Cause PRESENCE mandatory }| + { ID id-TimeToWait CRITICALITY ignore TYPE TimeToWait PRESENCE optional }| + { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- RIC Service Query Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC SERVICE QUERY +-- +-- ************************************************************** +RICserviceQuery ::= SEQUENCE { + protocolIEs ProtocolIE-Container {{RICserviceQuery-IEs}}, + ... +} + +RICserviceQuery-IEs E2AP-PROTOCOL-IES ::= { + { ID id-TransactionID CRITICALITY reject TYPE TransactionID PRESENCE mandatory }| + { ID id-RANfunctionsAccepted CRITICALITY reject TYPE RANfunctionsID-List PRESENCE optional }, + ... +} + +END +-- ASN1STOP + diff --git a/e2ap/headers/AMFName.h b/e2ap/headers/AMFName.h new file mode 100644 index 0000000..7a686be --- /dev/null +++ b/e2ap/headers/AMFName.h @@ -0,0 +1,47 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _AMFName_H_ +#define _AMFName_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "PrintableString.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* AMFName */ +typedef PrintableString_t AMFName_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_AMFName_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_AMFName; +asn_struct_free_f AMFName_free; +asn_struct_print_f AMFName_print; +asn_constr_check_f AMFName_constraint; +ber_type_decoder_f AMFName_decode_ber; +der_type_encoder_f AMFName_encode_der; +xer_type_decoder_f AMFName_decode_xer; +xer_type_encoder_f AMFName_encode_xer; +jer_type_encoder_f AMFName_encode_jer; +oer_type_decoder_f AMFName_decode_oer; +oer_type_encoder_f AMFName_encode_oer; +per_type_decoder_f AMFName_decode_uper; +per_type_encoder_f AMFName_encode_uper; +per_type_decoder_f AMFName_decode_aper; +per_type_encoder_f AMFName_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _AMFName_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/ANY.h b/e2ap/headers/ANY.h index b30381f..871ed5e 100644 --- a/e2ap/headers/ANY.h +++ b/e2ap/headers/ANY.h @@ -22,23 +22,38 @@ extern asn_TYPE_descriptor_t asn_DEF_ANY; extern asn_TYPE_operation_t asn_OP_ANY; extern asn_OCTET_STRING_specifics_t asn_SPC_ANY_specs; -asn_struct_free_f ANY_free; -asn_struct_print_f ANY_print; -ber_type_decoder_f ANY_decode_ber; -der_type_encoder_f ANY_encode_der; +#define ANY_free OCTET_STRING_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define ANY_print OCTET_STRING_print +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define ANY_compare OCTET_STRING_compare + +#define ANY_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define ANY_decode_ber OCTET_STRING_decode_ber +#define ANY_encode_der OCTET_STRING_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define ANY_decode_xer OCTET_STRING_decode_xer_hex xer_type_encoder_f ANY_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f ANY_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f ANY_decode_uper; per_type_encoder_f ANY_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f ANY_decode_aper; per_type_encoder_f ANY_encode_aper; - -#define ANY_free OCTET_STRING_free -#define ANY_print OCTET_STRING_print -#define ANY_compare OCTET_STRING_compare -#define ANY_constraint asn_generic_no_constraint -#define ANY_decode_ber OCTET_STRING_decode_ber -#define ANY_encode_der OCTET_STRING_encode_der -#define ANY_decode_xer OCTET_STRING_decode_xer_hex +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ /****************************** * Handy conversion routines. * @@ -46,13 +61,17 @@ per_type_encoder_f ANY_encode_aper; /* Convert another ASN.1 type into the ANY. This implies DER encoding. */ int ANY_fromType(ANY_t *, asn_TYPE_descriptor_t *td, void *struct_ptr); -int ANY_fromType_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr); ANY_t *ANY_new_fromType(asn_TYPE_descriptor_t *td, void *struct_ptr); +#if !defined(ASN_DISABLE_APER_SUPPORT) +int ANY_fromType_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr); ANY_t *ANY_new_fromType_aper(asn_TYPE_descriptor_t *td, void *sptr); +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ /* Convert the contents of the ANY type into the specified type. */ int ANY_to_type(ANY_t *, asn_TYPE_descriptor_t *td, void **struct_ptr); +#if !defined(ASN_DISABLE_APER_SUPPORT) int ANY_to_type_aper(ANY_t *, asn_TYPE_descriptor_t *td, void **struct_ptr); +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ #define ANY_fromBuf(s, buf, size) OCTET_STRING_fromBuf((s), (buf), (size)) #define ANY_new_fromBuf(buf, size) OCTET_STRING_new_fromBuf( \ diff --git a/e2ap/headers/BIT_STRING.h b/e2ap/headers/BIT_STRING.h index c1bdbbc..e755fe9 100644 --- a/e2ap/headers/BIT_STRING.h +++ b/e2ap/headers/BIT_STRING.h @@ -24,22 +24,49 @@ 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 */ +#define BIT_STRING_free OCTET_STRING_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +asn_struct_print_f BIT_STRING_print; /* Human-readable output */ +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f BIT_STRING_compare; + asn_constr_check_f BIT_STRING_constraint; + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define BIT_STRING_decode_ber OCTET_STRING_decode_ber +#define BIT_STRING_encode_der OCTET_STRING_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define BIT_STRING_decode_xer OCTET_STRING_decode_xer_binary xer_type_encoder_f BIT_STRING_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f BIT_STRING_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f BIT_STRING_decode_oer; oer_type_encoder_f BIT_STRING_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) 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 +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define BIT_STRING_decode_aper OCTET_STRING_decode_aper +#define BIT_STRING_encode_aper OCTET_STRING_encode_aper +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f BIT_STRING_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +const BIT_STRING_t *BIT_STRING__compactify(const BIT_STRING_t *st, BIT_STRING_t *tmp); #ifdef __cplusplus } diff --git a/e2ap/headers/Cause.h b/e2ap/headers/Cause.h index 7bd7e80..ef3efef 100644 --- a/e2ap/headers/Cause.h +++ b/e2ap/headers/Cause.h @@ -1,23 +1,24 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _Cause_H_ #define _Cause_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include "CauseRIC.h" +#include "CauseRICrequest.h" #include "CauseRICservice.h" +#include "CauseE2node.h" #include "CauseTransport.h" #include "CauseProtocol.h" #include "CauseMisc.h" -#include +#include "constr_CHOICE.h" #ifdef __cplusplus extern "C" { @@ -28,6 +29,7 @@ typedef enum Cause_PR { Cause_PR_NOTHING, /* No components present */ Cause_PR_ricRequest, Cause_PR_ricService, + Cause_PR_e2Node, Cause_PR_transport, Cause_PR_protocol, Cause_PR_misc @@ -39,8 +41,9 @@ typedef enum Cause_PR { typedef struct Cause { Cause_PR present; union Cause_u { - CauseRIC_t ricRequest; + CauseRICrequest_t ricRequest; CauseRICservice_t ricService; + CauseE2node_t e2Node; CauseTransport_t transport; CauseProtocol_t protocol; CauseMisc_t misc; @@ -57,7 +60,7 @@ typedef struct Cause { /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Cause; extern asn_CHOICE_specifics_t asn_SPC_Cause_specs_1; -extern asn_TYPE_member_t asn_MBR_Cause_1[5]; +extern asn_TYPE_member_t asn_MBR_Cause_1[6]; extern asn_per_constraints_t asn_PER_type_Cause_constr_1; #ifdef __cplusplus @@ -65,4 +68,4 @@ extern asn_per_constraints_t asn_PER_type_Cause_constr_1; #endif #endif /* _Cause_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/CauseE2node.h b/e2ap/headers/CauseE2node.h new file mode 100644 index 0000000..afb564e --- /dev/null +++ b/e2ap/headers/CauseE2node.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _CauseE2node_H_ +#define _CauseE2node_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "NativeEnumerated.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseE2node { + CauseE2node_e2node_component_unknown = 0 + /* + * Enumeration is extensible + */ +} e_CauseE2node; + +/* CauseE2node */ +typedef long CauseE2node_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseE2node_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseE2node; +extern const asn_INTEGER_specifics_t asn_SPC_CauseE2node_specs_1; +asn_struct_free_f CauseE2node_free; +asn_struct_print_f CauseE2node_print; +asn_constr_check_f CauseE2node_constraint; +ber_type_decoder_f CauseE2node_decode_ber; +der_type_encoder_f CauseE2node_encode_der; +xer_type_decoder_f CauseE2node_decode_xer; +xer_type_encoder_f CauseE2node_encode_xer; +jer_type_encoder_f CauseE2node_encode_jer; +oer_type_decoder_f CauseE2node_decode_oer; +oer_type_encoder_f CauseE2node_encode_oer; +per_type_decoder_f CauseE2node_decode_uper; +per_type_encoder_f CauseE2node_encode_uper; +per_type_decoder_f CauseE2node_decode_aper; +per_type_encoder_f CauseE2node_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseE2node_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/CauseMisc.h b/e2ap/headers/CauseMisc.h index 1b1efcf..5fbf855 100644 --- a/e2ap/headers/CauseMisc.h +++ b/e2ap/headers/CauseMisc.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _CauseMisc_H_ #define _CauseMisc_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -43,6 +43,7 @@ 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; +jer_type_encoder_f CauseMisc_encode_jer; oer_type_decoder_f CauseMisc_decode_oer; oer_type_encoder_f CauseMisc_encode_oer; per_type_decoder_f CauseMisc_decode_uper; @@ -55,4 +56,4 @@ per_type_encoder_f CauseMisc_encode_aper; #endif #endif /* _CauseMisc_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/CauseProtocol.h b/e2ap/headers/CauseProtocol.h index 8b49178..6f24c46 100644 --- a/e2ap/headers/CauseProtocol.h +++ b/e2ap/headers/CauseProtocol.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _CauseProtocol_H_ #define _CauseProtocol_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -46,6 +46,7 @@ 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; +jer_type_encoder_f CauseProtocol_encode_jer; oer_type_decoder_f CauseProtocol_decode_oer; oer_type_encoder_f CauseProtocol_encode_oer; per_type_decoder_f CauseProtocol_decode_uper; @@ -58,4 +59,4 @@ per_type_encoder_f CauseProtocol_encode_aper; #endif #endif /* _CauseProtocol_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/CauseRIC.h b/e2ap/headers/CauseRIC.h deleted file mode 100644 index 92cbb95..0000000 --- a/e2ap/headers/CauseRIC.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2ap/headers/CauseRICrequest.h b/e2ap/headers/CauseRICrequest.h new file mode 100644 index 0000000..9f68b37 --- /dev/null +++ b/e2ap/headers/CauseRICrequest.h @@ -0,0 +1,69 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _CauseRICrequest_H_ +#define _CauseRICrequest_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "NativeEnumerated.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseRICrequest { + CauseRICrequest_ran_function_id_invalid = 0, + CauseRICrequest_action_not_supported = 1, + CauseRICrequest_excessive_actions = 2, + CauseRICrequest_duplicate_action = 3, + CauseRICrequest_duplicate_event_trigger = 4, + CauseRICrequest_function_resource_limit = 5, + CauseRICrequest_request_id_unknown = 6, + CauseRICrequest_inconsistent_action_subsequent_action_sequence = 7, + CauseRICrequest_control_message_invalid = 8, + CauseRICrequest_ric_call_process_id_invalid = 9, + CauseRICrequest_control_timer_expired = 10, + CauseRICrequest_control_failed_to_execute = 11, + CauseRICrequest_system_not_ready = 12, + CauseRICrequest_unspecified = 13 + /* + * Enumeration is extensible + */ +} e_CauseRICrequest; + +/* CauseRICrequest */ +typedef long CauseRICrequest_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseRICrequest_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseRICrequest; +extern const asn_INTEGER_specifics_t asn_SPC_CauseRICrequest_specs_1; +asn_struct_free_f CauseRICrequest_free; +asn_struct_print_f CauseRICrequest_print; +asn_constr_check_f CauseRICrequest_constraint; +ber_type_decoder_f CauseRICrequest_decode_ber; +der_type_encoder_f CauseRICrequest_encode_der; +xer_type_decoder_f CauseRICrequest_decode_xer; +xer_type_encoder_f CauseRICrequest_encode_xer; +jer_type_encoder_f CauseRICrequest_encode_jer; +oer_type_decoder_f CauseRICrequest_decode_oer; +oer_type_encoder_f CauseRICrequest_encode_oer; +per_type_decoder_f CauseRICrequest_decode_uper; +per_type_encoder_f CauseRICrequest_encode_uper; +per_type_decoder_f CauseRICrequest_decode_aper; +per_type_encoder_f CauseRICrequest_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseRICrequest_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/CauseRICservice.h b/e2ap/headers/CauseRICservice.h index 99ec743..0dd7102 100644 --- a/e2ap/headers/CauseRICservice.h +++ b/e2ap/headers/CauseRICservice.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _CauseRICservice_H_ #define _CauseRICservice_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -20,7 +20,7 @@ extern "C" { /* Dependencies */ typedef enum CauseRICservice { - CauseRICservice_function_not_required = 0, + CauseRICservice_ran_function_not_supported = 0, CauseRICservice_excessive_functions = 1, CauseRICservice_ric_resource_limit = 2 /* @@ -42,6 +42,7 @@ 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; +jer_type_encoder_f CauseRICservice_encode_jer; oer_type_decoder_f CauseRICservice_decode_oer; oer_type_encoder_f CauseRICservice_encode_oer; per_type_decoder_f CauseRICservice_decode_uper; @@ -54,4 +55,4 @@ per_type_encoder_f CauseRICservice_encode_aper; #endif #endif /* _CauseRICservice_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/CauseTransport.h b/e2ap/headers/CauseTransport.h index 5204d28..f534a49 100644 --- a/e2ap/headers/CauseTransport.h +++ b/e2ap/headers/CauseTransport.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _CauseTransport_H_ #define _CauseTransport_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -41,6 +41,7 @@ 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; +jer_type_encoder_f CauseTransport_encode_jer; oer_type_decoder_f CauseTransport_decode_oer; oer_type_encoder_f CauseTransport_encode_oer; per_type_decoder_f CauseTransport_decode_uper; @@ -53,4 +54,4 @@ per_type_encoder_f CauseTransport_encode_aper; #endif #endif /* _CauseTransport_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/Criticality.h b/e2ap/headers/Criticality.h index 3d32aff..629b64e 100644 --- a/e2ap/headers/Criticality.h +++ b/e2ap/headers/Criticality.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP-CommonDataTypes-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "commonDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _Criticality_H_ #define _Criticality_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -39,6 +39,7 @@ ber_type_decoder_f Criticality_decode_ber; der_type_encoder_f Criticality_encode_der; xer_type_decoder_f Criticality_decode_xer; xer_type_encoder_f Criticality_encode_xer; +jer_type_encoder_f Criticality_encode_jer; oer_type_decoder_f Criticality_decode_oer; oer_type_encoder_f Criticality_encode_oer; per_type_decoder_f Criticality_decode_uper; @@ -51,4 +52,4 @@ per_type_encoder_f Criticality_encode_aper; #endif #endif /* _Criticality_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/CriticalityDiagnostics-IE-Item.h b/e2ap/headers/CriticalityDiagnostics-IE-Item.h index 5992ce7..4125a58 100644 --- a/e2ap/headers/CriticalityDiagnostics-IE-Item.h +++ b/e2ap/headers/CriticalityDiagnostics-IE-Item.h @@ -1,21 +1,21 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _CriticalityDiagnostics_IE_Item_H_ #define _CriticalityDiagnostics_IE_Item_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "Criticality.h" #include "ProtocolIE-ID.h" #include "TypeOfError.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -45,4 +45,4 @@ extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_Item_1[3]; #endif #endif /* _CriticalityDiagnostics_IE_Item_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/CriticalityDiagnostics-IE-List.h b/e2ap/headers/CriticalityDiagnostics-IE-List.h index b823da4..81d235c 100644 --- a/e2ap/headers/CriticalityDiagnostics-IE-List.h +++ b/e2ap/headers/CriticalityDiagnostics-IE-List.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _CriticalityDiagnostics_IE_List_H_ #define _CriticalityDiagnostics_IE_List_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" #ifdef __cplusplus extern "C" { @@ -41,4 +41,4 @@ extern asn_per_constraints_t asn_PER_type_CriticalityDiagnostics_IE_List_constr_ #endif #endif /* _CriticalityDiagnostics_IE_List_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/CriticalityDiagnostics.h b/e2ap/headers/CriticalityDiagnostics.h index ae04eef..f99d952 100644 --- a/e2ap/headers/CriticalityDiagnostics.h +++ b/e2ap/headers/CriticalityDiagnostics.h @@ -1,21 +1,21 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _CriticalityDiagnostics_H_ #define _CriticalityDiagnostics_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProcedureCode.h" #include "TriggeringMessage.h" #include "Criticality.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -51,4 +51,4 @@ extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_1[5]; #endif #endif /* _CriticalityDiagnostics_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/E2AP-PDU.h b/e2ap/headers/E2AP-PDU.h index 1cf3fc7..b3a83d4 100644 --- a/e2ap/headers/E2AP-PDU.h +++ b/e2ap/headers/E2AP-PDU.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP-PDU-Descriptions-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "elementryProcedureDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2AP_PDU_H_ #define _E2AP_PDU_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "constr_CHOICE.h" #ifdef __cplusplus extern "C" { @@ -58,4 +58,4 @@ extern asn_TYPE_descriptor_t asn_DEF_E2AP_PDU; #endif #endif /* _E2AP_PDU_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/E2connectionSetupFailed-Item.h b/e2ap/headers/E2connectionSetupFailed-Item.h new file mode 100644 index 0000000..d42cab9 --- /dev/null +++ b/e2ap/headers/E2connectionSetupFailed-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2connectionSetupFailed_Item_H_ +#define _E2connectionSetupFailed_Item_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "TNLinformation.h" +#include "Cause.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2connectionSetupFailed-Item */ +typedef struct E2connectionSetupFailed_Item { + TNLinformation_t tnlInformation; + Cause_t cause; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2connectionSetupFailed_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2connectionSetupFailed_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionSetupFailed_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_E2connectionSetupFailed_Item_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2connectionSetupFailed_Item_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2connectionSetupFailed-List.h b/e2ap/headers/E2connectionSetupFailed-List.h new file mode 100644 index 0000000..78b794f --- /dev/null +++ b/e2ap/headers/E2connectionSetupFailed-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2connectionSetupFailed_List_H_ +#define _E2connectionSetupFailed_List_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainer; + +/* E2connectionSetupFailed-List */ +typedef struct E2connectionSetupFailed_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2connectionSetupFailed_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2connectionSetupFailed_List; +extern asn_SET_OF_specifics_t asn_SPC_E2connectionSetupFailed_List_specs_1; +extern asn_TYPE_member_t asn_MBR_E2connectionSetupFailed_List_1[1]; +extern asn_per_constraints_t asn_PER_type_E2connectionSetupFailed_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2connectionSetupFailed_List_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2connectionUpdate-Item.h b/e2ap/headers/E2connectionUpdate-Item.h new file mode 100644 index 0000000..c291479 --- /dev/null +++ b/e2ap/headers/E2connectionUpdate-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2connectionUpdate_Item_H_ +#define _E2connectionUpdate_Item_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "TNLinformation.h" +#include "TNLusage.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2connectionUpdate-Item */ +typedef struct E2connectionUpdate_Item { + TNLinformation_t tnlInformation; + TNLusage_t tnlUsage; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2connectionUpdate_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdate_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdate_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdate_Item_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2connectionUpdate_Item_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2connectionUpdate-List.h b/e2ap/headers/E2connectionUpdate-List.h new file mode 100644 index 0000000..7a093f1 --- /dev/null +++ b/e2ap/headers/E2connectionUpdate-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2connectionUpdate_List_H_ +#define _E2connectionUpdate_List_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainer; + +/* E2connectionUpdate-List */ +typedef struct E2connectionUpdate_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2connectionUpdate_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdate_List; +extern asn_SET_OF_specifics_t asn_SPC_E2connectionUpdate_List_specs_1; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdate_List_1[1]; +extern asn_per_constraints_t asn_PER_type_E2connectionUpdate_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2connectionUpdate_List_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2connectionUpdate.h b/e2ap/headers/E2connectionUpdate.h new file mode 100644 index 0000000..30b5111 --- /dev/null +++ b/e2ap/headers/E2connectionUpdate.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2connectionUpdate_H_ +#define _E2connectionUpdate_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "ProtocolIE-Container.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2connectionUpdate */ +typedef struct E2connectionUpdate { + ProtocolIE_Container_85P15_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2connectionUpdate_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdate; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdate_specs_1; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdate_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2connectionUpdate_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2connectionUpdateAcknowledge.h b/e2ap/headers/E2connectionUpdateAcknowledge.h new file mode 100644 index 0000000..58be754 --- /dev/null +++ b/e2ap/headers/E2connectionUpdateAcknowledge.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2connectionUpdateAcknowledge_H_ +#define _E2connectionUpdateAcknowledge_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "ProtocolIE-Container.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2connectionUpdateAcknowledge */ +typedef struct E2connectionUpdateAcknowledge { + ProtocolIE_Container_85P16_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2connectionUpdateAcknowledge_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdateAcknowledge; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateAcknowledge_specs_1; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdateAcknowledge_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2connectionUpdateAcknowledge_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2connectionUpdateFailure.h b/e2ap/headers/E2connectionUpdateFailure.h new file mode 100644 index 0000000..6cbaf79 --- /dev/null +++ b/e2ap/headers/E2connectionUpdateFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2connectionUpdateFailure_H_ +#define _E2connectionUpdateFailure_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "ProtocolIE-Container.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2connectionUpdateFailure */ +typedef struct E2connectionUpdateFailure { + ProtocolIE_Container_85P17_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2connectionUpdateFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdateFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdateFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2connectionUpdateFailure_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2connectionUpdateRemove-Item.h b/e2ap/headers/E2connectionUpdateRemove-Item.h new file mode 100644 index 0000000..f8b1caf --- /dev/null +++ b/e2ap/headers/E2connectionUpdateRemove-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2connectionUpdateRemove_Item_H_ +#define _E2connectionUpdateRemove_Item_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "TNLinformation.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2connectionUpdateRemove-Item */ +typedef struct E2connectionUpdateRemove_Item { + TNLinformation_t tnlInformation; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2connectionUpdateRemove_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdateRemove_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateRemove_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdateRemove_Item_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2connectionUpdateRemove_Item_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2connectionUpdateRemove-List.h b/e2ap/headers/E2connectionUpdateRemove-List.h new file mode 100644 index 0000000..633995a --- /dev/null +++ b/e2ap/headers/E2connectionUpdateRemove-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2connectionUpdateRemove_List_H_ +#define _E2connectionUpdateRemove_List_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainer; + +/* E2connectionUpdateRemove-List */ +typedef struct E2connectionUpdateRemove_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2connectionUpdateRemove_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdateRemove_List; +extern asn_SET_OF_specifics_t asn_SPC_E2connectionUpdateRemove_List_specs_1; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdateRemove_List_1[1]; +extern asn_per_constraints_t asn_PER_type_E2connectionUpdateRemove_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2connectionUpdateRemove_List_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigAddition-Item.h b/e2ap/headers/E2nodeComponentConfigAddition-Item.h new file mode 100644 index 0000000..c2a96a0 --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigAddition-Item.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigAddition_Item_H_ +#define _E2nodeComponentConfigAddition_Item_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "E2nodeComponentInterfaceType.h" +#include "E2nodeComponentID.h" +#include "E2nodeComponentConfiguration.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentConfigAddition-Item */ +typedef struct E2nodeComponentConfigAddition_Item { + E2nodeComponentInterfaceType_t e2nodeComponentInterfaceType; + E2nodeComponentID_t e2nodeComponentID; + E2nodeComponentConfiguration_t e2nodeComponentConfiguration; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigAddition_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigAddition_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigAddition_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAddition_Item_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigAddition_Item_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigAddition-List.h b/e2ap/headers/E2nodeComponentConfigAddition-List.h new file mode 100644 index 0000000..f2d465e --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigAddition-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigAddition_List_H_ +#define _E2nodeComponentConfigAddition_List_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainer; + +/* E2nodeComponentConfigAddition-List */ +typedef struct E2nodeComponentConfigAddition_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigAddition_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigAddition_List; +extern asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigAddition_List_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAddition_List_1[1]; +extern asn_per_constraints_t asn_PER_type_E2nodeComponentConfigAddition_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigAddition_List_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigAdditionAck-Item.h b/e2ap/headers/E2nodeComponentConfigAdditionAck-Item.h new file mode 100644 index 0000000..c30f1d2 --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigAdditionAck-Item.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigAdditionAck_Item_H_ +#define _E2nodeComponentConfigAdditionAck_Item_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "E2nodeComponentInterfaceType.h" +#include "E2nodeComponentID.h" +#include "E2nodeComponentConfigurationAck.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentConfigAdditionAck-Item */ +typedef struct E2nodeComponentConfigAdditionAck_Item { + E2nodeComponentInterfaceType_t e2nodeComponentInterfaceType; + E2nodeComponentID_t e2nodeComponentID; + E2nodeComponentConfigurationAck_t e2nodeComponentConfigurationAck; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigAdditionAck_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigAdditionAck_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigAdditionAck_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAdditionAck_Item_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigAdditionAck_Item_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigAdditionAck-List.h b/e2ap/headers/E2nodeComponentConfigAdditionAck-List.h new file mode 100644 index 0000000..acec1aa --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigAdditionAck-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigAdditionAck_List_H_ +#define _E2nodeComponentConfigAdditionAck_List_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainer; + +/* E2nodeComponentConfigAdditionAck-List */ +typedef struct E2nodeComponentConfigAdditionAck_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigAdditionAck_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigAdditionAck_List; +extern asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigAdditionAck_List_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAdditionAck_List_1[1]; +extern asn_per_constraints_t asn_PER_type_E2nodeComponentConfigAdditionAck_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigAdditionAck_List_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigRemoval-Item.h b/e2ap/headers/E2nodeComponentConfigRemoval-Item.h new file mode 100644 index 0000000..bbc8749 --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigRemoval-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigRemoval_Item_H_ +#define _E2nodeComponentConfigRemoval_Item_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "E2nodeComponentInterfaceType.h" +#include "E2nodeComponentID.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentConfigRemoval-Item */ +typedef struct E2nodeComponentConfigRemoval_Item { + E2nodeComponentInterfaceType_t e2nodeComponentInterfaceType; + E2nodeComponentID_t e2nodeComponentID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigRemoval_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigRemoval_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigRemoval_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemoval_Item_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigRemoval_Item_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigRemoval-List.h b/e2ap/headers/E2nodeComponentConfigRemoval-List.h new file mode 100644 index 0000000..4378418 --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigRemoval-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigRemoval_List_H_ +#define _E2nodeComponentConfigRemoval_List_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainer; + +/* E2nodeComponentConfigRemoval-List */ +typedef struct E2nodeComponentConfigRemoval_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigRemoval_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigRemoval_List; +extern asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigRemoval_List_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemoval_List_1[1]; +extern asn_per_constraints_t asn_PER_type_E2nodeComponentConfigRemoval_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigRemoval_List_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigRemovalAck-Item.h b/e2ap/headers/E2nodeComponentConfigRemovalAck-Item.h new file mode 100644 index 0000000..fc24a27 --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigRemovalAck-Item.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigRemovalAck_Item_H_ +#define _E2nodeComponentConfigRemovalAck_Item_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "E2nodeComponentInterfaceType.h" +#include "E2nodeComponentID.h" +#include "E2nodeComponentConfigurationAck.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentConfigRemovalAck-Item */ +typedef struct E2nodeComponentConfigRemovalAck_Item { + E2nodeComponentInterfaceType_t e2nodeComponentInterfaceType; + E2nodeComponentID_t e2nodeComponentID; + E2nodeComponentConfigurationAck_t e2nodeComponentConfigurationAck; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigRemovalAck_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigRemovalAck_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigRemovalAck_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemovalAck_Item_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigRemovalAck_Item_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigRemovalAck-List.h b/e2ap/headers/E2nodeComponentConfigRemovalAck-List.h new file mode 100644 index 0000000..2219198 --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigRemovalAck-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigRemovalAck_List_H_ +#define _E2nodeComponentConfigRemovalAck_List_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainer; + +/* E2nodeComponentConfigRemovalAck-List */ +typedef struct E2nodeComponentConfigRemovalAck_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigRemovalAck_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigRemovalAck_List; +extern asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigRemovalAck_List_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemovalAck_List_1[1]; +extern asn_per_constraints_t asn_PER_type_E2nodeComponentConfigRemovalAck_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigRemovalAck_List_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigUpdate-Item.h b/e2ap/headers/E2nodeComponentConfigUpdate-Item.h new file mode 100644 index 0000000..f1af129 --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigUpdate-Item.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigUpdate_Item_H_ +#define _E2nodeComponentConfigUpdate_Item_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "E2nodeComponentInterfaceType.h" +#include "E2nodeComponentID.h" +#include "E2nodeComponentConfiguration.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentConfigUpdate-Item */ +typedef struct E2nodeComponentConfigUpdate_Item { + E2nodeComponentInterfaceType_t e2nodeComponentInterfaceType; + E2nodeComponentID_t e2nodeComponentID; + E2nodeComponentConfiguration_t e2nodeComponentConfiguration; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigUpdate_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigUpdate_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigUpdate_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdate_Item_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigUpdate_Item_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigUpdate-List.h b/e2ap/headers/E2nodeComponentConfigUpdate-List.h new file mode 100644 index 0000000..c98f72b --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigUpdate-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigUpdate_List_H_ +#define _E2nodeComponentConfigUpdate_List_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainer; + +/* E2nodeComponentConfigUpdate-List */ +typedef struct E2nodeComponentConfigUpdate_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigUpdate_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigUpdate_List; +extern asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigUpdate_List_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdate_List_1[1]; +extern asn_per_constraints_t asn_PER_type_E2nodeComponentConfigUpdate_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigUpdate_List_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigUpdateAck-Item.h b/e2ap/headers/E2nodeComponentConfigUpdateAck-Item.h new file mode 100644 index 0000000..14ef64f --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigUpdateAck-Item.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigUpdateAck_Item_H_ +#define _E2nodeComponentConfigUpdateAck_Item_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "E2nodeComponentInterfaceType.h" +#include "E2nodeComponentID.h" +#include "E2nodeComponentConfigurationAck.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentConfigUpdateAck-Item */ +typedef struct E2nodeComponentConfigUpdateAck_Item { + E2nodeComponentInterfaceType_t e2nodeComponentInterfaceType; + E2nodeComponentID_t e2nodeComponentID; + E2nodeComponentConfigurationAck_t e2nodeComponentConfigurationAck; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigUpdateAck_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigUpdateAck_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigUpdateAck_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdateAck_Item_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigUpdateAck_Item_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigUpdateAck-List.h b/e2ap/headers/E2nodeComponentConfigUpdateAck-List.h new file mode 100644 index 0000000..2e317c2 --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigUpdateAck-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigUpdateAck_List_H_ +#define _E2nodeComponentConfigUpdateAck_List_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainer; + +/* E2nodeComponentConfigUpdateAck-List */ +typedef struct E2nodeComponentConfigUpdateAck_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigUpdateAck_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigUpdateAck_List; +extern asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigUpdateAck_List_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdateAck_List_1[1]; +extern asn_per_constraints_t asn_PER_type_E2nodeComponentConfigUpdateAck_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigUpdateAck_List_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfiguration.h b/e2ap/headers/E2nodeComponentConfiguration.h new file mode 100644 index 0000000..6a1d3da --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfiguration.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfiguration_H_ +#define _E2nodeComponentConfiguration_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "OCTET_STRING.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentConfiguration */ +typedef struct E2nodeComponentConfiguration { + OCTET_STRING_t e2nodeComponentRequestPart; + OCTET_STRING_t e2nodeComponentResponsePart; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfiguration_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfiguration; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfiguration_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfiguration_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfiguration_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentConfigurationAck.h b/e2ap/headers/E2nodeComponentConfigurationAck.h new file mode 100644 index 0000000..441f4b4 --- /dev/null +++ b/e2ap/headers/E2nodeComponentConfigurationAck.h @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentConfigurationAck_H_ +#define _E2nodeComponentConfigurationAck_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "NativeEnumerated.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum E2nodeComponentConfigurationAck__updateOutcome { + E2nodeComponentConfigurationAck__updateOutcome_success = 0, + E2nodeComponentConfigurationAck__updateOutcome_failure = 1 + /* + * Enumeration is extensible + */ +} e_E2nodeComponentConfigurationAck__updateOutcome; + +/* Forward declarations */ +struct Cause; + +/* E2nodeComponentConfigurationAck */ +typedef struct E2nodeComponentConfigurationAck { + long updateOutcome; + struct Cause *failureCause; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentConfigurationAck_t; + +/* Implementation */ +/* extern asn_TYPE_descriptor_t asn_DEF_updateOutcome_2; // (Use -fall-defs-global to expose) */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigurationAck; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigurationAck_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigurationAck_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentConfigurationAck_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentID.h b/e2ap/headers/E2nodeComponentID.h new file mode 100644 index 0000000..c4c0f58 --- /dev/null +++ b/e2ap/headers/E2nodeComponentID.h @@ -0,0 +1,76 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentID_H_ +#define _E2nodeComponentID_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "constr_CHOICE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum E2nodeComponentID_PR { + E2nodeComponentID_PR_NOTHING, /* No components present */ + E2nodeComponentID_PR_e2nodeComponentInterfaceTypeNG, + E2nodeComponentID_PR_e2nodeComponentInterfaceTypeXn, + E2nodeComponentID_PR_e2nodeComponentInterfaceTypeE1, + E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1, + E2nodeComponentID_PR_e2nodeComponentInterfaceTypeW1, + E2nodeComponentID_PR_e2nodeComponentInterfaceTypeS1, + E2nodeComponentID_PR_e2nodeComponentInterfaceTypeX2 + /* Extensions may appear below */ + +} E2nodeComponentID_PR; + +/* Forward declarations */ +struct E2nodeComponentInterfaceNG; +struct E2nodeComponentInterfaceXn; +struct E2nodeComponentInterfaceE1; +struct E2nodeComponentInterfaceF1; +struct E2nodeComponentInterfaceW1; +struct E2nodeComponentInterfaceS1; +struct E2nodeComponentInterfaceX2; + +/* E2nodeComponentID */ +typedef struct E2nodeComponentID { + E2nodeComponentID_PR present; + union E2nodeComponentID_u { + struct E2nodeComponentInterfaceNG *e2nodeComponentInterfaceTypeNG; + struct E2nodeComponentInterfaceXn *e2nodeComponentInterfaceTypeXn; + struct E2nodeComponentInterfaceE1 *e2nodeComponentInterfaceTypeE1; + struct E2nodeComponentInterfaceF1 *e2nodeComponentInterfaceTypeF1; + struct E2nodeComponentInterfaceW1 *e2nodeComponentInterfaceTypeW1; + struct E2nodeComponentInterfaceS1 *e2nodeComponentInterfaceTypeS1; + struct E2nodeComponentInterfaceX2 *e2nodeComponentInterfaceTypeX2; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentID; +extern asn_CHOICE_specifics_t asn_SPC_E2nodeComponentID_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentID_1[7]; +extern asn_per_constraints_t asn_PER_type_E2nodeComponentID_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentID_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentInterfaceE1.h b/e2ap/headers/E2nodeComponentInterfaceE1.h new file mode 100644 index 0000000..d0d4e07 --- /dev/null +++ b/e2ap/headers/E2nodeComponentInterfaceE1.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentInterfaceE1_H_ +#define _E2nodeComponentInterfaceE1_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "GNB-CU-UP-ID.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentInterfaceE1 */ +typedef struct E2nodeComponentInterfaceE1 { + GNB_CU_UP_ID_t gNB_CU_CP_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentInterfaceE1_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentInterfaceE1; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceE1_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceE1_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentInterfaceE1_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentInterfaceF1.h b/e2ap/headers/E2nodeComponentInterfaceF1.h new file mode 100644 index 0000000..b6907fa --- /dev/null +++ b/e2ap/headers/E2nodeComponentInterfaceF1.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentInterfaceF1_H_ +#define _E2nodeComponentInterfaceF1_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "GNB-DU-ID.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentInterfaceF1 */ +typedef struct E2nodeComponentInterfaceF1 { + GNB_DU_ID_t gNB_DU_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentInterfaceF1_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentInterfaceF1; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceF1_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceF1_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentInterfaceF1_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentInterfaceNG.h b/e2ap/headers/E2nodeComponentInterfaceNG.h new file mode 100644 index 0000000..f7b4efe --- /dev/null +++ b/e2ap/headers/E2nodeComponentInterfaceNG.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentInterfaceNG_H_ +#define _E2nodeComponentInterfaceNG_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "AMFName.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentInterfaceNG */ +typedef struct E2nodeComponentInterfaceNG { + AMFName_t amf_name; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentInterfaceNG_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentInterfaceNG; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceNG_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceNG_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentInterfaceNG_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentInterfaceS1.h b/e2ap/headers/E2nodeComponentInterfaceS1.h new file mode 100644 index 0000000..67b174b --- /dev/null +++ b/e2ap/headers/E2nodeComponentInterfaceS1.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentInterfaceS1_H_ +#define _E2nodeComponentInterfaceS1_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "MMEname.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentInterfaceS1 */ +typedef struct E2nodeComponentInterfaceS1 { + MMEname_t mme_name; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentInterfaceS1_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentInterfaceS1; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceS1_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceS1_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentInterfaceS1_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentInterfaceType.h b/e2ap/headers/E2nodeComponentInterfaceType.h new file mode 100644 index 0000000..515bc6d --- /dev/null +++ b/e2ap/headers/E2nodeComponentInterfaceType.h @@ -0,0 +1,62 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentInterfaceType_H_ +#define _E2nodeComponentInterfaceType_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "NativeEnumerated.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum E2nodeComponentInterfaceType { + E2nodeComponentInterfaceType_ng = 0, + E2nodeComponentInterfaceType_xn = 1, + E2nodeComponentInterfaceType_e1 = 2, + E2nodeComponentInterfaceType_f1 = 3, + E2nodeComponentInterfaceType_w1 = 4, + E2nodeComponentInterfaceType_s1 = 5, + E2nodeComponentInterfaceType_x2 = 6 + /* + * Enumeration is extensible + */ +} e_E2nodeComponentInterfaceType; + +/* E2nodeComponentInterfaceType */ +typedef long E2nodeComponentInterfaceType_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_E2nodeComponentInterfaceType_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentInterfaceType; +extern const asn_INTEGER_specifics_t asn_SPC_E2nodeComponentInterfaceType_specs_1; +asn_struct_free_f E2nodeComponentInterfaceType_free; +asn_struct_print_f E2nodeComponentInterfaceType_print; +asn_constr_check_f E2nodeComponentInterfaceType_constraint; +ber_type_decoder_f E2nodeComponentInterfaceType_decode_ber; +der_type_encoder_f E2nodeComponentInterfaceType_encode_der; +xer_type_decoder_f E2nodeComponentInterfaceType_decode_xer; +xer_type_encoder_f E2nodeComponentInterfaceType_encode_xer; +jer_type_encoder_f E2nodeComponentInterfaceType_encode_jer; +oer_type_decoder_f E2nodeComponentInterfaceType_decode_oer; +oer_type_encoder_f E2nodeComponentInterfaceType_encode_oer; +per_type_decoder_f E2nodeComponentInterfaceType_decode_uper; +per_type_encoder_f E2nodeComponentInterfaceType_encode_uper; +per_type_decoder_f E2nodeComponentInterfaceType_decode_aper; +per_type_encoder_f E2nodeComponentInterfaceType_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentInterfaceType_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentInterfaceW1.h b/e2ap/headers/E2nodeComponentInterfaceW1.h new file mode 100644 index 0000000..00d2413 --- /dev/null +++ b/e2ap/headers/E2nodeComponentInterfaceW1.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentInterfaceW1_H_ +#define _E2nodeComponentInterfaceW1_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "NGENB-DU-ID.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentInterfaceW1 */ +typedef struct E2nodeComponentInterfaceW1 { + NGENB_DU_ID_t ng_eNB_DU_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentInterfaceW1_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentInterfaceW1; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceW1_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceW1_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentInterfaceW1_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentInterfaceX2.h b/e2ap/headers/E2nodeComponentInterfaceX2.h new file mode 100644 index 0000000..88ff874 --- /dev/null +++ b/e2ap/headers/E2nodeComponentInterfaceX2.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentInterfaceX2_H_ +#define _E2nodeComponentInterfaceX2_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct GlobalENB_ID; +struct GlobalenGNB_ID; + +/* E2nodeComponentInterfaceX2 */ +typedef struct E2nodeComponentInterfaceX2 { + struct GlobalENB_ID *global_eNB_ID; /* OPTIONAL */ + struct GlobalenGNB_ID *global_en_gNB_ID; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentInterfaceX2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentInterfaceX2; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceX2_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceX2_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentInterfaceX2_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeComponentInterfaceXn.h b/e2ap/headers/E2nodeComponentInterfaceXn.h new file mode 100644 index 0000000..1ae75a2 --- /dev/null +++ b/e2ap/headers/E2nodeComponentInterfaceXn.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeComponentInterfaceXn_H_ +#define _E2nodeComponentInterfaceXn_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "GlobalNG-RANNode-ID.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeComponentInterfaceXn */ +typedef struct E2nodeComponentInterfaceXn { + GlobalNG_RANNode_ID_t global_NG_RAN_Node_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeComponentInterfaceXn_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentInterfaceXn; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceXn_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceXn_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeComponentInterfaceXn_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeConfigurationUpdate.h b/e2ap/headers/E2nodeConfigurationUpdate.h new file mode 100644 index 0000000..0eda6c8 --- /dev/null +++ b/e2ap/headers/E2nodeConfigurationUpdate.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeConfigurationUpdate_H_ +#define _E2nodeConfigurationUpdate_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "ProtocolIE-Container.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeConfigurationUpdate */ +typedef struct E2nodeConfigurationUpdate { + ProtocolIE_Container_85P18_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeConfigurationUpdate_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeConfigurationUpdate; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdate_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdate_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeConfigurationUpdate_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeConfigurationUpdateAcknowledge.h b/e2ap/headers/E2nodeConfigurationUpdateAcknowledge.h new file mode 100644 index 0000000..ce7297a --- /dev/null +++ b/e2ap/headers/E2nodeConfigurationUpdateAcknowledge.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeConfigurationUpdateAcknowledge_H_ +#define _E2nodeConfigurationUpdateAcknowledge_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "ProtocolIE-Container.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeConfigurationUpdateAcknowledge */ +typedef struct E2nodeConfigurationUpdateAcknowledge { + ProtocolIE_Container_85P19_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeConfigurationUpdateAcknowledge_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeConfigurationUpdateAcknowledge; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdateAcknowledge_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdateAcknowledge_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeConfigurationUpdateAcknowledge_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeConfigurationUpdateFailure.h b/e2ap/headers/E2nodeConfigurationUpdateFailure.h new file mode 100644 index 0000000..79e4f47 --- /dev/null +++ b/e2ap/headers/E2nodeConfigurationUpdateFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeConfigurationUpdateFailure_H_ +#define _E2nodeConfigurationUpdateFailure_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "ProtocolIE-Container.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeConfigurationUpdateFailure */ +typedef struct E2nodeConfigurationUpdateFailure { + ProtocolIE_Container_85P20_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeConfigurationUpdateFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeConfigurationUpdateFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdateFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdateFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeConfigurationUpdateFailure_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeTNLassociationRemoval-Item.h b/e2ap/headers/E2nodeTNLassociationRemoval-Item.h new file mode 100644 index 0000000..bcea87b --- /dev/null +++ b/e2ap/headers/E2nodeTNLassociationRemoval-Item.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeTNLassociationRemoval_Item_H_ +#define _E2nodeTNLassociationRemoval_Item_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "TNLinformation.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2nodeTNLassociationRemoval-Item */ +typedef struct E2nodeTNLassociationRemoval_Item { + TNLinformation_t tnlInformation; + TNLinformation_t tnlInformationRIC; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeTNLassociationRemoval_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeTNLassociationRemoval_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeTNLassociationRemoval_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeTNLassociationRemoval_Item_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeTNLassociationRemoval_Item_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2nodeTNLassociationRemoval-List.h b/e2ap/headers/E2nodeTNLassociationRemoval-List.h new file mode 100644 index 0000000..23433a5 --- /dev/null +++ b/e2ap/headers/E2nodeTNLassociationRemoval-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 "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _E2nodeTNLassociationRemoval_List_H_ +#define _E2nodeTNLassociationRemoval_List_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainer; + +/* E2nodeTNLassociationRemoval-List */ +typedef struct E2nodeTNLassociationRemoval_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2nodeTNLassociationRemoval_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2nodeTNLassociationRemoval_List; +extern asn_SET_OF_specifics_t asn_SPC_E2nodeTNLassociationRemoval_List_specs_1; +extern asn_TYPE_member_t asn_MBR_E2nodeTNLassociationRemoval_List_1[1]; +extern asn_per_constraints_t asn_PER_type_E2nodeTNLassociationRemoval_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2nodeTNLassociationRemoval_List_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/E2setupFailure.h b/e2ap/headers/E2setupFailure.h index 9bfcf0b..9a4a9c4 100644 --- a/e2ap/headers/E2setupFailure.h +++ b/e2ap/headers/E2setupFailure.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2setupFailure_H_ #define _E2setupFailure_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* E2setupFailure */ typedef struct E2setupFailure { - ProtocolIE_Container_87P13_t protocolIEs; + ProtocolIE_Container_85P14_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct E2setupFailure { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/E2setupRequest.h b/e2ap/headers/E2setupRequest.h index c70a6a5..6643f12 100644 --- a/e2ap/headers/E2setupRequest.h +++ b/e2ap/headers/E2setupRequest.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2setupRequest_H_ #define _E2setupRequest_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* E2setupRequest */ typedef struct E2setupRequest { - ProtocolIE_Container_87P11_t protocolIEs; + ProtocolIE_Container_85P12_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct E2setupRequest { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/E2setupResponse.h b/e2ap/headers/E2setupResponse.h index f8920af..40ecd73 100644 --- a/e2ap/headers/E2setupResponse.h +++ b/e2ap/headers/E2setupResponse.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2setupResponse_H_ #define _E2setupResponse_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* E2setupResponse */ typedef struct E2setupResponse { - ProtocolIE_Container_87P12_t protocolIEs; + ProtocolIE_Container_85P13_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct E2setupResponse { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/ENB-ID-Choice.h b/e2ap/headers/ENB-ID-Choice.h index 0ccc3ee..626466b 100644 --- a/e2ap/headers/ENB-ID-Choice.h +++ b/e2ap/headers/ENB-ID-Choice.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ENB_ID_Choice_H_ #define _ENB_ID_Choice_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "BIT_STRING.h" +#include "constr_CHOICE.h" #ifdef __cplusplus extern "C" { @@ -57,4 +57,4 @@ extern asn_per_constraints_t asn_PER_type_ENB_ID_Choice_constr_1; #endif #endif /* _ENB_ID_Choice_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/ENB-ID.h b/e2ap/headers/ENB-ID.h index 500a7d2..4b3860e 100644 --- a/e2ap/headers/ENB-ID.h +++ b/e2ap/headers/ENB-ID.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ENB_ID_H_ #define _ENB_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "BIT_STRING.h" +#include "constr_CHOICE.h" #ifdef __cplusplus extern "C" { @@ -58,4 +58,4 @@ extern asn_per_constraints_t asn_PER_type_ENB_ID_constr_1; #endif #endif /* _ENB_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/ENGNB-ID.h b/e2ap/headers/ENGNB-ID.h index 58a8c7c..828c139 100644 --- a/e2ap/headers/ENGNB-ID.h +++ b/e2ap/headers/ENGNB-ID.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ENGNB_ID_H_ #define _ENGNB_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "BIT_STRING.h" +#include "constr_CHOICE.h" #ifdef __cplusplus extern "C" { @@ -53,4 +53,4 @@ extern asn_per_constraints_t asn_PER_type_ENGNB_ID_constr_1; #endif #endif /* _ENGNB_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/EXTERNAL.h b/e2ap/headers/EXTERNAL.h new file mode 100644 index 0000000..fdb5fec --- /dev/null +++ b/e2ap/headers/EXTERNAL.h @@ -0,0 +1,65 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "ASN1C-UsefulInformationObjectClasses" + * found in "/usr/local/share/asn1c/standard-modules/ASN1C-UsefulInformationObjectClasses.asn1" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _EXTERNAL_H_ +#define _EXTERNAL_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "OBJECT_IDENTIFIER.h" +#include "NativeInteger.h" +#include "ObjectDescriptor.h" +#include "ANY.h" +#include "OCTET_STRING.h" +#include "BIT_STRING.h" +#include "constr_CHOICE.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum EXTERNAL__encoding_PR { + EXTERNAL__encoding_PR_NOTHING, /* No components present */ + EXTERNAL__encoding_PR_single_ASN1_type, + EXTERNAL__encoding_PR_octet_aligned, + EXTERNAL__encoding_PR_arbitrary +} EXTERNAL__encoding_PR; + +/* EXTERNAL */ +typedef struct EXTERNAL { + OBJECT_IDENTIFIER_t *direct_reference; /* OPTIONAL */ + long *indirect_reference; /* OPTIONAL */ + ObjectDescriptor_t *data_value_descriptor; /* OPTIONAL */ + struct EXTERNAL__encoding { + EXTERNAL__encoding_PR present; + union EXTERNAL__encoding_u { + ANY_t single_ASN1_type; + OCTET_STRING_t octet_aligned; + BIT_STRING_t arbitrary; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } encoding; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} EXTERNAL_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_EXTERNAL; + +#ifdef __cplusplus +} +#endif + +#endif /* _EXTERNAL_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/ErrorIndication.h b/e2ap/headers/ErrorIndication.h index 88e402e..22598a7 100644 --- a/e2ap/headers/ErrorIndication.h +++ b/e2ap/headers/ErrorIndication.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ErrorIndication_H_ #define _ErrorIndication_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* ErrorIndication */ typedef struct ErrorIndication { - ProtocolIE_Container_87P10_t protocolIEs; + ProtocolIE_Container_85P11_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct ErrorIndication { /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ErrorIndication; +extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_specs_1; +extern asn_TYPE_member_t asn_MBR_ErrorIndication_1[1]; #ifdef __cplusplus } #endif #endif /* _ErrorIndication_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GNB-CU-UP-ID.h b/e2ap/headers/GNB-CU-UP-ID.h index d7df7d8..c80e7fc 100644 --- a/e2ap/headers/GNB-CU-UP-ID.h +++ b/e2ap/headers/GNB-CU-UP-ID.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GNB_CU_UP_ID_H_ #define _GNB_CU_UP_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "INTEGER.h" #ifdef __cplusplus extern "C" { @@ -31,6 +31,7 @@ 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; +jer_type_encoder_f GNB_CU_UP_ID_encode_jer; 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; @@ -43,4 +44,4 @@ per_type_encoder_f GNB_CU_UP_ID_encode_aper; #endif #endif /* _GNB_CU_UP_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GNB-DU-ID.h b/e2ap/headers/GNB-DU-ID.h index b0889fe..7404228 100644 --- a/e2ap/headers/GNB-DU-ID.h +++ b/e2ap/headers/GNB-DU-ID.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GNB_DU_ID_H_ #define _GNB_DU_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "INTEGER.h" #ifdef __cplusplus extern "C" { @@ -31,6 +31,7 @@ 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; +jer_type_encoder_f GNB_DU_ID_encode_jer; 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; @@ -43,4 +44,4 @@ per_type_encoder_f GNB_DU_ID_encode_aper; #endif #endif /* _GNB_DU_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GNB-ID-Choice.h b/e2ap/headers/GNB-ID-Choice.h index ec65f85..4edd2e8 100644 --- a/e2ap/headers/GNB-ID-Choice.h +++ b/e2ap/headers/GNB-ID-Choice.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GNB_ID_Choice_H_ #define _GNB_ID_Choice_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "BIT_STRING.h" +#include "constr_CHOICE.h" #ifdef __cplusplus extern "C" { @@ -53,4 +53,4 @@ extern asn_per_constraints_t asn_PER_type_GNB_ID_Choice_constr_1; #endif #endif /* _GNB_ID_Choice_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GlobalE2node-ID.h b/e2ap/headers/GlobalE2node-ID.h index 843e1c2..f84f251 100644 --- a/e2ap/headers/GlobalE2node-ID.h +++ b/e2ap/headers/GlobalE2node-ID.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalE2node_ID_H_ #define _GlobalE2node_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "constr_CHOICE.h" #ifdef __cplusplus extern "C" { @@ -64,4 +64,4 @@ extern asn_per_constraints_t asn_PER_type_GlobalE2node_ID_constr_1; #endif #endif /* _GlobalE2node_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GlobalE2node-eNB-ID.h b/e2ap/headers/GlobalE2node-eNB-ID.h index c92e774..0df8b82 100644 --- a/e2ap/headers/GlobalE2node-eNB-ID.h +++ b/e2ap/headers/GlobalE2node-eNB-ID.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalE2node_eNB_ID_H_ #define _GlobalE2node_eNB_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "GlobalENB-ID.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -41,4 +41,4 @@ extern asn_TYPE_member_t asn_MBR_GlobalE2node_eNB_ID_1[1]; #endif #endif /* _GlobalE2node_eNB_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GlobalE2node-en-gNB-ID.h b/e2ap/headers/GlobalE2node-en-gNB-ID.h index b13588a..426ed19 100644 --- a/e2ap/headers/GlobalE2node-en-gNB-ID.h +++ b/e2ap/headers/GlobalE2node-en-gNB-ID.h @@ -1,19 +1,21 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalE2node_en_gNB_ID_H_ #define _GlobalE2node_en_gNB_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "GlobalenGNB-ID.h" -#include +#include "GNB-CU-UP-ID.h" +#include "GNB-DU-ID.h" +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +23,9 @@ extern "C" { /* GlobalE2node-en-gNB-ID */ typedef struct GlobalE2node_en_gNB_ID { - GlobalenGNB_ID_t global_gNB_ID; + GlobalenGNB_ID_t global_en_gNB_ID; + GNB_CU_UP_ID_t *en_gNB_CU_UP_ID; /* OPTIONAL */ + GNB_DU_ID_t *en_gNB_DU_ID; /* OPTIONAL */ /* * This type is extensible, * possible extensions are below. @@ -34,11 +38,11 @@ typedef struct GlobalE2node_en_gNB_ID { /* 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]; +extern asn_TYPE_member_t asn_MBR_GlobalE2node_en_gNB_ID_1[3]; #ifdef __cplusplus } #endif #endif /* _GlobalE2node_en_gNB_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GlobalE2node-gNB-ID.h b/e2ap/headers/GlobalE2node-gNB-ID.h index a2121b9..a18fe28 100644 --- a/e2ap/headers/GlobalE2node-gNB-ID.h +++ b/e2ap/headers/GlobalE2node-gNB-ID.h @@ -1,29 +1,33 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalE2node_gNB_ID_H_ #define _GlobalE2node_gNB_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "GlobalgNB-ID.h" #include "GNB-CU-UP-ID.h" #include "GNB-DU-ID.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { #endif +/* Forward declarations */ +struct GlobalenGNB_ID; + /* GlobalE2node-gNB-ID */ typedef struct GlobalE2node_gNB_ID { GlobalgNB_ID_t global_gNB_ID; + struct GlobalenGNB_ID *global_en_gNB_ID; /* OPTIONAL */ GNB_CU_UP_ID_t *gNB_CU_UP_ID; /* OPTIONAL */ GNB_DU_ID_t *gNB_DU_ID; /* OPTIONAL */ /* @@ -38,11 +42,11 @@ typedef struct GlobalE2node_gNB_ID { /* 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]; +extern asn_TYPE_member_t asn_MBR_GlobalE2node_gNB_ID_1[4]; #ifdef __cplusplus } #endif #endif /* _GlobalE2node_gNB_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GlobalE2node-ng-eNB-ID.h b/e2ap/headers/GlobalE2node-ng-eNB-ID.h index 7a3e0f5..7bbc3d5 100644 --- a/e2ap/headers/GlobalE2node-ng-eNB-ID.h +++ b/e2ap/headers/GlobalE2node-ng-eNB-ID.h @@ -1,27 +1,33 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalE2node_ng_eNB_ID_H_ #define _GlobalE2node_ng_eNB_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "GlobalngeNB-ID.h" -#include +#include "NGENB-DU-ID.h" +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { #endif +/* Forward declarations */ +struct GlobalENB_ID; + /* GlobalE2node-ng-eNB-ID */ typedef struct GlobalE2node_ng_eNB_ID { GlobalngeNB_ID_t global_ng_eNB_ID; + struct GlobalENB_ID *global_eNB_ID; /* OPTIONAL */ + NGENB_DU_ID_t *ngENB_DU_ID; /* OPTIONAL */ /* * This type is extensible, * possible extensions are below. @@ -34,11 +40,11 @@ typedef struct GlobalE2node_ng_eNB_ID { /* 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]; +extern asn_TYPE_member_t asn_MBR_GlobalE2node_ng_eNB_ID_1[3]; #ifdef __cplusplus } #endif #endif /* _GlobalE2node_ng_eNB_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GlobalENB-ID.h b/e2ap/headers/GlobalENB-ID.h index 2b6cf1c..5555c4e 100644 --- a/e2ap/headers/GlobalENB-ID.h +++ b/e2ap/headers/GlobalENB-ID.h @@ -1,20 +1,20 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalENB_ID_H_ #define _GlobalENB_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "PLMN-Identity.h" #include "ENB-ID.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -43,4 +43,4 @@ extern asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[2]; #endif #endif /* _GlobalENB_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GlobalNG-RANNode-ID.h b/e2ap/headers/GlobalNG-RANNode-ID.h new file mode 100644 index 0000000..326bcbe --- /dev/null +++ b/e2ap/headers/GlobalNG-RANNode-ID.h @@ -0,0 +1,61 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _GlobalNG_RANNode_ID_H_ +#define _GlobalNG_RANNode_ID_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "constr_CHOICE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum GlobalNG_RANNode_ID_PR { + GlobalNG_RANNode_ID_PR_NOTHING, /* No components present */ + GlobalNG_RANNode_ID_PR_gNB, + GlobalNG_RANNode_ID_PR_ng_eNB + /* Extensions may appear below */ + +} GlobalNG_RANNode_ID_PR; + +/* Forward declarations */ +struct GlobalgNB_ID; +struct GlobalngeNB_ID; + +/* GlobalNG-RANNode-ID */ +typedef struct GlobalNG_RANNode_ID { + GlobalNG_RANNode_ID_PR present; + union GlobalNG_RANNode_ID_u { + struct GlobalgNB_ID *gNB; + struct GlobalngeNB_ID *ng_eNB; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalNG_RANNode_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalNG_RANNode_ID; +extern asn_CHOICE_specifics_t asn_SPC_GlobalNG_RANNode_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalNG_RANNode_ID_1[2]; +extern asn_per_constraints_t asn_PER_type_GlobalNG_RANNode_ID_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalNG_RANNode_ID_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/GlobalRIC-ID.h b/e2ap/headers/GlobalRIC-ID.h index ad389c3..a5a7dee 100644 --- a/e2ap/headers/GlobalRIC-ID.h +++ b/e2ap/headers/GlobalRIC-ID.h @@ -1,20 +1,20 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalRIC_ID_H_ #define _GlobalRIC_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "PLMN-Identity.h" -#include -#include +#include "BIT_STRING.h" +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -43,4 +43,4 @@ extern asn_TYPE_member_t asn_MBR_GlobalRIC_ID_1[2]; #endif #endif /* _GlobalRIC_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GlobalenGNB-ID.h b/e2ap/headers/GlobalenGNB-ID.h index 7df68b1..ae9a86c 100644 --- a/e2ap/headers/GlobalenGNB-ID.h +++ b/e2ap/headers/GlobalenGNB-ID.h @@ -1,20 +1,20 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalenGNB_ID_H_ #define _GlobalenGNB_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "PLMN-Identity.h" #include "ENGNB-ID.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -43,4 +43,4 @@ extern asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[2]; #endif #endif /* _GlobalenGNB_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GlobalgNB-ID.h b/e2ap/headers/GlobalgNB-ID.h index 242edf2..82478b4 100644 --- a/e2ap/headers/GlobalgNB-ID.h +++ b/e2ap/headers/GlobalgNB-ID.h @@ -1,20 +1,20 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalgNB_ID_H_ #define _GlobalgNB_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "PLMN-Identity.h" #include "GNB-ID-Choice.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -43,4 +43,4 @@ extern asn_TYPE_member_t asn_MBR_GlobalgNB_ID_1[2]; #endif #endif /* _GlobalgNB_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GlobalngeNB-ID.h b/e2ap/headers/GlobalngeNB-ID.h index 8aba4cc..9834104 100644 --- a/e2ap/headers/GlobalngeNB-ID.h +++ b/e2ap/headers/GlobalngeNB-ID.h @@ -1,20 +1,20 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalngeNB_ID_H_ #define _GlobalngeNB_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "PLMN-Identity.h" #include "ENB-ID-Choice.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -43,4 +43,4 @@ extern asn_TYPE_member_t asn_MBR_GlobalngeNB_ID_1[2]; #endif #endif /* _GlobalngeNB_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/GraphicString.h b/e2ap/headers/GraphicString.h new file mode 100644 index 0000000..807e9d6 --- /dev/null +++ b/e2ap/headers/GraphicString.h @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _GraphicString_H_ +#define _GraphicString_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef OCTET_STRING_t GraphicString_t; /* Implemented via OCTET STRING */ + +extern asn_TYPE_descriptor_t asn_DEF_GraphicString; +extern asn_TYPE_operation_t asn_OP_GraphicString; + +#define GraphicString_free OCTET_STRING_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define GraphicString_print OCTET_STRING_print +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define GraphicString_compare OCTET_STRING_compare + +#define GraphicString_constraint asn_generic_unknown_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define GraphicString_decode_ber OCTET_STRING_decode_ber +#define GraphicString_encode_der OCTET_STRING_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define GraphicString_decode_xer OCTET_STRING_decode_xer_hex +#define GraphicString_encode_xer OCTET_STRING_encode_xer +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +#define GraphicString_encode_jer OCTET_STRING_encode_jer +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#define GraphicString_decode_uper OCTET_STRING_decode_uper +#define GraphicString_encode_uper OCTET_STRING_encode_uper +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define GraphicString_decode_aper OCTET_STRING_decode_aper +#define GraphicString_encode_aper OCTET_STRING_encode_aper +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#ifdef __cplusplus +} +#endif + +#endif /* _GraphicString_H_ */ diff --git a/e2ap/headers/INTEGER.h b/e2ap/headers/INTEGER.h index f776c07..1666e0b 100644 --- a/e2ap/headers/INTEGER.h +++ b/e2ap/headers/INTEGER.h @@ -35,21 +35,52 @@ typedef struct asn_INTEGER_specifics_s { 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 +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); + +#define INTEGER_free ASN__PRIMITIVE_TYPE_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f INTEGER_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f INTEGER_compare; + +#define INTEGER_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define INTEGER_decode_ber ber_decode_primitive der_type_encoder_f INTEGER_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f INTEGER_decode_xer; xer_type_encoder_f INTEGER_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f INTEGER_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f INTEGER_decode_oer; oer_type_encoder_f INTEGER_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f INTEGER_decode_uper; per_type_encoder_f INTEGER_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f INTEGER_decode_aper; per_type_encoder_f INTEGER_encode_aper; -asn_random_fill_f INTEGER_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f INTEGER_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ /*********************************** * Some handy conversion routines. * @@ -83,8 +114,8 @@ 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 */ + ASN_STRTOX_OK = 0, /* Conversion succeeded, number ends at (*end) */ + ASN_STRTOX_EXTRA_DATA = 1 /* Conversion succeeded, but the string has extra stuff */ }; enum asn_strtox_result_e asn_strtol_lim(const char *str, const char **end, long *l); diff --git a/e2ap/headers/InitiatingMessage.h b/e2ap/headers/InitiatingMessage.h index fd10bc7..42dbfaf 100644 --- a/e2ap/headers/InitiatingMessage.h +++ b/e2ap/headers/InitiatingMessage.h @@ -1,21 +1,21 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP-PDU-Descriptions-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "elementryProcedureDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _InitiatingMessage_H_ #define _InitiatingMessage_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProcedureCode.h" #include "Criticality.h" -#include -#include +#include "ANY.h" +#include "asn_ioc.h" #include "RICsubscriptionRequest.h" #include "RICsubscriptionResponse.h" #include "RICsubscriptionFailure.h" @@ -31,14 +31,21 @@ #include "E2setupRequest.h" #include "E2setupResponse.h" #include "E2setupFailure.h" +#include "E2nodeConfigurationUpdate.h" +#include "E2nodeConfigurationUpdateAcknowledge.h" +#include "E2nodeConfigurationUpdateFailure.h" +#include "E2connectionUpdate.h" +#include "E2connectionUpdateAcknowledge.h" +#include "E2connectionUpdateFailure.h" #include "ResetRequest.h" #include "ResetResponse.h" #include "RICindication.h" #include "RICserviceQuery.h" #include "ErrorIndication.h" -#include -#include -#include +#include "RICsubscriptionDeleteRequired.h" +#include "OPEN_TYPE.h" +#include "constr_CHOICE.h" +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -52,10 +59,13 @@ typedef enum InitiatingMessage__value_PR { InitiatingMessage__value_PR_RICserviceUpdate, InitiatingMessage__value_PR_RICcontrolRequest, InitiatingMessage__value_PR_E2setupRequest, + InitiatingMessage__value_PR_E2nodeConfigurationUpdate, + InitiatingMessage__value_PR_E2connectionUpdate, InitiatingMessage__value_PR_ResetRequest, InitiatingMessage__value_PR_RICindication, InitiatingMessage__value_PR_RICserviceQuery, - InitiatingMessage__value_PR_ErrorIndication + InitiatingMessage__value_PR_ErrorIndication, + InitiatingMessage__value_PR_RICsubscriptionDeleteRequired } InitiatingMessage__value_PR; /* InitiatingMessage */ @@ -70,10 +80,13 @@ typedef struct InitiatingMessage { RICserviceUpdate_t RICserviceUpdate; RICcontrolRequest_t RICcontrolRequest; E2setupRequest_t E2setupRequest; + E2nodeConfigurationUpdate_t E2nodeConfigurationUpdate; + E2connectionUpdate_t E2connectionUpdate; ResetRequest_t ResetRequest; RICindication_t RICindication; RICserviceQuery_t RICserviceQuery; ErrorIndication_t ErrorIndication; + RICsubscriptionDeleteRequired_t RICsubscriptionDeleteRequired; } choice; /* Context for parsing across buffer boundaries */ @@ -94,4 +107,4 @@ extern asn_TYPE_member_t asn_MBR_InitiatingMessage_1[3]; #endif #endif /* _InitiatingMessage_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/MMEname.h b/e2ap/headers/MMEname.h new file mode 100644 index 0000000..20e8239 --- /dev/null +++ b/e2ap/headers/MMEname.h @@ -0,0 +1,47 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _MMEname_H_ +#define _MMEname_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "PrintableString.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* MMEname */ +typedef PrintableString_t MMEname_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_MMEname_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_MMEname; +asn_struct_free_f MMEname_free; +asn_struct_print_f MMEname_print; +asn_constr_check_f MMEname_constraint; +ber_type_decoder_f MMEname_decode_ber; +der_type_encoder_f MMEname_encode_der; +xer_type_decoder_f MMEname_decode_xer; +xer_type_encoder_f MMEname_encode_xer; +jer_type_encoder_f MMEname_encode_jer; +oer_type_decoder_f MMEname_decode_oer; +oer_type_encoder_f MMEname_encode_oer; +per_type_decoder_f MMEname_decode_uper; +per_type_encoder_f MMEname_encode_uper; +per_type_decoder_f MMEname_decode_aper; +per_type_encoder_f MMEname_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _MMEname_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/NGENB-DU-ID.h b/e2ap/headers/NGENB-DU-ID.h new file mode 100644 index 0000000..307863e --- /dev/null +++ b/e2ap/headers/NGENB-DU-ID.h @@ -0,0 +1,47 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _NGENB_DU_ID_H_ +#define _NGENB_DU_ID_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "INTEGER.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* NGENB-DU-ID */ +typedef INTEGER_t NGENB_DU_ID_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_NGENB_DU_ID_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_NGENB_DU_ID; +asn_struct_free_f NGENB_DU_ID_free; +asn_struct_print_f NGENB_DU_ID_print; +asn_constr_check_f NGENB_DU_ID_constraint; +ber_type_decoder_f NGENB_DU_ID_decode_ber; +der_type_encoder_f NGENB_DU_ID_encode_der; +xer_type_decoder_f NGENB_DU_ID_decode_xer; +xer_type_encoder_f NGENB_DU_ID_encode_xer; +jer_type_encoder_f NGENB_DU_ID_encode_jer; +oer_type_decoder_f NGENB_DU_ID_decode_oer; +oer_type_encoder_f NGENB_DU_ID_encode_oer; +per_type_decoder_f NGENB_DU_ID_decode_uper; +per_type_encoder_f NGENB_DU_ID_encode_uper; +per_type_decoder_f NGENB_DU_ID_decode_aper; +per_type_encoder_f NGENB_DU_ID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _NGENB_DU_ID_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/NativeEnumerated.h b/e2ap/headers/NativeEnumerated.h index 459f0e6..0c711e3 100644 --- a/e2ap/headers/NativeEnumerated.h +++ b/e2ap/headers/NativeEnumerated.h @@ -21,22 +21,53 @@ extern "C" { extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; extern asn_TYPE_operation_t asn_OP_NativeEnumerated; +#define NativeEnumerated_free NativeInteger_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define NativeEnumerated_print NativeInteger_print +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define NativeEnumerated_compare NativeInteger_compare + +#define NativeEnumerated_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define NativeEnumerated_decode_ber NativeInteger_decode_ber +#define NativeEnumerated_encode_der NativeInteger_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define NativeEnumerated_decode_xer NativeInteger_decode_xer xer_type_encoder_f NativeEnumerated_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f NativeEnumerated_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f NativeEnumerated_decode_oer; oer_type_encoder_f NativeEnumerated_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f NativeEnumerated_decode_uper; per_type_encoder_f NativeEnumerated_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f NativeEnumerated_decode_aper; per_type_encoder_f NativeEnumerated_encode_aper; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ -#define NativeEnumerated_free NativeInteger_free -#define NativeEnumerated_print NativeInteger_print -#define NativeEnumerated_compare NativeInteger_compare +#if !defined(ASN_DISABLE_RFILL_SUPPORT) #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 +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +int NativeEnumerated__compar_value2enum( + const void *ap, + const void *bp); +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2ap/headers/NativeInteger.h b/e2ap/headers/NativeInteger.h index c74406a..3a47c11 100644 --- a/e2ap/headers/NativeInteger.h +++ b/e2ap/headers/NativeInteger.h @@ -22,22 +22,47 @@ extern "C" { extern asn_TYPE_descriptor_t asn_DEF_NativeInteger; extern asn_TYPE_operation_t asn_OP_NativeInteger; -asn_struct_free_f NativeInteger_free; +asn_struct_free_f NativeInteger_free; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f NativeInteger_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f NativeInteger_compare; + +#define NativeInteger_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f NativeInteger_decode_ber; der_type_encoder_f NativeInteger_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f NativeInteger_decode_xer; xer_type_encoder_f NativeInteger_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f NativeInteger_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f NativeInteger_decode_oer; oer_type_encoder_f NativeInteger_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f NativeInteger_decode_uper; per_type_encoder_f NativeInteger_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f NativeInteger_decode_aper; per_type_encoder_f NativeInteger_encode_aper; -asn_random_fill_f NativeInteger_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ -#define NativeInteger_constraint asn_generic_no_constraint +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f NativeInteger_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2ap/headers/OBJECT_IDENTIFIER.h b/e2ap/headers/OBJECT_IDENTIFIER.h new file mode 100644 index 0000000..f878055 --- /dev/null +++ b/e2ap/headers/OBJECT_IDENTIFIER.h @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _OBJECT_IDENTIFIER_H_ +#define _OBJECT_IDENTIFIER_H_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef uint32_t asn_oid_arc_t; +#define ASN_OID_ARC_MAX (~((asn_oid_arc_t)0)) + +typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t; + +extern asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER; +extern asn_TYPE_operation_t asn_OP_OBJECT_IDENTIFIER; + +ssize_t OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st, + asn_app_consume_bytes_f *cb, + void *app_key); + +#define OBJECT_IDENTIFIER_free ASN__PRIMITIVE_TYPE_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +asn_struct_print_f OBJECT_IDENTIFIER_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define OBJECT_IDENTIFIER_compare OCTET_STRING_compare + +asn_constr_check_f OBJECT_IDENTIFIER_constraint; + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define OBJECT_IDENTIFIER_decode_ber ber_decode_primitive +#define OBJECT_IDENTIFIER_encode_der der_encode_primitive +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +xer_type_decoder_f OBJECT_IDENTIFIER_decode_xer; +xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f OBJECT_IDENTIFIER_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) +#define OBJECT_IDENTIFIER_decode_oer oer_decode_primitive +#define OBJECT_IDENTIFIER_encode_oer oer_encode_primitive +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#define OBJECT_IDENTIFIER_decode_uper OCTET_STRING_decode_uper +#define OBJECT_IDENTIFIER_encode_uper OCTET_STRING_encode_uper +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define OBJECT_IDENTIFIER_decode_aper OCTET_STRING_decode_aper +#define OBJECT_IDENTIFIER_encode_aper OCTET_STRING_encode_aper +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f OBJECT_IDENTIFIER_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +/********************************** + * Some handy conversion routines * + **********************************/ + +/* + * This function fills an (arcs) array with OBJECT IDENTIFIER arcs + * up to specified (arc_slots) elements. + * + * EXAMPLE: + * void print_arcs(OBJECT_IDENTIFIER_t *oid) { + * asn_oid_arc_t fixed_arcs[10]; // Try with fixed space first + * asn_oid_arc_t *arcs = fixed_arcs; + * size_t arc_slots = sizeof(fixed_arcs)/sizeof(fixed_arcs[0]); // 10 + * ssize_t count; // Real number of arcs. + * int i; + * + * count = OBJECT_IDENTIFIER_get_arcs(oid, arcs, arc_slots); + * // If necessary, reallocate arcs array and try again. + * if(count > arc_slots) { + * arc_slots = count; + * arcs = malloc(sizeof(asn_oid_arc_t) * arc_slots); + * if(!arcs) return; + * count = OBJECT_IDENTIFIER_get_arcs(oid, arcs, arc_slots); + * assert(count == arc_slots); + * } + * + * // Print the contents of the arcs array. + * for(i = 0; i < count; i++) + * printf("%"PRIu32"\n", arcs[i]); + * + * // Avoid memory leak. + * if(arcs != fixed_arcs) free(arcs); + * } + * + * RETURN VALUES: + * -1/EINVAL: Invalid arguments (oid is missing) + * -1/ERANGE: One or more arcs have value out of array cell type range. + * >=0: Number of arcs contained in the OBJECT IDENTIFIER + * + * WARNING: The function always returns the actual number of arcs, + * even if there is no sufficient (arc_slots) provided. + */ +ssize_t OBJECT_IDENTIFIER_get_arcs(const OBJECT_IDENTIFIER_t *oid, + asn_oid_arc_t *arcs, size_t arc_slots); + +/* + * This functions initializes the OBJECT IDENTIFIER object with + * the given set of arcs. + * The minimum of two arcs must be present; some restrictions apply. + * RETURN VALUES: + * -1/EINVAL: Invalid arguments + * -1/ERANGE: The first two arcs do not conform to ASN.1 restrictions. + * -1/ENOMEM: Memory allocation failed + * 0: The object was initialized with new arcs. + */ +int OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, + const asn_oid_arc_t *arcs, size_t arcs_count); + + +/* + * Parse the OBJECT IDENTIFIER textual representation ("1.3.6.1.4.1.9363"). + * No arc can exceed the (0..ASN_OID_ARC_MAX, which is the same as UINT32_MAX). + * This function is not specific to OBJECT IDENTIFIER, it may be used to parse + * the RELATIVE-OID data, or any other data consisting of dot-separated + * series of numeric values. + * + * If (oid_txt_length == -1), the strlen() will be invoked to determine the + * size of the (oid_text) string. + * + * After return, the optional (opt_oid_text_end) is set to the character after + * the last parsed one. (opt_oid_text_end) is never less than (oid_text). + * + * RETURN VALUES: + * -1: Parse error. + * >= 0: Number of arcs contained in the OBJECT IDENTIFIER. + * + * WARNING: The function always returns the real number of arcs, + * even if there is no sufficient (arc_slots) provided. + * This is useful for (arc_slots) value estimation. + */ +ssize_t OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, + ssize_t oid_txt_length, + asn_oid_arc_t *arcs, size_t arcs_count, + const char **opt_oid_text_end); + +/* + * Internal functions. + * Used by RELATIVE-OID implementation in particular. + */ + +/* + * Retrieve a single arc of size from the (arcbuf) buffer. + * RETURN VALUES: + * -1: Failed to retrieve the value from the (arcbuf). + * >0: Number of bytes consumed from the (arcbuf), <= (arcbuf_len). + */ +ssize_t OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, + size_t arcbuf_len, + asn_oid_arc_t *ret_value); + +/* + * Write the unterminated arc value into the (arcbuf) which has the size at + * least (arcbuf_len). + * RETURN VALUES: + * -1: (arcbuf_len) size is not sufficient to write the value. + * : Number of bytes appended to the arcbuf (<= arcbuf_len). + */ +ssize_t OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, size_t arcbuf_len, + asn_oid_arc_t arc_value); + +#ifdef __cplusplus +} +#endif + +#endif /* _OBJECT_IDENTIFIER_H_ */ diff --git a/e2ap/headers/OCTET_STRING.h b/e2ap/headers/OCTET_STRING.h index c2f8bae..b1ace14 100644 --- a/e2ap/headers/OCTET_STRING.h +++ b/e2ap/headers/OCTET_STRING.h @@ -22,27 +22,73 @@ 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; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f OCTET_STRING_print; asn_struct_print_f OCTET_STRING_print_utf8; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f OCTET_STRING_compare; + +#define OCTET_STRING_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) 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 */ +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +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; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f OCTET_STRING_encode_jer; +jer_type_encoder_f OCTET_STRING_encode_jer_utf8; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f OCTET_STRING_decode_oer; oer_type_encoder_f OCTET_STRING_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f OCTET_STRING_decode_uper; per_type_encoder_f OCTET_STRING_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) 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 +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f OCTET_STRING_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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); + +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); +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ /****************************** * Handy conversion routines. * ******************************/ @@ -95,6 +141,23 @@ size_t OCTET_STRING_random_length_constrained( const asn_TYPE_descriptor_t *, const asn_encoding_constraints_t *, size_t max_length); +#if !defined(ASN_DISABLE_BER_SUPPORT) +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; +}; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + #ifdef __cplusplus } #endif diff --git a/e2ap/headers/OPEN_TYPE.h b/e2ap/headers/OPEN_TYPE.h index b0d023c..5e97977 100644 --- a/e2ap/headers/OPEN_TYPE.h +++ b/e2ap/headers/OPEN_TYPE.h @@ -6,70 +6,110 @@ #define ASN_OPEN_TYPE_H #include +///////////#include #ifdef __cplusplus extern "C" { #endif +/* + * Decode an Open Type which is potentially constraiend + * by the other members of the parent structure. + */ + +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + #define OPEN_TYPE_free CHOICE_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) #define OPEN_TYPE_print CHOICE_print +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + #define OPEN_TYPE_compare CHOICE_compare + #define OPEN_TYPE_constraint CHOICE_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +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); #define OPEN_TYPE_decode_ber NULL #define OPEN_TYPE_encode_der CHOICE_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +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); #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 +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ -extern asn_TYPE_operation_t asn_OP_OPEN_TYPE; +#if !defined(ASN_DISABLE_JER_SUPPORT) +#define OPEN_TYPE_encode_jer CHOICE_encode_jer +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ -/* - * 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); +#if !defined(ASN_DISABLE_OER_SUPPORT) +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); +#define OPEN_TYPE_decode_oer NULL +#define OPEN_TYPE_encode_oer CHOICE_encode_oer +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) +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); +#define OPEN_TYPE_decode_uper NULL 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); - +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +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); +#define OPEN_TYPE_decode_aper NULL 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); +int OPEN_TYPE_aper_is_unknown_type( + const asn_TYPE_descriptor_t *td, + void *sptr, + const asn_TYPE_member_t *elm); + +asn_dec_rval_t OPEN_TYPE_aper_unknown_type_discard_bytes( + asn_per_data_t *pd); +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +extern asn_TYPE_operation_t asn_OP_OPEN_TYPE; + #ifdef __cplusplus } #endif diff --git a/e2ap/headers/ObjectDescriptor.h b/e2ap/headers/ObjectDescriptor.h new file mode 100644 index 0000000..852c45d --- /dev/null +++ b/e2ap/headers/ObjectDescriptor.h @@ -0,0 +1,54 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _ObjectDescriptor_H_ +#define _ObjectDescriptor_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef GraphicString_t ObjectDescriptor_t; /* Implemented via GraphicString */ + +extern asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor; +extern asn_TYPE_operation_t asn_OP_ObjectDescriptor; + +#define ObjectDescriptor_free OCTET_STRING_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define ObjectDescriptor_print OCTET_STRING_print_utf8 +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define ObjectDescriptor_constraint asn_generic_unknown_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define ObjectDescriptor_decode_ber OCTET_STRING_decode_ber +#define ObjectDescriptor_encode_der OCTET_STRING_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define ObjectDescriptor_decode_xer OCTET_STRING_decode_xer_utf8 +#define ObjectDescriptor_encode_xer OCTET_STRING_encode_xer_utf8 +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +#define ObjectDescriptor_encode_jer OCTET_STRING_encode_jer_utf8 +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#define ObjectDescriptor_decode_uper OCTET_STRING_decode_uper +#define ObjectDescriptor_encode_uper OCTET_STRING_encode_uper +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define ObjectDescriptor_decode_aper OCTET_STRING_decode_aper +#define ObjectDescriptor_encode_aper OCTET_STRING_encode_aper +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ObjectDescriptor_H_ */ diff --git a/e2ap/headers/PLMN-Identity.h b/e2ap/headers/PLMN-Identity.h index 2fb1a85..d3fbb8c 100644 --- a/e2ap/headers/PLMN-Identity.h +++ b/e2ap/headers/PLMN-Identity.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _PLMN_Identity_H_ #define _PLMN_Identity_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "OCTET_STRING.h" #ifdef __cplusplus extern "C" { @@ -31,6 +31,7 @@ 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; +jer_type_encoder_f PLMN_Identity_encode_jer; oer_type_decoder_f PLMN_Identity_decode_oer; oer_type_encoder_f PLMN_Identity_encode_oer; per_type_decoder_f PLMN_Identity_decode_uper; @@ -43,4 +44,4 @@ per_type_encoder_f PLMN_Identity_encode_aper; #endif #endif /* _PLMN_Identity_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/Presence.h b/e2ap/headers/Presence.h index 06713ac..23a2f8d 100644 --- a/e2ap/headers/Presence.h +++ b/e2ap/headers/Presence.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP-CommonDataTypes-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "commonDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _Presence_H_ #define _Presence_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -39,6 +39,7 @@ ber_type_decoder_f Presence_decode_ber; der_type_encoder_f Presence_encode_der; xer_type_decoder_f Presence_decode_xer; xer_type_encoder_f Presence_encode_xer; +jer_type_encoder_f Presence_encode_jer; oer_type_decoder_f Presence_decode_oer; oer_type_encoder_f Presence_encode_oer; per_type_decoder_f Presence_decode_uper; @@ -51,4 +52,4 @@ per_type_encoder_f Presence_encode_aper; #endif #endif /* _Presence_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/PrintableString.h b/e2ap/headers/PrintableString.h new file mode 100644 index 0000000..c24861d --- /dev/null +++ b/e2ap/headers/PrintableString.h @@ -0,0 +1,56 @@ +/*- + * 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; + +#define PrintableString_free OCTET_STRING_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define PrintableString_print OCTET_STRING_print_utf8 +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define PrintableString_compare OCTET_STRING_compare + +asn_constr_check_f PrintableString_constraint; + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define PrintableString_decode_ber OCTET_STRING_decode_ber +#define PrintableString_encode_der OCTET_STRING_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define PrintableString_decode_xer OCTET_STRING_decode_xer_utf8 +#define PrintableString_encode_xer OCTET_STRING_encode_xer_utf8 +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +#define PrintableString_encode_jer OCTET_STRING_encode_jer_utf8 +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#define PrintableString_decode_uper OCTET_STRING_decode_uper +#define PrintableString_encode_uper OCTET_STRING_encode_uper +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define PrintableString_decode_aper OCTET_STRING_decode_aper +#define PrintableString_encode_aper OCTET_STRING_encode_aper +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#ifdef __cplusplus +} +#endif + +#endif /* _PrintableString_H_ */ diff --git a/e2ap/headers/ProcedureCode.h b/e2ap/headers/ProcedureCode.h index 2b76e8b..f75ccb9 100644 --- a/e2ap/headers/ProcedureCode.h +++ b/e2ap/headers/ProcedureCode.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP-CommonDataTypes-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "commonDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ProcedureCode_H_ #define _ProcedureCode_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeInteger.h" #ifdef __cplusplus extern "C" { @@ -31,6 +31,7 @@ ber_type_decoder_f ProcedureCode_decode_ber; der_type_encoder_f ProcedureCode_encode_der; xer_type_decoder_f ProcedureCode_decode_xer; xer_type_encoder_f ProcedureCode_encode_xer; +jer_type_encoder_f ProcedureCode_encode_jer; oer_type_decoder_f ProcedureCode_decode_oer; oer_type_encoder_f ProcedureCode_encode_oer; per_type_decoder_f ProcedureCode_decode_uper; @@ -46,10 +47,13 @@ per_type_encoder_f ProcedureCode_encode_aper; #define ProcedureCode_id_RICserviceUpdate ((ProcedureCode_t)7) #define ProcedureCode_id_RICsubscription ((ProcedureCode_t)8) #define ProcedureCode_id_RICsubscriptionDelete ((ProcedureCode_t)9) +#define ProcedureCode_id_E2nodeConfigurationUpdate ((ProcedureCode_t)10) +#define ProcedureCode_id_E2connectionUpdate ((ProcedureCode_t)11) +#define ProcedureCode_id_RICsubscriptionDeleteRequired ((ProcedureCode_t)12) #ifdef __cplusplus } #endif #endif /* _ProcedureCode_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/ProtocolIE-Container.h b/e2ap/headers/ProtocolIE-Container.h index 361db9c..703ef75 100644 --- a/e2ap/headers/ProtocolIE-Container.h +++ b/e2ap/headers/ProtocolIE-Container.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ProtocolIE_Container_H_ #define _ProtocolIE_Container_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" #ifdef __cplusplus extern "C" { @@ -26,6 +26,7 @@ struct RICsubscriptionFailure_IEs; struct RICsubscriptionDeleteRequest_IEs; struct RICsubscriptionDeleteResponse_IEs; struct RICsubscriptionDeleteFailure_IEs; +struct RICsubscriptionDeleteRequired_IEs; struct RICindication_IEs; struct RICcontrolRequest_IEs; struct RICcontrolAcknowledge_IEs; @@ -34,6 +35,12 @@ struct ErrorIndication_IEs; struct E2setupRequestIEs; struct E2setupResponseIEs; struct E2setupFailureIEs; +struct E2connectionUpdate_IEs; +struct E2connectionUpdateAck_IEs; +struct E2connectionUpdateFailure_IEs; +struct E2nodeConfigurationUpdate_IEs; +struct E2nodeConfigurationUpdateAcknowledge_IEs; +struct E2nodeConfigurationUpdateFailure_IEs; struct ResetRequestIEs; struct ResetResponseIEs; struct RICserviceUpdate_IEs; @@ -42,212 +49,282 @@ struct RICserviceUpdateFailure_IEs; struct RICserviceQuery_IEs; /* ProtocolIE-Container */ -typedef struct ProtocolIE_Container_87P0 { +typedef struct ProtocolIE_Container_85P0 { A_SEQUENCE_OF(struct RICsubscriptionRequest_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P0_t; -typedef struct ProtocolIE_Container_87P1 { +} ProtocolIE_Container_85P0_t; +typedef struct ProtocolIE_Container_85P1 { A_SEQUENCE_OF(struct RICsubscriptionResponse_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P1_t; -typedef struct ProtocolIE_Container_87P2 { +} ProtocolIE_Container_85P1_t; +typedef struct ProtocolIE_Container_85P2 { A_SEQUENCE_OF(struct RICsubscriptionFailure_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P2_t; -typedef struct ProtocolIE_Container_87P3 { +} ProtocolIE_Container_85P2_t; +typedef struct ProtocolIE_Container_85P3 { A_SEQUENCE_OF(struct RICsubscriptionDeleteRequest_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P3_t; -typedef struct ProtocolIE_Container_87P4 { +} ProtocolIE_Container_85P3_t; +typedef struct ProtocolIE_Container_85P4 { A_SEQUENCE_OF(struct RICsubscriptionDeleteResponse_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P4_t; -typedef struct ProtocolIE_Container_87P5 { +} ProtocolIE_Container_85P4_t; +typedef struct ProtocolIE_Container_85P5 { A_SEQUENCE_OF(struct RICsubscriptionDeleteFailure_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P5_t; -typedef struct ProtocolIE_Container_87P6 { +} ProtocolIE_Container_85P5_t; +typedef struct ProtocolIE_Container_85P6 { + A_SEQUENCE_OF(struct RICsubscriptionDeleteRequired_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_Container_85P6_t; +typedef struct ProtocolIE_Container_85P7 { A_SEQUENCE_OF(struct RICindication_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P6_t; -typedef struct ProtocolIE_Container_87P7 { +} ProtocolIE_Container_85P7_t; +typedef struct ProtocolIE_Container_85P8 { A_SEQUENCE_OF(struct RICcontrolRequest_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P7_t; -typedef struct ProtocolIE_Container_87P8 { +} ProtocolIE_Container_85P8_t; +typedef struct ProtocolIE_Container_85P9 { A_SEQUENCE_OF(struct RICcontrolAcknowledge_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P8_t; -typedef struct ProtocolIE_Container_87P9 { +} ProtocolIE_Container_85P9_t; +typedef struct ProtocolIE_Container_85P10 { A_SEQUENCE_OF(struct RICcontrolFailure_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P9_t; -typedef struct ProtocolIE_Container_87P10 { +} ProtocolIE_Container_85P10_t; +typedef struct ProtocolIE_Container_85P11 { A_SEQUENCE_OF(struct ErrorIndication_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P10_t; -typedef struct ProtocolIE_Container_87P11 { +} ProtocolIE_Container_85P11_t; +typedef struct ProtocolIE_Container_85P12 { A_SEQUENCE_OF(struct E2setupRequestIEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P11_t; -typedef struct ProtocolIE_Container_87P12 { +} ProtocolIE_Container_85P12_t; +typedef struct ProtocolIE_Container_85P13 { A_SEQUENCE_OF(struct E2setupResponseIEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P12_t; -typedef struct ProtocolIE_Container_87P13 { +} ProtocolIE_Container_85P13_t; +typedef struct ProtocolIE_Container_85P14 { A_SEQUENCE_OF(struct E2setupFailureIEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P13_t; -typedef struct ProtocolIE_Container_87P14 { +} ProtocolIE_Container_85P14_t; +typedef struct ProtocolIE_Container_85P15 { + A_SEQUENCE_OF(struct E2connectionUpdate_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_Container_85P15_t; +typedef struct ProtocolIE_Container_85P16 { + A_SEQUENCE_OF(struct E2connectionUpdateAck_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_Container_85P16_t; +typedef struct ProtocolIE_Container_85P17 { + A_SEQUENCE_OF(struct E2connectionUpdateFailure_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_Container_85P17_t; +typedef struct ProtocolIE_Container_85P18 { + A_SEQUENCE_OF(struct E2nodeConfigurationUpdate_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_Container_85P18_t; +typedef struct ProtocolIE_Container_85P19 { + A_SEQUENCE_OF(struct E2nodeConfigurationUpdateAcknowledge_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_Container_85P19_t; +typedef struct ProtocolIE_Container_85P20 { + A_SEQUENCE_OF(struct E2nodeConfigurationUpdateFailure_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_Container_85P20_t; +typedef struct ProtocolIE_Container_85P21 { A_SEQUENCE_OF(struct ResetRequestIEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P14_t; -typedef struct ProtocolIE_Container_87P15 { +} ProtocolIE_Container_85P21_t; +typedef struct ProtocolIE_Container_85P22 { A_SEQUENCE_OF(struct ResetResponseIEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P15_t; -typedef struct ProtocolIE_Container_87P16 { +} ProtocolIE_Container_85P22_t; +typedef struct ProtocolIE_Container_85P23 { A_SEQUENCE_OF(struct RICserviceUpdate_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P16_t; -typedef struct ProtocolIE_Container_87P17 { +} ProtocolIE_Container_85P23_t; +typedef struct ProtocolIE_Container_85P24 { A_SEQUENCE_OF(struct RICserviceUpdateAcknowledge_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P17_t; -typedef struct ProtocolIE_Container_87P18 { +} ProtocolIE_Container_85P24_t; +typedef struct ProtocolIE_Container_85P25 { A_SEQUENCE_OF(struct RICserviceUpdateFailure_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P18_t; -typedef struct ProtocolIE_Container_87P19 { +} ProtocolIE_Container_85P25_t; +typedef struct ProtocolIE_Container_85P26 { A_SEQUENCE_OF(struct RICserviceQuery_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_Container_87P19_t; +} ProtocolIE_Container_85P26_t; /* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P0; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P0_specs_1; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P0_1[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P0_constr_1; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P1; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P1_specs_3; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P1_3[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P1_constr_3; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P2; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P2_specs_5; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P2_5[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P2_constr_5; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P3; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P3_specs_7; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P3_7[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P3_constr_7; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P4; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P4_specs_9; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P4_9[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P4_constr_9; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P5; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P5_specs_11; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P5_11[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P5_constr_11; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P6; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P6_specs_13; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P6_13[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P6_constr_13; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P7; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P7_specs_15; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P7_15[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P7_constr_15; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P8; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P8_specs_17; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P8_17[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P8_constr_17; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P9; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P9_specs_19; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P9_19[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P9_constr_19; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P10; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P10_specs_21; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P10_21[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P10_constr_21; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P11; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P11_specs_23; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P11_23[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P11_constr_23; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P12; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P12_specs_25; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P12_25[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P12_constr_25; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P13; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P13_specs_27; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P13_27[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P13_constr_27; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P14; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P14_specs_29; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P14_29[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P14_constr_29; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P15; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P15_specs_31; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P15_31[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P15_constr_31; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P16; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P16_specs_33; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P16_33[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P16_constr_33; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P17; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P17_specs_35; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P17_35[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P17_constr_35; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P18; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P18_specs_37; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P18_37[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P18_constr_37; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P19; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P19_specs_39; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P19_39[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P19_constr_39; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P0; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P0_specs_1; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P0_1[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P0_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P1; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P1_specs_3; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P1_3[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P1_constr_3; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P2; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P2_specs_5; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P2_5[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P2_constr_5; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P3; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P3_specs_7; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P3_7[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P3_constr_7; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P4; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P4_specs_9; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P4_9[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P4_constr_9; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P5; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P5_specs_11; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P5_11[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P5_constr_11; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P6; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P6_specs_13; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P6_13[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P6_constr_13; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P7; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P7_specs_15; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P7_15[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P7_constr_15; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P8; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P8_specs_17; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P8_17[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P8_constr_17; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P9; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P9_specs_19; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P9_19[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P9_constr_19; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P10; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P10_specs_21; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P10_21[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P10_constr_21; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P11; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P11_specs_23; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P11_23[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P11_constr_23; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P12; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P12_specs_25; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P12_25[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P12_constr_25; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P13; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P13_specs_27; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P13_27[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P13_constr_27; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P14; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P14_specs_29; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P14_29[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P14_constr_29; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P15; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P15_specs_31; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P15_31[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P15_constr_31; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P16; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P16_specs_33; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P16_33[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P16_constr_33; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P17; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P17_specs_35; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P17_35[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P17_constr_35; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P18; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P18_specs_37; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P18_37[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P18_constr_37; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P19; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P19_specs_39; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P19_39[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P19_constr_39; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P20; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P20_specs_41; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P20_41[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P20_constr_41; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P21; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P21_specs_43; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P21_43[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P21_constr_43; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P22; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P22_specs_45; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P22_45[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P22_constr_45; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P23; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P23_specs_47; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P23_47[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P23_constr_47; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P24; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P24_specs_49; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P24_49[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P24_constr_49; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P25; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P25_specs_51; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P25_51[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P25_constr_51; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P26; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P26_specs_53; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P26_53[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P26_constr_53; #ifdef __cplusplus } #endif #endif /* _ProtocolIE_Container_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/ProtocolIE-ContainerList.h b/e2ap/headers/ProtocolIE-ContainerList.h index 44b1d2a..99777db 100644 --- a/e2ap/headers/ProtocolIE-ContainerList.h +++ b/e2ap/headers/ProtocolIE-ContainerList.h @@ -1,15 +1,15 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ProtocolIE_ContainerList_H_ #define _ProtocolIE_ContainerList_H_ -#include +#include "asn_application.h" #ifdef __cplusplus extern "C" { @@ -20,4 +20,4 @@ extern "C" { #endif #endif /* _ProtocolIE_ContainerList_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/ProtocolIE-ContainerPair.h b/e2ap/headers/ProtocolIE-ContainerPair.h index cac7e26..ec1f4d6 100644 --- a/e2ap/headers/ProtocolIE-ContainerPair.h +++ b/e2ap/headers/ProtocolIE-ContainerPair.h @@ -1,15 +1,15 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ProtocolIE_ContainerPair_H_ #define _ProtocolIE_ContainerPair_H_ -#include +#include "asn_application.h" #ifdef __cplusplus extern "C" { @@ -20,4 +20,4 @@ extern "C" { #endif #endif /* _ProtocolIE_ContainerPair_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/ProtocolIE-ContainerPairList.h b/e2ap/headers/ProtocolIE-ContainerPairList.h index 9d6a2d3..e8cc680 100644 --- a/e2ap/headers/ProtocolIE-ContainerPairList.h +++ b/e2ap/headers/ProtocolIE-ContainerPairList.h @@ -1,15 +1,15 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ProtocolIE_ContainerPairList_H_ #define _ProtocolIE_ContainerPairList_H_ -#include +#include "asn_application.h" #ifdef __cplusplus extern "C" { @@ -20,4 +20,4 @@ extern "C" { #endif #endif /* _ProtocolIE_ContainerPairList_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/ProtocolIE-Field.h b/e2ap/headers/ProtocolIE-Field.h index 8bbef66..c4bf045 100644 --- a/e2ap/headers/ProtocolIE-Field.h +++ b/e2ap/headers/ProtocolIE-Field.h @@ -1,28 +1,39 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ProtocolIE_Field_H_ #define _ProtocolIE_Field_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-ID.h" #include "Criticality.h" -#include -#include +#include "ANY.h" +#include "asn_ioc.h" #include "RICaction-ToBeSetup-Item.h" #include "Presence.h" -#include -#include -#include +#include "OPEN_TYPE.h" +#include "constr_CHOICE.h" +#include "constr_SEQUENCE.h" #include "RICaction-Admitted-Item.h" #include "RICaction-NotAdmitted-Item.h" +#include "RICsubscription-withCause-Item.h" +#include "E2connectionUpdate-Item.h" +#include "E2connectionUpdateRemove-Item.h" +#include "E2connectionSetupFailed-Item.h" +#include "E2nodeComponentConfigAddition-Item.h" +#include "E2nodeComponentConfigUpdate-Item.h" +#include "E2nodeComponentConfigRemoval-Item.h" +#include "E2nodeTNLassociationRemoval-Item.h" +#include "E2nodeComponentConfigAdditionAck-Item.h" +#include "E2nodeComponentConfigUpdateAck-Item.h" +#include "E2nodeComponentConfigRemovalAck-Item.h" #include "RANfunction-Item.h" #include "RANfunctionID-Item.h" #include "RANfunctionIDcause-Item.h" @@ -31,8 +42,9 @@ #include "RICsubscriptionDetails.h" #include "RICaction-Admitted-List.h" #include "RICaction-NotAdmitted-List.h" -#include "CriticalityDiagnostics.h" #include "Cause.h" +#include "CriticalityDiagnostics.h" +#include "RICsubscription-List-withCause.h" #include "RICactionID.h" #include "RICindicationSN.h" #include "RICindicationType.h" @@ -42,14 +54,25 @@ #include "RICcontrolHeader.h" #include "RICcontrolMessage.h" #include "RICcontrolAckRequest.h" -#include "RICcontrolStatus.h" #include "RICcontrolOutcome.h" +#include "TransactionID.h" #include "GlobalE2node-ID.h" #include "RANfunctions-List.h" +#include "E2nodeComponentConfigAddition-List.h" #include "GlobalRIC-ID.h" #include "RANfunctionsID-List.h" #include "RANfunctionsIDcause-List.h" +#include "E2nodeComponentConfigAdditionAck-List.h" #include "TimeToWait.h" +#include "TNLinformation.h" +#include "E2connectionUpdate-List.h" +#include "E2connectionUpdateRemove-List.h" +#include "E2connectionSetupFailed-List.h" +#include "E2nodeComponentConfigUpdate-List.h" +#include "E2nodeComponentConfigRemoval-List.h" +#include "E2nodeTNLassociationRemoval-List.h" +#include "E2nodeComponentConfigUpdateAck-List.h" +#include "E2nodeComponentConfigRemovalAck-List.h" #ifdef __cplusplus extern "C" { @@ -68,6 +91,50 @@ 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 RICsubscription_withCause_ItemIEs__value_PR { + RICsubscription_withCause_ItemIEs__value_PR_NOTHING, /* No components present */ + RICsubscription_withCause_ItemIEs__value_PR_RICsubscription_withCause_Item +} RICsubscription_withCause_ItemIEs__value_PR; +typedef enum E2connectionUpdate_ItemIEs__value_PR { + E2connectionUpdate_ItemIEs__value_PR_NOTHING, /* No components present */ + E2connectionUpdate_ItemIEs__value_PR_E2connectionUpdate_Item +} E2connectionUpdate_ItemIEs__value_PR; +typedef enum E2connectionUpdateRemove_ItemIEs__value_PR { + E2connectionUpdateRemove_ItemIEs__value_PR_NOTHING, /* No components present */ + E2connectionUpdateRemove_ItemIEs__value_PR_E2connectionUpdateRemove_Item +} E2connectionUpdateRemove_ItemIEs__value_PR; +typedef enum E2connectionSetupFailed_ItemIEs__value_PR { + E2connectionSetupFailed_ItemIEs__value_PR_NOTHING, /* No components present */ + E2connectionSetupFailed_ItemIEs__value_PR_E2connectionSetupFailed_Item +} E2connectionSetupFailed_ItemIEs__value_PR; +typedef enum E2nodeComponentConfigAddition_ItemIEs__value_PR { + E2nodeComponentConfigAddition_ItemIEs__value_PR_NOTHING, /* No components present */ + E2nodeComponentConfigAddition_ItemIEs__value_PR_E2nodeComponentConfigAddition_Item +} E2nodeComponentConfigAddition_ItemIEs__value_PR; +typedef enum E2nodeComponentConfigUpdate_ItemIEs__value_PR { + E2nodeComponentConfigUpdate_ItemIEs__value_PR_NOTHING, /* No components present */ + E2nodeComponentConfigUpdate_ItemIEs__value_PR_E2nodeComponentConfigUpdate_Item +} E2nodeComponentConfigUpdate_ItemIEs__value_PR; +typedef enum E2nodeComponentConfigRemoval_ItemIEs__value_PR { + E2nodeComponentConfigRemoval_ItemIEs__value_PR_NOTHING, /* No components present */ + E2nodeComponentConfigRemoval_ItemIEs__value_PR_E2nodeComponentConfigRemoval_Item +} E2nodeComponentConfigRemoval_ItemIEs__value_PR; +typedef enum E2nodeTNLassociationRemoval_ItemIEs__value_PR { + E2nodeTNLassociationRemoval_ItemIEs__value_PR_NOTHING, /* No components present */ + E2nodeTNLassociationRemoval_ItemIEs__value_PR_E2nodeTNLassociationRemoval_Item +} E2nodeTNLassociationRemoval_ItemIEs__value_PR; +typedef enum E2nodeComponentConfigAdditionAck_ItemIEs__value_PR { + E2nodeComponentConfigAdditionAck_ItemIEs__value_PR_NOTHING, /* No components present */ + E2nodeComponentConfigAdditionAck_ItemIEs__value_PR_E2nodeComponentConfigAdditionAck_Item +} E2nodeComponentConfigAdditionAck_ItemIEs__value_PR; +typedef enum E2nodeComponentConfigUpdateAck_ItemIEs__value_PR { + E2nodeComponentConfigUpdateAck_ItemIEs__value_PR_NOTHING, /* No components present */ + E2nodeComponentConfigUpdateAck_ItemIEs__value_PR_E2nodeComponentConfigUpdateAck_Item +} E2nodeComponentConfigUpdateAck_ItemIEs__value_PR; +typedef enum E2nodeComponentConfigRemovalAck_ItemIEs__value_PR { + E2nodeComponentConfigRemovalAck_ItemIEs__value_PR_NOTHING, /* No components present */ + E2nodeComponentConfigRemovalAck_ItemIEs__value_PR_E2nodeComponentConfigRemovalAck_Item +} E2nodeComponentConfigRemovalAck_ItemIEs__value_PR; typedef enum RANfunction_ItemIEs__value_PR { RANfunction_ItemIEs__value_PR_NOTHING, /* No components present */ RANfunction_ItemIEs__value_PR_RANfunction_Item @@ -97,7 +164,7 @@ 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_Cause, RICsubscriptionFailure_IEs__value_PR_CriticalityDiagnostics } RICsubscriptionFailure_IEs__value_PR; typedef enum RICsubscriptionDeleteRequest_IEs__value_PR { @@ -117,6 +184,10 @@ typedef enum RICsubscriptionDeleteFailure_IEs__value_PR { RICsubscriptionDeleteFailure_IEs__value_PR_Cause, RICsubscriptionDeleteFailure_IEs__value_PR_CriticalityDiagnostics } RICsubscriptionDeleteFailure_IEs__value_PR; +typedef enum RICsubscriptionDeleteRequired_IEs__value_PR { + RICsubscriptionDeleteRequired_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionDeleteRequired_IEs__value_PR_RICsubscription_List_withCause +} RICsubscriptionDeleteRequired_IEs__value_PR; typedef enum RICindication_IEs__value_PR { RICindication_IEs__value_PR_NOTHING, /* No components present */ RICindication_IEs__value_PR_RICrequestID, @@ -142,7 +213,6 @@ typedef enum RICcontrolAcknowledge_IEs__value_PR { 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 { @@ -155,6 +225,7 @@ typedef enum RICcontrolFailure_IEs__value_PR { } RICcontrolFailure_IEs__value_PR; typedef enum ErrorIndication_IEs__value_PR { ErrorIndication_IEs__value_PR_NOTHING, /* No components present */ + ErrorIndication_IEs__value_PR_TransactionID, ErrorIndication_IEs__value_PR_RICrequestID, ErrorIndication_IEs__value_PR_RANfunctionID, ErrorIndication_IEs__value_PR_Cause, @@ -162,47 +233,103 @@ typedef enum ErrorIndication_IEs__value_PR { } ErrorIndication_IEs__value_PR; typedef enum E2setupRequestIEs__value_PR { E2setupRequestIEs__value_PR_NOTHING, /* No components present */ + E2setupRequestIEs__value_PR_TransactionID, E2setupRequestIEs__value_PR_GlobalE2node_ID, - E2setupRequestIEs__value_PR_RANfunctions_List + E2setupRequestIEs__value_PR_RANfunctions_List, + E2setupRequestIEs__value_PR_E2nodeComponentConfigAddition_List } E2setupRequestIEs__value_PR; typedef enum E2setupResponseIEs__value_PR { E2setupResponseIEs__value_PR_NOTHING, /* No components present */ + E2setupResponseIEs__value_PR_TransactionID, E2setupResponseIEs__value_PR_GlobalRIC_ID, E2setupResponseIEs__value_PR_RANfunctionsID_List, - E2setupResponseIEs__value_PR_RANfunctionsIDcause_List + E2setupResponseIEs__value_PR_RANfunctionsIDcause_List, + E2setupResponseIEs__value_PR_E2nodeComponentConfigAdditionAck_List } E2setupResponseIEs__value_PR; typedef enum E2setupFailureIEs__value_PR { E2setupFailureIEs__value_PR_NOTHING, /* No components present */ + E2setupFailureIEs__value_PR_TransactionID, E2setupFailureIEs__value_PR_Cause, E2setupFailureIEs__value_PR_TimeToWait, - E2setupFailureIEs__value_PR_CriticalityDiagnostics + E2setupFailureIEs__value_PR_CriticalityDiagnostics, + E2setupFailureIEs__value_PR_TNLinformation } E2setupFailureIEs__value_PR; +typedef enum E2connectionUpdate_IEs__value_PR { + E2connectionUpdate_IEs__value_PR_NOTHING, /* No components present */ + E2connectionUpdate_IEs__value_PR_TransactionID, + E2connectionUpdate_IEs__value_PR_E2connectionUpdate_List, + E2connectionUpdate_IEs__value_PR_E2connectionUpdateRemove_List, + E2connectionUpdate_IEs__value_PR_E2connectionUpdate_List_1 +} E2connectionUpdate_IEs__value_PR; +typedef enum E2connectionUpdateAck_IEs__value_PR { + E2connectionUpdateAck_IEs__value_PR_NOTHING, /* No components present */ + E2connectionUpdateAck_IEs__value_PR_TransactionID, + E2connectionUpdateAck_IEs__value_PR_E2connectionUpdate_List, + E2connectionUpdateAck_IEs__value_PR_E2connectionSetupFailed_List +} E2connectionUpdateAck_IEs__value_PR; +typedef enum E2connectionUpdateFailure_IEs__value_PR { + E2connectionUpdateFailure_IEs__value_PR_NOTHING, /* No components present */ + E2connectionUpdateFailure_IEs__value_PR_TransactionID, + E2connectionUpdateFailure_IEs__value_PR_Cause, + E2connectionUpdateFailure_IEs__value_PR_TimeToWait, + E2connectionUpdateFailure_IEs__value_PR_CriticalityDiagnostics +} E2connectionUpdateFailure_IEs__value_PR; +typedef enum E2nodeConfigurationUpdate_IEs__value_PR { + E2nodeConfigurationUpdate_IEs__value_PR_NOTHING, /* No components present */ + E2nodeConfigurationUpdate_IEs__value_PR_TransactionID, + E2nodeConfigurationUpdate_IEs__value_PR_GlobalE2node_ID, + E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigAddition_List, + E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigUpdate_List, + E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigRemoval_List, + E2nodeConfigurationUpdate_IEs__value_PR_E2nodeTNLassociationRemoval_List +} E2nodeConfigurationUpdate_IEs__value_PR; +typedef enum E2nodeConfigurationUpdateAcknowledge_IEs__value_PR { + E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_NOTHING, /* No components present */ + E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_TransactionID, + E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_E2nodeComponentConfigAdditionAck_List, + E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_E2nodeComponentConfigUpdateAck_List, + E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_E2nodeComponentConfigRemovalAck_List +} E2nodeConfigurationUpdateAcknowledge_IEs__value_PR; +typedef enum E2nodeConfigurationUpdateFailure_IEs__value_PR { + E2nodeConfigurationUpdateFailure_IEs__value_PR_NOTHING, /* No components present */ + E2nodeConfigurationUpdateFailure_IEs__value_PR_TransactionID, + E2nodeConfigurationUpdateFailure_IEs__value_PR_Cause, + E2nodeConfigurationUpdateFailure_IEs__value_PR_TimeToWait, + E2nodeConfigurationUpdateFailure_IEs__value_PR_CriticalityDiagnostics +} E2nodeConfigurationUpdateFailure_IEs__value_PR; typedef enum ResetRequestIEs__value_PR { ResetRequestIEs__value_PR_NOTHING, /* No components present */ + ResetRequestIEs__value_PR_TransactionID, ResetRequestIEs__value_PR_Cause } ResetRequestIEs__value_PR; typedef enum ResetResponseIEs__value_PR { ResetResponseIEs__value_PR_NOTHING, /* No components present */ + ResetResponseIEs__value_PR_TransactionID, ResetResponseIEs__value_PR_CriticalityDiagnostics } ResetResponseIEs__value_PR; typedef enum RICserviceUpdate_IEs__value_PR { RICserviceUpdate_IEs__value_PR_NOTHING, /* No components present */ + RICserviceUpdate_IEs__value_PR_TransactionID, RICserviceUpdate_IEs__value_PR_RANfunctions_List, + RICserviceUpdate_IEs__value_PR_RANfunctions_List_1, 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_TransactionID, 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_TransactionID, + RICserviceUpdateFailure_IEs__value_PR_Cause, RICserviceUpdateFailure_IEs__value_PR_TimeToWait, RICserviceUpdateFailure_IEs__value_PR_CriticalityDiagnostics } RICserviceUpdateFailure_IEs__value_PR; typedef enum RICserviceQuery_IEs__value_PR { RICserviceQuery_IEs__value_PR_NOTHING, /* No components present */ + RICserviceQuery_IEs__value_PR_TransactionID, RICserviceQuery_IEs__value_PR_RANfunctionsID_List } RICserviceQuery_IEs__value_PR; @@ -255,6 +382,182 @@ typedef struct RICaction_NotAdmitted_ItemIEs { /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } RICaction_NotAdmitted_ItemIEs_t; +typedef struct RICsubscription_withCause_ItemIEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct RICsubscription_withCause_ItemIEs__value { + RICsubscription_withCause_ItemIEs__value_PR present; + union RICsubscription_withCause_ItemIEs__value_u { + RICsubscription_withCause_Item_t RICsubscription_withCause_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; +} RICsubscription_withCause_ItemIEs_t; +typedef struct E2connectionUpdate_ItemIEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2connectionUpdate_ItemIEs__value { + E2connectionUpdate_ItemIEs__value_PR present; + union E2connectionUpdate_ItemIEs__value_u { + E2connectionUpdate_Item_t E2connectionUpdate_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; +} E2connectionUpdate_ItemIEs_t; +typedef struct E2connectionUpdateRemove_ItemIEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2connectionUpdateRemove_ItemIEs__value { + E2connectionUpdateRemove_ItemIEs__value_PR present; + union E2connectionUpdateRemove_ItemIEs__value_u { + E2connectionUpdateRemove_Item_t E2connectionUpdateRemove_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; +} E2connectionUpdateRemove_ItemIEs_t; +typedef struct E2connectionSetupFailed_ItemIEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2connectionSetupFailed_ItemIEs__value { + E2connectionSetupFailed_ItemIEs__value_PR present; + union E2connectionSetupFailed_ItemIEs__value_u { + E2connectionSetupFailed_Item_t E2connectionSetupFailed_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; +} E2connectionSetupFailed_ItemIEs_t; +typedef struct E2nodeComponentConfigAddition_ItemIEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2nodeComponentConfigAddition_ItemIEs__value { + E2nodeComponentConfigAddition_ItemIEs__value_PR present; + union E2nodeComponentConfigAddition_ItemIEs__value_u { + E2nodeComponentConfigAddition_Item_t E2nodeComponentConfigAddition_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; +} E2nodeComponentConfigAddition_ItemIEs_t; +typedef struct E2nodeComponentConfigUpdate_ItemIEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2nodeComponentConfigUpdate_ItemIEs__value { + E2nodeComponentConfigUpdate_ItemIEs__value_PR present; + union E2nodeComponentConfigUpdate_ItemIEs__value_u { + E2nodeComponentConfigUpdate_Item_t E2nodeComponentConfigUpdate_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; +} E2nodeComponentConfigUpdate_ItemIEs_t; +typedef struct E2nodeComponentConfigRemoval_ItemIEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2nodeComponentConfigRemoval_ItemIEs__value { + E2nodeComponentConfigRemoval_ItemIEs__value_PR present; + union E2nodeComponentConfigRemoval_ItemIEs__value_u { + E2nodeComponentConfigRemoval_Item_t E2nodeComponentConfigRemoval_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; +} E2nodeComponentConfigRemoval_ItemIEs_t; +typedef struct E2nodeTNLassociationRemoval_ItemIEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2nodeTNLassociationRemoval_ItemIEs__value { + E2nodeTNLassociationRemoval_ItemIEs__value_PR present; + union E2nodeTNLassociationRemoval_ItemIEs__value_u { + E2nodeTNLassociationRemoval_Item_t E2nodeTNLassociationRemoval_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; +} E2nodeTNLassociationRemoval_ItemIEs_t; +typedef struct E2nodeComponentConfigAdditionAck_ItemIEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2nodeComponentConfigAdditionAck_ItemIEs__value { + E2nodeComponentConfigAdditionAck_ItemIEs__value_PR present; + union E2nodeComponentConfigAdditionAck_ItemIEs__value_u { + E2nodeComponentConfigAdditionAck_Item_t E2nodeComponentConfigAdditionAck_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; +} E2nodeComponentConfigAdditionAck_ItemIEs_t; +typedef struct E2nodeComponentConfigUpdateAck_ItemIEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2nodeComponentConfigUpdateAck_ItemIEs__value { + E2nodeComponentConfigUpdateAck_ItemIEs__value_PR present; + union E2nodeComponentConfigUpdateAck_ItemIEs__value_u { + E2nodeComponentConfigUpdateAck_Item_t E2nodeComponentConfigUpdateAck_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; +} E2nodeComponentConfigUpdateAck_ItemIEs_t; +typedef struct E2nodeComponentConfigRemovalAck_ItemIEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2nodeComponentConfigRemovalAck_ItemIEs__value { + E2nodeComponentConfigRemovalAck_ItemIEs__value_PR present; + union E2nodeComponentConfigRemovalAck_ItemIEs__value_u { + E2nodeComponentConfigRemovalAck_Item_t E2nodeComponentConfigRemovalAck_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; +} E2nodeComponentConfigRemovalAck_ItemIEs_t; typedef struct RANfunction_ItemIEs { ProtocolIE_ID_t id; Criticality_t criticality; @@ -348,7 +651,7 @@ typedef struct RICsubscriptionFailure_IEs { union RICsubscriptionFailure_IEs__value_u { RICrequestID_t RICrequestID; RANfunctionID_t RANfunctionID; - RICaction_NotAdmitted_List_t RICaction_NotAdmitted_List; + Cause_t Cause; CriticalityDiagnostics_t CriticalityDiagnostics; } choice; @@ -412,6 +715,22 @@ typedef struct RICsubscriptionDeleteFailure_IEs { /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } RICsubscriptionDeleteFailure_IEs_t; +typedef struct RICsubscriptionDeleteRequired_IEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct RICsubscriptionDeleteRequired_IEs__value { + RICsubscriptionDeleteRequired_IEs__value_PR present; + union RICsubscriptionDeleteRequired_IEs__value_u { + RICsubscription_List_withCause_t RICsubscription_List_withCause; + } 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; +} RICsubscriptionDeleteRequired_IEs_t; typedef struct RICindication_IEs { ProtocolIE_ID_t id; Criticality_t criticality; @@ -465,7 +784,6 @@ typedef struct RICcontrolAcknowledge_IEs { RICrequestID_t RICrequestID; RANfunctionID_t RANfunctionID; RICcallProcessID_t RICcallProcessID; - RICcontrolStatus_t RICcontrolStatus; RICcontrolOutcome_t RICcontrolOutcome; } choice; @@ -502,6 +820,7 @@ typedef struct ErrorIndication_IEs { struct ErrorIndication_IEs__value { ErrorIndication_IEs__value_PR present; union ErrorIndication_IEs__value_u { + TransactionID_t TransactionID; RICrequestID_t RICrequestID; RANfunctionID_t RANfunctionID; Cause_t Cause; @@ -521,8 +840,10 @@ typedef struct E2setupRequestIEs { struct E2setupRequestIEs__value { E2setupRequestIEs__value_PR present; union E2setupRequestIEs__value_u { + TransactionID_t TransactionID; GlobalE2node_ID_t GlobalE2node_ID; RANfunctions_List_t RANfunctions_List; + E2nodeComponentConfigAddition_List_t E2nodeComponentConfigAddition_List; } choice; /* Context for parsing across buffer boundaries */ @@ -538,9 +859,11 @@ typedef struct E2setupResponseIEs { struct E2setupResponseIEs__value { E2setupResponseIEs__value_PR present; union E2setupResponseIEs__value_u { + TransactionID_t TransactionID; GlobalRIC_ID_t GlobalRIC_ID; RANfunctionsID_List_t RANfunctionsID_List; RANfunctionsIDcause_List_t RANfunctionsIDcause_List; + E2nodeComponentConfigAdditionAck_List_t E2nodeComponentConfigAdditionAck_List; } choice; /* Context for parsing across buffer boundaries */ @@ -556,9 +879,11 @@ typedef struct E2setupFailureIEs { struct E2setupFailureIEs__value { E2setupFailureIEs__value_PR present; union E2setupFailureIEs__value_u { + TransactionID_t TransactionID; Cause_t Cause; TimeToWait_t TimeToWait; CriticalityDiagnostics_t CriticalityDiagnostics; + TNLinformation_t TNLinformation; } choice; /* Context for parsing across buffer boundaries */ @@ -568,12 +893,128 @@ typedef struct E2setupFailureIEs { /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } E2setupFailureIEs_t; +typedef struct E2connectionUpdate_IEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2connectionUpdate_IEs__value { + E2connectionUpdate_IEs__value_PR present; + union E2connectionUpdate_IEs__value_u { + TransactionID_t TransactionID; + E2connectionUpdate_List_t E2connectionUpdate_List; + E2connectionUpdateRemove_List_t E2connectionUpdateRemove_List; + E2connectionUpdate_List_t E2connectionUpdate_List_1; + } 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; +} E2connectionUpdate_IEs_t; +typedef struct E2connectionUpdateAck_IEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2connectionUpdateAck_IEs__value { + E2connectionUpdateAck_IEs__value_PR present; + union E2connectionUpdateAck_IEs__value_u { + TransactionID_t TransactionID; + E2connectionUpdate_List_t E2connectionUpdate_List; + E2connectionSetupFailed_List_t E2connectionSetupFailed_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; +} E2connectionUpdateAck_IEs_t; +typedef struct E2connectionUpdateFailure_IEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2connectionUpdateFailure_IEs__value { + E2connectionUpdateFailure_IEs__value_PR present; + union E2connectionUpdateFailure_IEs__value_u { + TransactionID_t TransactionID; + Cause_t Cause; + TimeToWait_t TimeToWait; + CriticalityDiagnostics_t CriticalityDiagnostics; + } 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; +} E2connectionUpdateFailure_IEs_t; +typedef struct E2nodeConfigurationUpdate_IEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2nodeConfigurationUpdate_IEs__value { + E2nodeConfigurationUpdate_IEs__value_PR present; + union E2nodeConfigurationUpdate_IEs__value_u { + TransactionID_t TransactionID; + GlobalE2node_ID_t GlobalE2node_ID; + E2nodeComponentConfigAddition_List_t E2nodeComponentConfigAddition_List; + E2nodeComponentConfigUpdate_List_t E2nodeComponentConfigUpdate_List; + E2nodeComponentConfigRemoval_List_t E2nodeComponentConfigRemoval_List; + E2nodeTNLassociationRemoval_List_t E2nodeTNLassociationRemoval_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; +} E2nodeConfigurationUpdate_IEs_t; +typedef struct E2nodeConfigurationUpdateAcknowledge_IEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2nodeConfigurationUpdateAcknowledge_IEs__value { + E2nodeConfigurationUpdateAcknowledge_IEs__value_PR present; + union E2nodeConfigurationUpdateAcknowledge_IEs__value_u { + TransactionID_t TransactionID; + E2nodeComponentConfigAdditionAck_List_t E2nodeComponentConfigAdditionAck_List; + E2nodeComponentConfigUpdateAck_List_t E2nodeComponentConfigUpdateAck_List; + E2nodeComponentConfigRemovalAck_List_t E2nodeComponentConfigRemovalAck_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; +} E2nodeConfigurationUpdateAcknowledge_IEs_t; +typedef struct E2nodeConfigurationUpdateFailure_IEs { + ProtocolIE_ID_t id; + Criticality_t criticality; + struct E2nodeConfigurationUpdateFailure_IEs__value { + E2nodeConfigurationUpdateFailure_IEs__value_PR present; + union E2nodeConfigurationUpdateFailure_IEs__value_u { + TransactionID_t TransactionID; + Cause_t Cause; + TimeToWait_t TimeToWait; + CriticalityDiagnostics_t CriticalityDiagnostics; + } 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; +} E2nodeConfigurationUpdateFailure_IEs_t; typedef struct ResetRequestIEs { ProtocolIE_ID_t id; Criticality_t criticality; struct ResetRequestIEs__value { ResetRequestIEs__value_PR present; union ResetRequestIEs__value_u { + TransactionID_t TransactionID; Cause_t Cause; } choice; @@ -590,6 +1031,7 @@ typedef struct ResetResponseIEs { struct ResetResponseIEs__value { ResetResponseIEs__value_PR present; union ResetResponseIEs__value_u { + TransactionID_t TransactionID; CriticalityDiagnostics_t CriticalityDiagnostics; } choice; @@ -606,7 +1048,9 @@ typedef struct RICserviceUpdate_IEs { struct RICserviceUpdate_IEs__value { RICserviceUpdate_IEs__value_PR present; union RICserviceUpdate_IEs__value_u { + TransactionID_t TransactionID; RANfunctions_List_t RANfunctions_List; + RANfunctions_List_t RANfunctions_List_1; RANfunctionsID_List_t RANfunctionsID_List; } choice; @@ -623,6 +1067,7 @@ typedef struct RICserviceUpdateAcknowledge_IEs { struct RICserviceUpdateAcknowledge_IEs__value { RICserviceUpdateAcknowledge_IEs__value_PR present; union RICserviceUpdateAcknowledge_IEs__value_u { + TransactionID_t TransactionID; RANfunctionsID_List_t RANfunctionsID_List; RANfunctionsIDcause_List_t RANfunctionsIDcause_List; } choice; @@ -640,7 +1085,8 @@ typedef struct RICserviceUpdateFailure_IEs { struct RICserviceUpdateFailure_IEs__value { RICserviceUpdateFailure_IEs__value_PR present; union RICserviceUpdateFailure_IEs__value_u { - RANfunctionsIDcause_List_t RANfunctionsIDcause_List; + TransactionID_t TransactionID; + Cause_t Cause; TimeToWait_t TimeToWait; CriticalityDiagnostics_t CriticalityDiagnostics; } choice; @@ -658,6 +1104,7 @@ typedef struct RICserviceQuery_IEs { struct RICserviceQuery_IEs__value { RICserviceQuery_IEs__value_PR present; union RICserviceQuery_IEs__value_u { + TransactionID_t TransactionID; RANfunctionsID_List_t RANfunctionsID_List; } choice; @@ -679,79 +1126,133 @@ 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_RICsubscription_withCause_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscription_withCause_ItemIEs_specs_13; +extern asn_TYPE_member_t asn_MBR_RICsubscription_withCause_ItemIEs_13[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdate_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdate_ItemIEs_specs_17; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdate_ItemIEs_17[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdateRemove_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateRemove_ItemIEs_specs_21; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdateRemove_ItemIEs_21[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2connectionSetupFailed_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionSetupFailed_ItemIEs_specs_25; +extern asn_TYPE_member_t asn_MBR_E2connectionSetupFailed_ItemIEs_25[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigAddition_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigAddition_ItemIEs_specs_29; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAddition_ItemIEs_29[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigUpdate_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigUpdate_ItemIEs_specs_33; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdate_ItemIEs_33[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigRemoval_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigRemoval_ItemIEs_specs_37; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemoval_ItemIEs_37[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2nodeTNLassociationRemoval_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeTNLassociationRemoval_ItemIEs_specs_41; +extern asn_TYPE_member_t asn_MBR_E2nodeTNLassociationRemoval_ItemIEs_41[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigAdditionAck_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigAdditionAck_ItemIEs_specs_45; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAdditionAck_ItemIEs_45[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigUpdateAck_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigUpdateAck_ItemIEs_specs_49; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdateAck_ItemIEs_49[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigRemovalAck_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigRemovalAck_ItemIEs_specs_53; +extern asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemovalAck_ItemIEs_53[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_SEQUENCE_specifics_t asn_SPC_RANfunction_ItemIEs_specs_57; +extern asn_TYPE_member_t asn_MBR_RANfunction_ItemIEs_57[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_SEQUENCE_specifics_t asn_SPC_RANfunctionID_ItemIEs_specs_61; +extern asn_TYPE_member_t asn_MBR_RANfunctionID_ItemIEs_61[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_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_ItemIEs_specs_65; +extern asn_TYPE_member_t asn_MBR_RANfunctionIDcause_ItemIEs_65[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_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_IEs_specs_69; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_IEs_69[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_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_IEs_specs_73; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_IEs_73[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_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_IEs_specs_77; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_IEs_77[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_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_81; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_IEs_81[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_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_85; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_IEs_85[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_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_89; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_IEs_89[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequired_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequired_IEs_specs_93; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequired_IEs_93[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_SEQUENCE_specifics_t asn_SPC_RICindication_IEs_specs_97; +extern asn_TYPE_member_t asn_MBR_RICindication_IEs_97[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_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_IEs_specs_101; +extern asn_TYPE_member_t asn_MBR_RICcontrolRequest_IEs_101[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_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_IEs_specs_105; +extern asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_IEs_105[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_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_IEs_specs_109; +extern asn_TYPE_member_t asn_MBR_RICcontrolFailure_IEs_109[3]; extern asn_TYPE_descriptor_t asn_DEF_ErrorIndication_IEs; -extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_IEs_specs_65; -extern asn_TYPE_member_t asn_MBR_ErrorIndication_IEs_65[3]; +extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_IEs_specs_113; +extern asn_TYPE_member_t asn_MBR_ErrorIndication_IEs_113[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_SEQUENCE_specifics_t asn_SPC_E2setupRequestIEs_specs_117; +extern asn_TYPE_member_t asn_MBR_E2setupRequestIEs_117[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_SEQUENCE_specifics_t asn_SPC_E2setupResponseIEs_specs_121; +extern asn_TYPE_member_t asn_MBR_E2setupResponseIEs_121[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_SEQUENCE_specifics_t asn_SPC_E2setupFailureIEs_specs_125; +extern asn_TYPE_member_t asn_MBR_E2setupFailureIEs_125[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdate_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdate_IEs_specs_129; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdate_IEs_129[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdateAck_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateAck_IEs_specs_133; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdateAck_IEs_133[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2connectionUpdateFailure_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateFailure_IEs_specs_137; +extern asn_TYPE_member_t asn_MBR_E2connectionUpdateFailure_IEs_137[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2nodeConfigurationUpdate_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdate_IEs_specs_141; +extern asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdate_IEs_141[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2nodeConfigurationUpdateAcknowledge_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdateAcknowledge_IEs_specs_145; +extern asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdateAcknowledge_IEs_145[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2nodeConfigurationUpdateFailure_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdateFailure_IEs_specs_149; +extern asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdateFailure_IEs_149[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_SEQUENCE_specifics_t asn_SPC_ResetRequestIEs_specs_153; +extern asn_TYPE_member_t asn_MBR_ResetRequestIEs_153[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_SEQUENCE_specifics_t asn_SPC_ResetResponseIEs_specs_157; +extern asn_TYPE_member_t asn_MBR_ResetResponseIEs_157[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_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_IEs_specs_161; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_161[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_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_165; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_165[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_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_IEs_specs_169; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_169[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]; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_IEs_specs_173; +extern asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_173[3]; #ifdef __cplusplus } #endif #endif /* _ProtocolIE_Field_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/ProtocolIE-FieldPair.h b/e2ap/headers/ProtocolIE-FieldPair.h index 17a19c7..10a1c73 100644 --- a/e2ap/headers/ProtocolIE-FieldPair.h +++ b/e2ap/headers/ProtocolIE-FieldPair.h @@ -1,15 +1,15 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ProtocolIE_FieldPair_H_ #define _ProtocolIE_FieldPair_H_ -#include +#include "asn_application.h" #ifdef __cplusplus extern "C" { @@ -20,4 +20,4 @@ extern "C" { #endif #endif /* _ProtocolIE_FieldPair_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/ProtocolIE-ID.h b/e2ap/headers/ProtocolIE-ID.h index dc75633..a38b70f 100644 --- a/e2ap/headers/ProtocolIE-ID.h +++ b/e2ap/headers/ProtocolIE-ID.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP-CommonDataTypes-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "commonDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ProtocolIE_ID_H_ #define _ProtocolIE_ID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeInteger.h" #ifdef __cplusplus extern "C" { @@ -31,6 +31,7 @@ ber_type_decoder_f ProtocolIE_ID_decode_ber; der_type_encoder_f ProtocolIE_ID_encode_der; xer_type_decoder_f ProtocolIE_ID_decode_xer; xer_type_encoder_f ProtocolIE_ID_encode_xer; +jer_type_encoder_f ProtocolIE_ID_encode_jer; oer_type_decoder_f ProtocolIE_ID_decode_oer; oer_type_encoder_f ProtocolIE_ID_encode_oer; per_type_decoder_f ProtocolIE_ID_decode_uper; @@ -69,10 +70,37 @@ per_type_encoder_f ProtocolIE_ID_encode_aper; #define ProtocolIE_ID_id_RICsubscriptionDetails ((ProtocolIE_ID_t)30) #define ProtocolIE_ID_id_TimeToWait ((ProtocolIE_ID_t)31) #define ProtocolIE_ID_id_RICcontrolOutcome ((ProtocolIE_ID_t)32) +#define ProtocolIE_ID_id_E2nodeComponentConfigUpdate ((ProtocolIE_ID_t)33) +#define ProtocolIE_ID_id_E2nodeComponentConfigUpdate_Item ((ProtocolIE_ID_t)34) +#define ProtocolIE_ID_id_E2nodeComponentConfigUpdateAck ((ProtocolIE_ID_t)35) +#define ProtocolIE_ID_id_E2nodeComponentConfigUpdateAck_Item ((ProtocolIE_ID_t)36) +#define ProtocolIE_ID_id_E2connectionSetup ((ProtocolIE_ID_t)39) +#define ProtocolIE_ID_id_E2connectionSetupFailed ((ProtocolIE_ID_t)40) +#define ProtocolIE_ID_id_E2connectionSetupFailed_Item ((ProtocolIE_ID_t)41) +#define ProtocolIE_ID_id_E2connectionFailed_Item ((ProtocolIE_ID_t)42) +#define ProtocolIE_ID_id_E2connectionUpdate_Item ((ProtocolIE_ID_t)43) +#define ProtocolIE_ID_id_E2connectionUpdateAdd ((ProtocolIE_ID_t)44) +#define ProtocolIE_ID_id_E2connectionUpdateModify ((ProtocolIE_ID_t)45) +#define ProtocolIE_ID_id_E2connectionUpdateRemove ((ProtocolIE_ID_t)46) +#define ProtocolIE_ID_id_E2connectionUpdateRemove_Item ((ProtocolIE_ID_t)47) +#define ProtocolIE_ID_id_TNLinformation ((ProtocolIE_ID_t)48) +#define ProtocolIE_ID_id_TransactionID ((ProtocolIE_ID_t)49) +#define ProtocolIE_ID_id_E2nodeComponentConfigAddition ((ProtocolIE_ID_t)50) +#define ProtocolIE_ID_id_E2nodeComponentConfigAddition_Item ((ProtocolIE_ID_t)51) +#define ProtocolIE_ID_id_E2nodeComponentConfigAdditionAck ((ProtocolIE_ID_t)52) +#define ProtocolIE_ID_id_E2nodeComponentConfigAdditionAck_Item ((ProtocolIE_ID_t)53) +#define ProtocolIE_ID_id_E2nodeComponentConfigRemoval ((ProtocolIE_ID_t)54) +#define ProtocolIE_ID_id_E2nodeComponentConfigRemoval_Item ((ProtocolIE_ID_t)55) +#define ProtocolIE_ID_id_E2nodeComponentConfigRemovalAck ((ProtocolIE_ID_t)56) +#define ProtocolIE_ID_id_E2nodeComponentConfigRemovalAck_Item ((ProtocolIE_ID_t)57) +#define ProtocolIE_ID_id_E2nodeTNLassociationRemoval ((ProtocolIE_ID_t)58) +#define ProtocolIE_ID_id_E2nodeTNLassociationRemoval_Item ((ProtocolIE_ID_t)59) +#define ProtocolIE_ID_id_RICsubscriptionToBeRemoved ((ProtocolIE_ID_t)50) +#define ProtocolIE_ID_id_RICsubscription_withCause_Item ((ProtocolIE_ID_t)51) #ifdef __cplusplus } #endif #endif /* _ProtocolIE_ID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/ProtocolIE-SingleContainer.h b/e2ap/headers/ProtocolIE-SingleContainer.h index eadd741..8bdc61c 100644 --- a/e2ap/headers/ProtocolIE-SingleContainer.h +++ b/e2ap/headers/ProtocolIE-SingleContainer.h @@ -1,15 +1,15 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ProtocolIE_SingleContainer_H_ #define _ProtocolIE_SingleContainer_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Field.h" @@ -19,102 +19,284 @@ extern "C" { #endif /* ProtocolIE-SingleContainer */ -typedef RICaction_ToBeSetup_ItemIEs_t ProtocolIE_SingleContainer_90P0_t; -typedef RICaction_Admitted_ItemIEs_t ProtocolIE_SingleContainer_90P1_t; -typedef RICaction_NotAdmitted_ItemIEs_t ProtocolIE_SingleContainer_90P2_t; -typedef RANfunction_ItemIEs_t ProtocolIE_SingleContainer_90P3_t; -typedef RANfunctionID_ItemIEs_t ProtocolIE_SingleContainer_90P4_t; -typedef RANfunctionIDcause_ItemIEs_t ProtocolIE_SingleContainer_90P5_t; +typedef RICaction_ToBeSetup_ItemIEs_t ProtocolIE_SingleContainer_88P0_t; +typedef RICaction_Admitted_ItemIEs_t ProtocolIE_SingleContainer_88P1_t; +typedef RICaction_NotAdmitted_ItemIEs_t ProtocolIE_SingleContainer_88P2_t; +typedef RICsubscription_withCause_ItemIEs_t ProtocolIE_SingleContainer_88P3_t; +typedef E2connectionUpdate_ItemIEs_t ProtocolIE_SingleContainer_88P4_t; +typedef E2connectionUpdateRemove_ItemIEs_t ProtocolIE_SingleContainer_88P5_t; +typedef E2connectionSetupFailed_ItemIEs_t ProtocolIE_SingleContainer_88P6_t; +typedef E2nodeComponentConfigAddition_ItemIEs_t ProtocolIE_SingleContainer_88P7_t; +typedef E2nodeComponentConfigUpdate_ItemIEs_t ProtocolIE_SingleContainer_88P8_t; +typedef E2nodeComponentConfigRemoval_ItemIEs_t ProtocolIE_SingleContainer_88P9_t; +typedef E2nodeTNLassociationRemoval_ItemIEs_t ProtocolIE_SingleContainer_88P10_t; +typedef E2nodeComponentConfigAdditionAck_ItemIEs_t ProtocolIE_SingleContainer_88P11_t; +typedef E2nodeComponentConfigUpdateAck_ItemIEs_t ProtocolIE_SingleContainer_88P12_t; +typedef E2nodeComponentConfigRemovalAck_ItemIEs_t ProtocolIE_SingleContainer_88P13_t; +typedef RANfunction_ItemIEs_t ProtocolIE_SingleContainer_88P14_t; +typedef RANfunctionID_ItemIEs_t ProtocolIE_SingleContainer_88P15_t; +typedef RANfunctionIDcause_ItemIEs_t ProtocolIE_SingleContainer_88P16_t; /* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P0; -asn_struct_free_f ProtocolIE_SingleContainer_90P0_free; -asn_struct_print_f ProtocolIE_SingleContainer_90P0_print; -asn_constr_check_f ProtocolIE_SingleContainer_90P0_constraint; -ber_type_decoder_f ProtocolIE_SingleContainer_90P0_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainer_90P0_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainer_90P0_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainer_90P0_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainer_90P0_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainer_90P0_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainer_90P0_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainer_90P0_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainer_90P0_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainer_90P0_encode_aper; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P1; -asn_struct_free_f ProtocolIE_SingleContainer_90P1_free; -asn_struct_print_f ProtocolIE_SingleContainer_90P1_print; -asn_constr_check_f ProtocolIE_SingleContainer_90P1_constraint; -ber_type_decoder_f ProtocolIE_SingleContainer_90P1_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainer_90P1_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainer_90P1_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainer_90P1_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainer_90P1_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainer_90P1_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainer_90P1_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainer_90P1_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainer_90P1_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainer_90P1_encode_aper; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P2; -asn_struct_free_f ProtocolIE_SingleContainer_90P2_free; -asn_struct_print_f ProtocolIE_SingleContainer_90P2_print; -asn_constr_check_f ProtocolIE_SingleContainer_90P2_constraint; -ber_type_decoder_f ProtocolIE_SingleContainer_90P2_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainer_90P2_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainer_90P2_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainer_90P2_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainer_90P2_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainer_90P2_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainer_90P2_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainer_90P2_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainer_90P2_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainer_90P2_encode_aper; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P3; -asn_struct_free_f ProtocolIE_SingleContainer_90P3_free; -asn_struct_print_f ProtocolIE_SingleContainer_90P3_print; -asn_constr_check_f ProtocolIE_SingleContainer_90P3_constraint; -ber_type_decoder_f ProtocolIE_SingleContainer_90P3_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainer_90P3_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainer_90P3_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainer_90P3_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainer_90P3_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainer_90P3_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainer_90P3_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainer_90P3_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainer_90P3_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainer_90P3_encode_aper; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P4; -asn_struct_free_f ProtocolIE_SingleContainer_90P4_free; -asn_struct_print_f ProtocolIE_SingleContainer_90P4_print; -asn_constr_check_f ProtocolIE_SingleContainer_90P4_constraint; -ber_type_decoder_f ProtocolIE_SingleContainer_90P4_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainer_90P4_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainer_90P4_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainer_90P4_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainer_90P4_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainer_90P4_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainer_90P4_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainer_90P4_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainer_90P4_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainer_90P4_encode_aper; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P5; -asn_struct_free_f ProtocolIE_SingleContainer_90P5_free; -asn_struct_print_f ProtocolIE_SingleContainer_90P5_print; -asn_constr_check_f ProtocolIE_SingleContainer_90P5_constraint; -ber_type_decoder_f ProtocolIE_SingleContainer_90P5_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainer_90P5_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainer_90P5_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainer_90P5_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainer_90P5_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainer_90P5_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainer_90P5_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainer_90P5_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainer_90P5_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainer_90P5_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P0; +asn_struct_free_f ProtocolIE_SingleContainer_88P0_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P0_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P0_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P0_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P0_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P0_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P0_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P0_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P0_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P0_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P0_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P0_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P0_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P0_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P1; +asn_struct_free_f ProtocolIE_SingleContainer_88P1_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P1_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P1_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P1_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P1_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P1_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P1_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P1_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P1_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P1_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P1_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P1_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P1_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P1_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P2; +asn_struct_free_f ProtocolIE_SingleContainer_88P2_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P2_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P2_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P2_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P2_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P2_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P2_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P2_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P2_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P2_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P2_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P2_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P2_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P2_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P3; +asn_struct_free_f ProtocolIE_SingleContainer_88P3_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P3_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P3_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P3_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P3_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P3_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P3_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P3_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P3_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P3_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P3_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P3_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P3_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P3_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P4; +asn_struct_free_f ProtocolIE_SingleContainer_88P4_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P4_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P4_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P4_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P4_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P4_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P4_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P4_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P4_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P4_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P4_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P4_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P4_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P4_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P5; +asn_struct_free_f ProtocolIE_SingleContainer_88P5_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P5_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P5_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P5_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P5_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P5_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P5_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P5_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P5_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P5_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P5_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P5_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P5_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P5_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P6; +asn_struct_free_f ProtocolIE_SingleContainer_88P6_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P6_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P6_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P6_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P6_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P6_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P6_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P6_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P6_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P6_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P6_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P6_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P6_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P6_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P7; +asn_struct_free_f ProtocolIE_SingleContainer_88P7_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P7_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P7_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P7_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P7_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P7_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P7_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P7_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P7_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P7_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P7_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P7_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P7_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P7_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P8; +asn_struct_free_f ProtocolIE_SingleContainer_88P8_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P8_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P8_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P8_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P8_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P8_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P8_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P8_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P8_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P8_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P8_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P8_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P8_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P8_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P9; +asn_struct_free_f ProtocolIE_SingleContainer_88P9_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P9_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P9_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P9_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P9_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P9_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P9_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P9_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P9_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P9_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P9_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P9_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P9_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P9_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P10; +asn_struct_free_f ProtocolIE_SingleContainer_88P10_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P10_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P10_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P10_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P10_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P10_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P10_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P10_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P10_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P10_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P10_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P10_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P10_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P10_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P11; +asn_struct_free_f ProtocolIE_SingleContainer_88P11_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P11_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P11_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P11_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P11_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P11_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P11_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P11_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P11_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P11_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P11_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P11_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P11_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P11_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P12; +asn_struct_free_f ProtocolIE_SingleContainer_88P12_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P12_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P12_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P12_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P12_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P12_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P12_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P12_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P12_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P12_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P12_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P12_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P12_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P12_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P13; +asn_struct_free_f ProtocolIE_SingleContainer_88P13_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P13_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P13_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P13_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P13_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P13_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P13_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P13_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P13_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P13_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P13_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P13_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P13_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P13_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P14; +asn_struct_free_f ProtocolIE_SingleContainer_88P14_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P14_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P14_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P14_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P14_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P14_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P14_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P14_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P14_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P14_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P14_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P14_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P14_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P14_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P15; +asn_struct_free_f ProtocolIE_SingleContainer_88P15_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P15_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P15_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P15_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P15_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P15_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P15_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P15_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P15_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P15_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P15_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P15_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P15_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P15_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P16; +asn_struct_free_f ProtocolIE_SingleContainer_88P16_free; +asn_struct_print_f ProtocolIE_SingleContainer_88P16_print; +asn_constr_check_f ProtocolIE_SingleContainer_88P16_constraint; +ber_type_decoder_f ProtocolIE_SingleContainer_88P16_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainer_88P16_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainer_88P16_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainer_88P16_encode_xer; +jer_type_encoder_f ProtocolIE_SingleContainer_88P16_encode_jer; +oer_type_decoder_f ProtocolIE_SingleContainer_88P16_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainer_88P16_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainer_88P16_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainer_88P16_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainer_88P16_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainer_88P16_encode_aper; #ifdef __cplusplus } #endif #endif /* _ProtocolIE_SingleContainer_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RANfunction-Item.h b/e2ap/headers/RANfunction-Item.h index 38b5e97..58b2fa4 100644 --- a/e2ap/headers/RANfunction-Item.h +++ b/e2ap/headers/RANfunction-Item.h @@ -1,21 +1,22 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RANfunction_Item_H_ #define _RANfunction_Item_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "RANfunctionID.h" #include "RANfunctionDefinition.h" #include "RANfunctionRevision.h" -#include +#include "RANfunctionOID.h" +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -26,6 +27,7 @@ typedef struct RANfunction_Item { RANfunctionID_t ranFunctionID; RANfunctionDefinition_t ranFunctionDefinition; RANfunctionRevision_t ranFunctionRevision; + RANfunctionOID_t ranFunctionOID; /* * This type is extensible, * possible extensions are below. @@ -38,11 +40,11 @@ typedef struct RANfunction_Item { /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_RANfunction_Item; extern asn_SEQUENCE_specifics_t asn_SPC_RANfunction_Item_specs_1; -extern asn_TYPE_member_t asn_MBR_RANfunction_Item_1[3]; +extern asn_TYPE_member_t asn_MBR_RANfunction_Item_1[4]; #ifdef __cplusplus } #endif #endif /* _RANfunction_Item_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RANfunctionDefinition.h b/e2ap/headers/RANfunctionDefinition.h index 3676c45..1f49cbe 100644 --- a/e2ap/headers/RANfunctionDefinition.h +++ b/e2ap/headers/RANfunctionDefinition.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RANfunctionDefinition_H_ #define _RANfunctionDefinition_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "OCTET_STRING.h" #ifdef __cplusplus extern "C" { @@ -30,6 +30,7 @@ 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; +jer_type_encoder_f RANfunctionDefinition_encode_jer; oer_type_decoder_f RANfunctionDefinition_decode_oer; oer_type_encoder_f RANfunctionDefinition_encode_oer; per_type_decoder_f RANfunctionDefinition_decode_uper; @@ -42,4 +43,4 @@ per_type_encoder_f RANfunctionDefinition_encode_aper; #endif #endif /* _RANfunctionDefinition_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RANfunctionID-Item.h b/e2ap/headers/RANfunctionID-Item.h index f4a643d..e90b860 100644 --- a/e2ap/headers/RANfunctionID-Item.h +++ b/e2ap/headers/RANfunctionID-Item.h @@ -1,20 +1,20 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RANfunctionID_Item_H_ #define _RANfunctionID_Item_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "RANfunctionID.h" #include "RANfunctionRevision.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -43,4 +43,4 @@ extern asn_TYPE_member_t asn_MBR_RANfunctionID_Item_1[2]; #endif #endif /* _RANfunctionID_Item_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RANfunctionID.h b/e2ap/headers/RANfunctionID.h index 00c4765..713a944 100644 --- a/e2ap/headers/RANfunctionID.h +++ b/e2ap/headers/RANfunctionID.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RANfunctionID_H_ #define _RANfunctionID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeInteger.h" #ifdef __cplusplus extern "C" { @@ -31,6 +31,7 @@ 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; +jer_type_encoder_f RANfunctionID_encode_jer; oer_type_decoder_f RANfunctionID_decode_oer; oer_type_encoder_f RANfunctionID_encode_oer; per_type_decoder_f RANfunctionID_decode_uper; @@ -43,4 +44,4 @@ per_type_encoder_f RANfunctionID_encode_aper; #endif #endif /* _RANfunctionID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RANfunctionIDcause-Item.h b/e2ap/headers/RANfunctionIDcause-Item.h index 65d1d16..140438d 100644 --- a/e2ap/headers/RANfunctionIDcause-Item.h +++ b/e2ap/headers/RANfunctionIDcause-Item.h @@ -1,20 +1,20 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RANfunctionIDcause_Item_H_ #define _RANfunctionIDcause_Item_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "RANfunctionID.h" #include "Cause.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -43,4 +43,4 @@ extern asn_TYPE_member_t asn_MBR_RANfunctionIDcause_Item_1[2]; #endif #endif /* _RANfunctionIDcause_Item_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RANfunctionOID.h b/e2ap/headers/RANfunctionOID.h new file mode 100644 index 0000000..b768d82 --- /dev/null +++ b/e2ap/headers/RANfunctionOID.h @@ -0,0 +1,47 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _RANfunctionOID_H_ +#define _RANfunctionOID_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "PrintableString.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunctionOID */ +typedef PrintableString_t RANfunctionOID_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RANfunctionOID_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionOID; +asn_struct_free_f RANfunctionOID_free; +asn_struct_print_f RANfunctionOID_print; +asn_constr_check_f RANfunctionOID_constraint; +ber_type_decoder_f RANfunctionOID_decode_ber; +der_type_encoder_f RANfunctionOID_encode_der; +xer_type_decoder_f RANfunctionOID_decode_xer; +xer_type_encoder_f RANfunctionOID_encode_xer; +jer_type_encoder_f RANfunctionOID_encode_jer; +oer_type_decoder_f RANfunctionOID_decode_oer; +oer_type_encoder_f RANfunctionOID_encode_oer; +per_type_decoder_f RANfunctionOID_decode_uper; +per_type_encoder_f RANfunctionOID_encode_uper; +per_type_decoder_f RANfunctionOID_decode_aper; +per_type_encoder_f RANfunctionOID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionOID_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/RANfunctionRevision.h b/e2ap/headers/RANfunctionRevision.h index 76f500a..d927a6f 100644 --- a/e2ap/headers/RANfunctionRevision.h +++ b/e2ap/headers/RANfunctionRevision.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RANfunctionRevision_H_ #define _RANfunctionRevision_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeInteger.h" #ifdef __cplusplus extern "C" { @@ -31,6 +31,7 @@ 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; +jer_type_encoder_f RANfunctionRevision_encode_jer; oer_type_decoder_f RANfunctionRevision_decode_oer; oer_type_encoder_f RANfunctionRevision_encode_oer; per_type_decoder_f RANfunctionRevision_decode_uper; @@ -43,4 +44,4 @@ per_type_encoder_f RANfunctionRevision_encode_aper; #endif #endif /* _RANfunctionRevision_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RANfunctions-List.h b/e2ap/headers/RANfunctions-List.h index c3fd3e3..30d75bd 100644 --- a/e2ap/headers/RANfunctions-List.h +++ b/e2ap/headers/RANfunctions-List.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RANfunctions_List_H_ #define _RANfunctions_List_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" #ifdef __cplusplus extern "C" { @@ -41,4 +41,4 @@ extern asn_per_constraints_t asn_PER_type_RANfunctions_List_constr_1; #endif #endif /* _RANfunctions_List_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RANfunctionsID-List.h b/e2ap/headers/RANfunctionsID-List.h index 1a77d70..b1e7afb 100644 --- a/e2ap/headers/RANfunctionsID-List.h +++ b/e2ap/headers/RANfunctionsID-List.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RANfunctionsID_List_H_ #define _RANfunctionsID_List_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" #ifdef __cplusplus extern "C" { @@ -41,4 +41,4 @@ extern asn_per_constraints_t asn_PER_type_RANfunctionsID_List_constr_1; #endif #endif /* _RANfunctionsID_List_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RANfunctionsIDcause-List.h b/e2ap/headers/RANfunctionsIDcause-List.h index 3fd51d1..d4c2108 100644 --- a/e2ap/headers/RANfunctionsIDcause-List.h +++ b/e2ap/headers/RANfunctionsIDcause-List.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RANfunctionsIDcause_List_H_ #define _RANfunctionsIDcause_List_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" #ifdef __cplusplus extern "C" { @@ -41,4 +41,4 @@ extern asn_per_constraints_t asn_PER_type_RANfunctionsIDcause_List_constr_1; #endif #endif /* _RANfunctionsIDcause_List_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICaction-Admitted-Item.h b/e2ap/headers/RICaction-Admitted-Item.h index 5031b7d..940e3c8 100644 --- a/e2ap/headers/RICaction-Admitted-Item.h +++ b/e2ap/headers/RICaction-Admitted-Item.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICaction_Admitted_Item_H_ #define _RICaction_Admitted_Item_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "RICactionID.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -41,4 +41,4 @@ extern asn_TYPE_member_t asn_MBR_RICaction_Admitted_Item_1[1]; #endif #endif /* _RICaction_Admitted_Item_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICaction-Admitted-List.h b/e2ap/headers/RICaction-Admitted-List.h index 9464982..34e9e7b 100644 --- a/e2ap/headers/RICaction-Admitted-List.h +++ b/e2ap/headers/RICaction-Admitted-List.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICaction_Admitted_List_H_ #define _RICaction_Admitted_List_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" #ifdef __cplusplus extern "C" { @@ -41,4 +41,4 @@ extern asn_per_constraints_t asn_PER_type_RICaction_Admitted_List_constr_1; #endif #endif /* _RICaction_Admitted_List_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICaction-NotAdmitted-Item.h b/e2ap/headers/RICaction-NotAdmitted-Item.h index b94f69c..ee0a069 100644 --- a/e2ap/headers/RICaction-NotAdmitted-Item.h +++ b/e2ap/headers/RICaction-NotAdmitted-Item.h @@ -1,20 +1,20 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICaction_NotAdmitted_Item_H_ #define _RICaction_NotAdmitted_Item_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "RICactionID.h" #include "Cause.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -43,4 +43,4 @@ extern asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_Item_1[2]; #endif #endif /* _RICaction_NotAdmitted_Item_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICaction-NotAdmitted-List.h b/e2ap/headers/RICaction-NotAdmitted-List.h index 642683d..2d880f3 100644 --- a/e2ap/headers/RICaction-NotAdmitted-List.h +++ b/e2ap/headers/RICaction-NotAdmitted-List.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICaction_NotAdmitted_List_H_ #define _RICaction_NotAdmitted_List_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" #ifdef __cplusplus extern "C" { @@ -41,4 +41,4 @@ extern asn_per_constraints_t asn_PER_type_RICaction_NotAdmitted_List_constr_1; #endif #endif /* _RICaction_NotAdmitted_List_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICaction-ToBeSetup-Item.h b/e2ap/headers/RICaction-ToBeSetup-Item.h index a616014..3231653 100644 --- a/e2ap/headers/RICaction-ToBeSetup-Item.h +++ b/e2ap/headers/RICaction-ToBeSetup-Item.h @@ -1,21 +1,21 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICaction_ToBeSetup_Item_H_ #define _RICaction_ToBeSetup_Item_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "RICactionID.h" #include "RICactionType.h" #include "RICactionDefinition.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -49,4 +49,4 @@ extern asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_Item_1[4]; #endif #endif /* _RICaction_ToBeSetup_Item_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICactionDefinition.h b/e2ap/headers/RICactionDefinition.h index 349e2a8..a9c80a3 100644 --- a/e2ap/headers/RICactionDefinition.h +++ b/e2ap/headers/RICactionDefinition.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICactionDefinition_H_ #define _RICactionDefinition_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "OCTET_STRING.h" #ifdef __cplusplus extern "C" { @@ -30,6 +30,7 @@ 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; +jer_type_encoder_f RICactionDefinition_encode_jer; oer_type_decoder_f RICactionDefinition_decode_oer; oer_type_encoder_f RICactionDefinition_encode_oer; per_type_decoder_f RICactionDefinition_decode_uper; @@ -42,4 +43,4 @@ per_type_encoder_f RICactionDefinition_encode_aper; #endif #endif /* _RICactionDefinition_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICactionID.h b/e2ap/headers/RICactionID.h index b8f6447..4005e17 100644 --- a/e2ap/headers/RICactionID.h +++ b/e2ap/headers/RICactionID.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICactionID_H_ #define _RICactionID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeInteger.h" #ifdef __cplusplus extern "C" { @@ -31,6 +31,7 @@ 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; +jer_type_encoder_f RICactionID_encode_jer; oer_type_decoder_f RICactionID_decode_oer; oer_type_encoder_f RICactionID_encode_oer; per_type_decoder_f RICactionID_decode_uper; @@ -43,4 +44,4 @@ per_type_encoder_f RICactionID_encode_aper; #endif #endif /* _RICactionID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICactionType.h b/e2ap/headers/RICactionType.h index e4349fd..64092d7 100644 --- a/e2ap/headers/RICactionType.h +++ b/e2ap/headers/RICactionType.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICactionType_H_ #define _RICactionType_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -42,6 +42,7 @@ 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; +jer_type_encoder_f RICactionType_encode_jer; oer_type_decoder_f RICactionType_decode_oer; oer_type_encoder_f RICactionType_encode_oer; per_type_decoder_f RICactionType_decode_uper; @@ -54,4 +55,4 @@ per_type_encoder_f RICactionType_encode_aper; #endif #endif /* _RICactionType_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICactions-ToBeSetup-List.h b/e2ap/headers/RICactions-ToBeSetup-List.h index 632b420..4e6fd5e 100644 --- a/e2ap/headers/RICactions-ToBeSetup-List.h +++ b/e2ap/headers/RICactions-ToBeSetup-List.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICactions_ToBeSetup_List_H_ #define _RICactions_ToBeSetup_List_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" #ifdef __cplusplus extern "C" { @@ -41,4 +41,4 @@ extern asn_per_constraints_t asn_PER_type_RICactions_ToBeSetup_List_constr_1; #endif #endif /* _RICactions_ToBeSetup_List_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICcallProcessID.h b/e2ap/headers/RICcallProcessID.h index a1a4983..66253ec 100644 --- a/e2ap/headers/RICcallProcessID.h +++ b/e2ap/headers/RICcallProcessID.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICcallProcessID_H_ #define _RICcallProcessID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "OCTET_STRING.h" #ifdef __cplusplus extern "C" { @@ -30,6 +30,7 @@ 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; +jer_type_encoder_f RICcallProcessID_encode_jer; oer_type_decoder_f RICcallProcessID_decode_oer; oer_type_encoder_f RICcallProcessID_encode_oer; per_type_decoder_f RICcallProcessID_decode_uper; @@ -42,4 +43,4 @@ per_type_encoder_f RICcallProcessID_encode_aper; #endif #endif /* _RICcallProcessID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICcontrolAckRequest.h b/e2ap/headers/RICcontrolAckRequest.h index abb9553..82f4b16 100644 --- a/e2ap/headers/RICcontrolAckRequest.h +++ b/e2ap/headers/RICcontrolAckRequest.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICcontrolAckRequest_H_ #define _RICcontrolAckRequest_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -21,8 +21,7 @@ extern "C" { /* Dependencies */ typedef enum RICcontrolAckRequest { RICcontrolAckRequest_noAck = 0, - RICcontrolAckRequest_ack = 1, - RICcontrolAckRequest_nAck = 2 + RICcontrolAckRequest_ack = 1 /* * Enumeration is extensible */ @@ -42,6 +41,7 @@ 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; +jer_type_encoder_f RICcontrolAckRequest_encode_jer; oer_type_decoder_f RICcontrolAckRequest_decode_oer; oer_type_encoder_f RICcontrolAckRequest_encode_oer; per_type_decoder_f RICcontrolAckRequest_decode_uper; @@ -54,4 +54,4 @@ per_type_encoder_f RICcontrolAckRequest_encode_aper; #endif #endif /* _RICcontrolAckRequest_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICcontrolAcknowledge.h b/e2ap/headers/RICcontrolAcknowledge.h index 361f3d6..022b8d0 100644 --- a/e2ap/headers/RICcontrolAcknowledge.h +++ b/e2ap/headers/RICcontrolAcknowledge.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICcontrolAcknowledge_H_ #define _RICcontrolAcknowledge_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICcontrolAcknowledge */ typedef struct RICcontrolAcknowledge { - ProtocolIE_Container_87P8_t protocolIEs; + ProtocolIE_Container_85P9_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICcontrolAcknowledge { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICcontrolFailure.h b/e2ap/headers/RICcontrolFailure.h index 6eb6a04..94a96a2 100644 --- a/e2ap/headers/RICcontrolFailure.h +++ b/e2ap/headers/RICcontrolFailure.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICcontrolFailure_H_ #define _RICcontrolFailure_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICcontrolFailure */ typedef struct RICcontrolFailure { - ProtocolIE_Container_87P9_t protocolIEs; + ProtocolIE_Container_85P10_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICcontrolFailure { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICcontrolHeader.h b/e2ap/headers/RICcontrolHeader.h index d7cad7d..90965dd 100644 --- a/e2ap/headers/RICcontrolHeader.h +++ b/e2ap/headers/RICcontrolHeader.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICcontrolHeader_H_ #define _RICcontrolHeader_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "OCTET_STRING.h" #ifdef __cplusplus extern "C" { @@ -30,6 +30,7 @@ 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; +jer_type_encoder_f RICcontrolHeader_encode_jer; oer_type_decoder_f RICcontrolHeader_decode_oer; oer_type_encoder_f RICcontrolHeader_encode_oer; per_type_decoder_f RICcontrolHeader_decode_uper; @@ -42,4 +43,4 @@ per_type_encoder_f RICcontrolHeader_encode_aper; #endif #endif /* _RICcontrolHeader_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICcontrolMessage.h b/e2ap/headers/RICcontrolMessage.h index 08fdf4a..9fd3968 100644 --- a/e2ap/headers/RICcontrolMessage.h +++ b/e2ap/headers/RICcontrolMessage.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICcontrolMessage_H_ #define _RICcontrolMessage_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "OCTET_STRING.h" #ifdef __cplusplus extern "C" { @@ -30,6 +30,7 @@ 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; +jer_type_encoder_f RICcontrolMessage_encode_jer; oer_type_decoder_f RICcontrolMessage_decode_oer; oer_type_encoder_f RICcontrolMessage_encode_oer; per_type_decoder_f RICcontrolMessage_decode_uper; @@ -42,4 +43,4 @@ per_type_encoder_f RICcontrolMessage_encode_aper; #endif #endif /* _RICcontrolMessage_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICcontrolOutcome.h b/e2ap/headers/RICcontrolOutcome.h index d70b5a5..eaa8f38 100644 --- a/e2ap/headers/RICcontrolOutcome.h +++ b/e2ap/headers/RICcontrolOutcome.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICcontrolOutcome_H_ #define _RICcontrolOutcome_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "OCTET_STRING.h" #ifdef __cplusplus extern "C" { @@ -30,6 +30,7 @@ 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; +jer_type_encoder_f RICcontrolOutcome_encode_jer; oer_type_decoder_f RICcontrolOutcome_decode_oer; oer_type_encoder_f RICcontrolOutcome_encode_oer; per_type_decoder_f RICcontrolOutcome_decode_uper; @@ -42,4 +43,4 @@ per_type_encoder_f RICcontrolOutcome_encode_aper; #endif #endif /* _RICcontrolOutcome_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICcontrolRequest.h b/e2ap/headers/RICcontrolRequest.h index db5ba24..70de383 100644 --- a/e2ap/headers/RICcontrolRequest.h +++ b/e2ap/headers/RICcontrolRequest.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICcontrolRequest_H_ #define _RICcontrolRequest_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICcontrolRequest */ typedef struct RICcontrolRequest { - ProtocolIE_Container_87P7_t protocolIEs; + ProtocolIE_Container_85P8_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICcontrolRequest { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICcontrolStatus.h b/e2ap/headers/RICcontrolStatus.h deleted file mode 100644 index 033f5a9..0000000 --- a/e2ap/headers/RICcontrolStatus.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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_per_constraints_t asn_PER_type_RICcontrolStatus_constr_1; -extern asn_TYPE_descriptor_t asn_DEF_RICcontrolStatus; -extern const asn_INTEGER_specifics_t asn_SPC_RICcontrolStatus_specs_1; -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/e2ap/headers/RICeventTriggerDefinition.h b/e2ap/headers/RICeventTriggerDefinition.h index 58ec4d2..ca6c502 100644 --- a/e2ap/headers/RICeventTriggerDefinition.h +++ b/e2ap/headers/RICeventTriggerDefinition.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICeventTriggerDefinition_H_ #define _RICeventTriggerDefinition_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "OCTET_STRING.h" #ifdef __cplusplus extern "C" { @@ -30,6 +30,7 @@ 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; +jer_type_encoder_f RICeventTriggerDefinition_encode_jer; oer_type_decoder_f RICeventTriggerDefinition_decode_oer; oer_type_encoder_f RICeventTriggerDefinition_encode_oer; per_type_decoder_f RICeventTriggerDefinition_decode_uper; @@ -42,4 +43,4 @@ per_type_encoder_f RICeventTriggerDefinition_encode_aper; #endif #endif /* _RICeventTriggerDefinition_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICindication.h b/e2ap/headers/RICindication.h index c984ab6..765c819 100644 --- a/e2ap/headers/RICindication.h +++ b/e2ap/headers/RICindication.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICindication_H_ #define _RICindication_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICindication */ typedef struct RICindication { - ProtocolIE_Container_87P6_t protocolIEs; + ProtocolIE_Container_85P7_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICindication { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICindicationHeader.h b/e2ap/headers/RICindicationHeader.h index 3220602..91b7132 100644 --- a/e2ap/headers/RICindicationHeader.h +++ b/e2ap/headers/RICindicationHeader.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICindicationHeader_H_ #define _RICindicationHeader_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "OCTET_STRING.h" #ifdef __cplusplus extern "C" { @@ -30,6 +30,7 @@ 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; +jer_type_encoder_f RICindicationHeader_encode_jer; oer_type_decoder_f RICindicationHeader_decode_oer; oer_type_encoder_f RICindicationHeader_encode_oer; per_type_decoder_f RICindicationHeader_decode_uper; @@ -42,4 +43,4 @@ per_type_encoder_f RICindicationHeader_encode_aper; #endif #endif /* _RICindicationHeader_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICindicationMessage.h b/e2ap/headers/RICindicationMessage.h index f00ebe7..b538253 100644 --- a/e2ap/headers/RICindicationMessage.h +++ b/e2ap/headers/RICindicationMessage.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICindicationMessage_H_ #define _RICindicationMessage_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "OCTET_STRING.h" #ifdef __cplusplus extern "C" { @@ -30,6 +30,7 @@ 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; +jer_type_encoder_f RICindicationMessage_encode_jer; oer_type_decoder_f RICindicationMessage_decode_oer; oer_type_encoder_f RICindicationMessage_encode_oer; per_type_decoder_f RICindicationMessage_decode_uper; @@ -42,4 +43,4 @@ per_type_encoder_f RICindicationMessage_encode_aper; #endif #endif /* _RICindicationMessage_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICindicationSN.h b/e2ap/headers/RICindicationSN.h index 498aaef..8afed19 100644 --- a/e2ap/headers/RICindicationSN.h +++ b/e2ap/headers/RICindicationSN.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICindicationSN_H_ #define _RICindicationSN_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeInteger.h" #ifdef __cplusplus extern "C" { @@ -31,6 +31,7 @@ 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; +jer_type_encoder_f RICindicationSN_encode_jer; oer_type_decoder_f RICindicationSN_decode_oer; oer_type_encoder_f RICindicationSN_encode_oer; per_type_decoder_f RICindicationSN_decode_uper; @@ -43,4 +44,4 @@ per_type_encoder_f RICindicationSN_encode_aper; #endif #endif /* _RICindicationSN_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICindicationType.h b/e2ap/headers/RICindicationType.h index ffc0335..eda4009 100644 --- a/e2ap/headers/RICindicationType.h +++ b/e2ap/headers/RICindicationType.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICindicationType_H_ #define _RICindicationType_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -41,6 +41,7 @@ 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; +jer_type_encoder_f RICindicationType_encode_jer; oer_type_decoder_f RICindicationType_decode_oer; oer_type_encoder_f RICindicationType_encode_oer; per_type_decoder_f RICindicationType_decode_uper; @@ -53,4 +54,4 @@ per_type_encoder_f RICindicationType_encode_aper; #endif #endif /* _RICindicationType_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICrequestID.h b/e2ap/headers/RICrequestID.h index b76c37c..ea1c63a 100644 --- a/e2ap/headers/RICrequestID.h +++ b/e2ap/headers/RICrequestID.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICrequestID_H_ #define _RICrequestID_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include -#include +#include "NativeInteger.h" +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -42,4 +42,4 @@ extern asn_TYPE_member_t asn_MBR_RICrequestID_1[2]; #endif #endif /* _RICrequestID_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICserviceQuery.h b/e2ap/headers/RICserviceQuery.h index 3b2c4ee..860573d 100644 --- a/e2ap/headers/RICserviceQuery.h +++ b/e2ap/headers/RICserviceQuery.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICserviceQuery_H_ #define _RICserviceQuery_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICserviceQuery */ typedef struct RICserviceQuery { - ProtocolIE_Container_87P19_t protocolIEs; + ProtocolIE_Container_85P26_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICserviceQuery { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICserviceUpdate.h b/e2ap/headers/RICserviceUpdate.h index 9ade74f..320dd09 100644 --- a/e2ap/headers/RICserviceUpdate.h +++ b/e2ap/headers/RICserviceUpdate.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICserviceUpdate_H_ #define _RICserviceUpdate_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICserviceUpdate */ typedef struct RICserviceUpdate { - ProtocolIE_Container_87P16_t protocolIEs; + ProtocolIE_Container_85P23_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICserviceUpdate { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICserviceUpdateAcknowledge.h b/e2ap/headers/RICserviceUpdateAcknowledge.h index 4b08d1a..8375ac4 100644 --- a/e2ap/headers/RICserviceUpdateAcknowledge.h +++ b/e2ap/headers/RICserviceUpdateAcknowledge.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICserviceUpdateAcknowledge_H_ #define _RICserviceUpdateAcknowledge_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICserviceUpdateAcknowledge */ typedef struct RICserviceUpdateAcknowledge { - ProtocolIE_Container_87P17_t protocolIEs; + ProtocolIE_Container_85P24_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICserviceUpdateAcknowledge { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICserviceUpdateFailure.h b/e2ap/headers/RICserviceUpdateFailure.h index c00559e..d7a2fd2 100644 --- a/e2ap/headers/RICserviceUpdateFailure.h +++ b/e2ap/headers/RICserviceUpdateFailure.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICserviceUpdateFailure_H_ #define _RICserviceUpdateFailure_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICserviceUpdateFailure */ typedef struct RICserviceUpdateFailure { - ProtocolIE_Container_87P18_t protocolIEs; + ProtocolIE_Container_85P25_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICserviceUpdateFailure { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubscription-List-withCause.h b/e2ap/headers/RICsubscription-List-withCause.h new file mode 100644 index 0000000..bc47b09 --- /dev/null +++ b/e2ap/headers/RICsubscription-List-withCause.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _RICsubscription_List_withCause_H_ +#define _RICsubscription_List_withCause_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainer; + +/* RICsubscription-List-withCause */ +typedef struct RICsubscription_List_withCause { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscription_List_withCause_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscription_List_withCause; +extern asn_SET_OF_specifics_t asn_SPC_RICsubscription_List_withCause_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscription_List_withCause_1[1]; +extern asn_per_constraints_t asn_PER_type_RICsubscription_List_withCause_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscription_List_withCause_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubscription-withCause-Item.h b/e2ap/headers/RICsubscription-withCause-Item.h new file mode 100644 index 0000000..8ad4410 --- /dev/null +++ b/e2ap/headers/RICsubscription-withCause-Item.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _RICsubscription_withCause_Item_H_ +#define _RICsubscription_withCause_Item_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "RICrequestID.h" +#include "RANfunctionID.h" +#include "Cause.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscription-withCause-Item */ +typedef struct RICsubscription_withCause_Item { + RICrequestID_t ricRequestID; + RANfunctionID_t ranFunctionID; + Cause_t cause; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscription_withCause_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscription_withCause_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscription_withCause_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscription_withCause_Item_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscription_withCause_Item_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubscriptionDeleteFailure.h b/e2ap/headers/RICsubscriptionDeleteFailure.h index 59bb7d4..f492729 100644 --- a/e2ap/headers/RICsubscriptionDeleteFailure.h +++ b/e2ap/headers/RICsubscriptionDeleteFailure.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICsubscriptionDeleteFailure_H_ #define _RICsubscriptionDeleteFailure_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionDeleteFailure */ typedef struct RICsubscriptionDeleteFailure { - ProtocolIE_Container_87P5_t protocolIEs; + ProtocolIE_Container_85P5_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICsubscriptionDeleteFailure { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubscriptionDeleteRequest.h b/e2ap/headers/RICsubscriptionDeleteRequest.h index 5019dab..ae4633b 100644 --- a/e2ap/headers/RICsubscriptionDeleteRequest.h +++ b/e2ap/headers/RICsubscriptionDeleteRequest.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICsubscriptionDeleteRequest_H_ #define _RICsubscriptionDeleteRequest_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionDeleteRequest */ typedef struct RICsubscriptionDeleteRequest { - ProtocolIE_Container_87P3_t protocolIEs; + ProtocolIE_Container_85P3_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICsubscriptionDeleteRequest { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubscriptionDeleteRequired.h b/e2ap/headers/RICsubscriptionDeleteRequired.h new file mode 100644 index 0000000..cb81247 --- /dev/null +++ b/e2ap/headers/RICsubscriptionDeleteRequired.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _RICsubscriptionDeleteRequired_H_ +#define _RICsubscriptionDeleteRequired_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "ProtocolIE-Container.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionDeleteRequired */ +typedef struct RICsubscriptionDeleteRequired { + ProtocolIE_Container_85P6_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteRequired_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequired; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequired_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequired_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionDeleteRequired_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubscriptionDeleteResponse.h b/e2ap/headers/RICsubscriptionDeleteResponse.h index b1aeba6..828a07b 100644 --- a/e2ap/headers/RICsubscriptionDeleteResponse.h +++ b/e2ap/headers/RICsubscriptionDeleteResponse.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICsubscriptionDeleteResponse_H_ #define _RICsubscriptionDeleteResponse_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionDeleteResponse */ typedef struct RICsubscriptionDeleteResponse { - ProtocolIE_Container_87P4_t protocolIEs; + ProtocolIE_Container_85P4_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICsubscriptionDeleteResponse { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubscriptionDetails.h b/e2ap/headers/RICsubscriptionDetails.h index 9b0a03e..385b823 100644 --- a/e2ap/headers/RICsubscriptionDetails.h +++ b/e2ap/headers/RICsubscriptionDetails.h @@ -1,20 +1,20 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICsubscriptionDetails_H_ #define _RICsubscriptionDetails_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "RICeventTriggerDefinition.h" #include "RICactions-ToBeSetup-List.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -43,4 +43,4 @@ extern asn_TYPE_member_t asn_MBR_RICsubscriptionDetails_1[2]; #endif #endif /* _RICsubscriptionDetails_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubscriptionFailure.h b/e2ap/headers/RICsubscriptionFailure.h index c8c4a77..1f4b435 100644 --- a/e2ap/headers/RICsubscriptionFailure.h +++ b/e2ap/headers/RICsubscriptionFailure.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICsubscriptionFailure_H_ #define _RICsubscriptionFailure_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionFailure */ typedef struct RICsubscriptionFailure { - ProtocolIE_Container_87P2_t protocolIEs; + ProtocolIE_Container_85P2_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICsubscriptionFailure { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubscriptionRequest.h b/e2ap/headers/RICsubscriptionRequest.h index 9e9e0bb..effadfc 100644 --- a/e2ap/headers/RICsubscriptionRequest.h +++ b/e2ap/headers/RICsubscriptionRequest.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICsubscriptionRequest_H_ #define _RICsubscriptionRequest_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionRequest */ typedef struct RICsubscriptionRequest { - ProtocolIE_Container_87P0_t protocolIEs; + ProtocolIE_Container_85P0_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICsubscriptionRequest { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubscriptionResponse.h b/e2ap/headers/RICsubscriptionResponse.h index 9b8bb17..206a91f 100644 --- a/e2ap/headers/RICsubscriptionResponse.h +++ b/e2ap/headers/RICsubscriptionResponse.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICsubscriptionResponse_H_ #define _RICsubscriptionResponse_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionResponse */ typedef struct RICsubscriptionResponse { - ProtocolIE_Container_87P1_t protocolIEs; + ProtocolIE_Container_85P1_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct RICsubscriptionResponse { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubsequentAction.h b/e2ap/headers/RICsubsequentAction.h index fffdc21..9549d4f 100644 --- a/e2ap/headers/RICsubsequentAction.h +++ b/e2ap/headers/RICsubsequentAction.h @@ -1,20 +1,20 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICsubsequentAction_H_ #define _RICsubsequentAction_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "RICsubsequentActionType.h" #include "RICtimeToWait.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -43,4 +43,4 @@ extern asn_TYPE_member_t asn_MBR_RICsubsequentAction_1[2]; #endif #endif /* _RICsubsequentAction_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICsubsequentActionType.h b/e2ap/headers/RICsubsequentActionType.h index 1dea790..99c3241 100644 --- a/e2ap/headers/RICsubsequentActionType.h +++ b/e2ap/headers/RICsubsequentActionType.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICsubsequentActionType_H_ #define _RICsubsequentActionType_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -41,6 +41,7 @@ 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; +jer_type_encoder_f RICsubsequentActionType_encode_jer; oer_type_decoder_f RICsubsequentActionType_decode_oer; oer_type_encoder_f RICsubsequentActionType_encode_oer; per_type_decoder_f RICsubsequentActionType_decode_uper; @@ -53,4 +54,4 @@ per_type_encoder_f RICsubsequentActionType_encode_aper; #endif #endif /* _RICsubsequentActionType_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/RICtimeToWait.h b/e2ap/headers/RICtimeToWait.h index efe9b2a..45cdebc 100644 --- a/e2ap/headers/RICtimeToWait.h +++ b/e2ap/headers/RICtimeToWait.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RICtimeToWait_H_ #define _RICtimeToWait_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -20,24 +20,23 @@ extern "C" { /* 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 + RICtimeToWait_w1ms = 0, + RICtimeToWait_w2ms = 1, + RICtimeToWait_w5ms = 2, + RICtimeToWait_w10ms = 3, + RICtimeToWait_w20ms = 4, + RICtimeToWait_w30ms = 5, + RICtimeToWait_w40ms = 6, + RICtimeToWait_w50ms = 7, + RICtimeToWait_w100ms = 8, + RICtimeToWait_w200ms = 9, + RICtimeToWait_w500ms = 10, + RICtimeToWait_w1s = 11, + RICtimeToWait_w2s = 12, + RICtimeToWait_w5s = 13, + RICtimeToWait_w10s = 14, + RICtimeToWait_w20s = 15, + RICtimeToWait_w60s = 16 /* * Enumeration is extensible */ @@ -57,6 +56,7 @@ 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; +jer_type_encoder_f RICtimeToWait_encode_jer; oer_type_decoder_f RICtimeToWait_decode_oer; oer_type_encoder_f RICtimeToWait_encode_oer; per_type_decoder_f RICtimeToWait_decode_uper; @@ -69,4 +69,4 @@ per_type_encoder_f RICtimeToWait_encode_aper; #endif #endif /* _RICtimeToWait_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/ResetRequest.h b/e2ap/headers/ResetRequest.h index b8ccee4..800875a 100644 --- a/e2ap/headers/ResetRequest.h +++ b/e2ap/headers/ResetRequest.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ResetRequest_H_ #define _ResetRequest_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* ResetRequest */ typedef struct ResetRequest { - ProtocolIE_Container_87P14_t protocolIEs; + ProtocolIE_Container_85P21_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct ResetRequest { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/ResetResponse.h b/e2ap/headers/ResetResponse.h index cfd7a3c..778ce50 100644 --- a/e2ap/headers/ResetResponse.h +++ b/e2ap/headers/ResetResponse.h @@ -1,19 +1,19 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ResetResponse_H_ #define _ResetResponse_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProtocolIE-Container.h" -#include +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -21,7 +21,7 @@ extern "C" { /* ResetResponse */ typedef struct ResetResponse { - ProtocolIE_Container_87P15_t protocolIEs; + ProtocolIE_Container_85P22_t protocolIEs; /* * This type is extensible, * possible extensions are below. @@ -33,10 +33,12 @@ typedef struct ResetResponse { /* 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 +#include "asn_internal.h" diff --git a/e2ap/headers/SuccessfulOutcome.h b/e2ap/headers/SuccessfulOutcome.h index 734bd7e..b975932 100644 --- a/e2ap/headers/SuccessfulOutcome.h +++ b/e2ap/headers/SuccessfulOutcome.h @@ -1,21 +1,21 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP-PDU-Descriptions-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "elementryProcedureDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _SuccessfulOutcome_H_ #define _SuccessfulOutcome_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProcedureCode.h" #include "Criticality.h" -#include -#include +#include "ANY.h" +#include "asn_ioc.h" #include "RICsubscriptionRequest.h" #include "RICsubscriptionResponse.h" #include "RICsubscriptionFailure.h" @@ -31,14 +31,21 @@ #include "E2setupRequest.h" #include "E2setupResponse.h" #include "E2setupFailure.h" +#include "E2nodeConfigurationUpdate.h" +#include "E2nodeConfigurationUpdateAcknowledge.h" +#include "E2nodeConfigurationUpdateFailure.h" +#include "E2connectionUpdate.h" +#include "E2connectionUpdateAcknowledge.h" +#include "E2connectionUpdateFailure.h" #include "ResetRequest.h" #include "ResetResponse.h" #include "RICindication.h" #include "RICserviceQuery.h" #include "ErrorIndication.h" -#include -#include -#include +#include "RICsubscriptionDeleteRequired.h" +#include "OPEN_TYPE.h" +#include "constr_CHOICE.h" +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -52,6 +59,8 @@ typedef enum SuccessfulOutcome__value_PR { SuccessfulOutcome__value_PR_RICserviceUpdateAcknowledge, SuccessfulOutcome__value_PR_RICcontrolAcknowledge, SuccessfulOutcome__value_PR_E2setupResponse, + SuccessfulOutcome__value_PR_E2nodeConfigurationUpdateAcknowledge, + SuccessfulOutcome__value_PR_E2connectionUpdateAcknowledge, SuccessfulOutcome__value_PR_ResetResponse } SuccessfulOutcome__value_PR; @@ -67,6 +76,8 @@ typedef struct SuccessfulOutcome { RICserviceUpdateAcknowledge_t RICserviceUpdateAcknowledge; RICcontrolAcknowledge_t RICcontrolAcknowledge; E2setupResponse_t E2setupResponse; + E2nodeConfigurationUpdateAcknowledge_t E2nodeConfigurationUpdateAcknowledge; + E2connectionUpdateAcknowledge_t E2connectionUpdateAcknowledge; ResetResponse_t ResetResponse; } choice; @@ -88,4 +99,4 @@ extern asn_TYPE_member_t asn_MBR_SuccessfulOutcome_1[3]; #endif #endif /* _SuccessfulOutcome_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/TNLinformation.h b/e2ap/headers/TNLinformation.h new file mode 100644 index 0000000..5a05307 --- /dev/null +++ b/e2ap/headers/TNLinformation.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _TNLinformation_H_ +#define _TNLinformation_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "BIT_STRING.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* TNLinformation */ +typedef struct TNLinformation { + BIT_STRING_t tnlAddress; + BIT_STRING_t *tnlPort; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} TNLinformation_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_TNLinformation; +extern asn_SEQUENCE_specifics_t asn_SPC_TNLinformation_specs_1; +extern asn_TYPE_member_t asn_MBR_TNLinformation_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _TNLinformation_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/TNLusage.h b/e2ap/headers/TNLusage.h new file mode 100644 index 0000000..edc6a12 --- /dev/null +++ b/e2ap/headers/TNLusage.h @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _TNLusage_H_ +#define _TNLusage_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "NativeEnumerated.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum TNLusage { + TNLusage_ric_service = 0, + TNLusage_support_function = 1, + TNLusage_both = 2 + /* + * Enumeration is extensible + */ +} e_TNLusage; + +/* TNLusage */ +typedef long TNLusage_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_TNLusage_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_TNLusage; +extern const asn_INTEGER_specifics_t asn_SPC_TNLusage_specs_1; +asn_struct_free_f TNLusage_free; +asn_struct_print_f TNLusage_print; +asn_constr_check_f TNLusage_constraint; +ber_type_decoder_f TNLusage_decode_ber; +der_type_encoder_f TNLusage_encode_der; +xer_type_decoder_f TNLusage_decode_xer; +xer_type_encoder_f TNLusage_encode_xer; +jer_type_encoder_f TNLusage_encode_jer; +oer_type_decoder_f TNLusage_decode_oer; +oer_type_encoder_f TNLusage_encode_oer; +per_type_decoder_f TNLusage_decode_uper; +per_type_encoder_f TNLusage_encode_uper; +per_type_decoder_f TNLusage_decode_aper; +per_type_encoder_f TNLusage_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _TNLusage_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/TimeToWait.h b/e2ap/headers/TimeToWait.h index 9627535..dff1b76 100644 --- a/e2ap/headers/TimeToWait.h +++ b/e2ap/headers/TimeToWait.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _TimeToWait_H_ #define _TimeToWait_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -45,6 +45,7 @@ ber_type_decoder_f TimeToWait_decode_ber; der_type_encoder_f TimeToWait_encode_der; xer_type_decoder_f TimeToWait_decode_xer; xer_type_encoder_f TimeToWait_encode_xer; +jer_type_encoder_f TimeToWait_encode_jer; oer_type_decoder_f TimeToWait_decode_oer; oer_type_encoder_f TimeToWait_encode_oer; per_type_decoder_f TimeToWait_decode_uper; @@ -57,4 +58,4 @@ per_type_encoder_f TimeToWait_encode_aper; #endif #endif /* _TimeToWait_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/TransactionID.h b/e2ap/headers/TransactionID.h new file mode 100644 index 0000000..2e32312 --- /dev/null +++ b/e2ap/headers/TransactionID.h @@ -0,0 +1,47 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _TransactionID_H_ +#define _TransactionID_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "NativeInteger.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* TransactionID */ +typedef long TransactionID_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_TransactionID_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_TransactionID; +asn_struct_free_f TransactionID_free; +asn_struct_print_f TransactionID_print; +asn_constr_check_f TransactionID_constraint; +ber_type_decoder_f TransactionID_decode_ber; +der_type_encoder_f TransactionID_encode_der; +xer_type_decoder_f TransactionID_decode_xer; +xer_type_encoder_f TransactionID_encode_xer; +jer_type_encoder_f TransactionID_encode_jer; +oer_type_decoder_f TransactionID_decode_oer; +oer_type_encoder_f TransactionID_encode_oer; +per_type_decoder_f TransactionID_decode_uper; +per_type_encoder_f TransactionID_encode_uper; +per_type_decoder_f TransactionID_decode_aper; +per_type_encoder_f TransactionID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _TransactionID_H_ */ +#include "asn_internal.h" diff --git a/e2ap/headers/TriggeringMessage.h b/e2ap/headers/TriggeringMessage.h index 6f9f42e..17c3924 100644 --- a/e2ap/headers/TriggeringMessage.h +++ b/e2ap/headers/TriggeringMessage.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP-CommonDataTypes-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "commonDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _TriggeringMessage_H_ #define _TriggeringMessage_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -39,6 +39,7 @@ ber_type_decoder_f TriggeringMessage_decode_ber; der_type_encoder_f TriggeringMessage_encode_der; xer_type_decoder_f TriggeringMessage_decode_xer; xer_type_encoder_f TriggeringMessage_encode_xer; +jer_type_encoder_f TriggeringMessage_encode_jer; oer_type_decoder_f TriggeringMessage_decode_oer; oer_type_encoder_f TriggeringMessage_encode_oer; per_type_decoder_f TriggeringMessage_decode_uper; @@ -51,4 +52,4 @@ per_type_encoder_f TriggeringMessage_encode_aper; #endif #endif /* _TriggeringMessage_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/TypeOfError.h b/e2ap/headers/TypeOfError.h index aec2d63..6eabb4f 100644 --- a/e2ap/headers/TypeOfError.h +++ b/e2ap/headers/TypeOfError.h @@ -1,18 +1,18 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _TypeOfError_H_ #define _TypeOfError_H_ -#include +#include "asn_application.h" /* Including external dependencies */ -#include +#include "NativeEnumerated.h" #ifdef __cplusplus extern "C" { @@ -41,6 +41,7 @@ ber_type_decoder_f TypeOfError_decode_ber; der_type_encoder_f TypeOfError_encode_der; xer_type_decoder_f TypeOfError_decode_xer; xer_type_encoder_f TypeOfError_encode_xer; +jer_type_encoder_f TypeOfError_encode_jer; oer_type_decoder_f TypeOfError_decode_oer; oer_type_encoder_f TypeOfError_encode_oer; per_type_decoder_f TypeOfError_decode_uper; @@ -53,4 +54,4 @@ per_type_encoder_f TypeOfError_encode_aper; #endif #endif /* _TypeOfError_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/UnsuccessfulOutcome.h b/e2ap/headers/UnsuccessfulOutcome.h index baf8838..3f27b24 100644 --- a/e2ap/headers/UnsuccessfulOutcome.h +++ b/e2ap/headers/UnsuccessfulOutcome.h @@ -1,21 +1,21 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP-PDU-Descriptions-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "elementryProcedureDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UnsuccessfulOutcome_H_ #define _UnsuccessfulOutcome_H_ -#include +#include "asn_application.h" /* Including external dependencies */ #include "ProcedureCode.h" #include "Criticality.h" -#include -#include +#include "ANY.h" +#include "asn_ioc.h" #include "RICsubscriptionRequest.h" #include "RICsubscriptionResponse.h" #include "RICsubscriptionFailure.h" @@ -31,14 +31,21 @@ #include "E2setupRequest.h" #include "E2setupResponse.h" #include "E2setupFailure.h" +#include "E2nodeConfigurationUpdate.h" +#include "E2nodeConfigurationUpdateAcknowledge.h" +#include "E2nodeConfigurationUpdateFailure.h" +#include "E2connectionUpdate.h" +#include "E2connectionUpdateAcknowledge.h" +#include "E2connectionUpdateFailure.h" #include "ResetRequest.h" #include "ResetResponse.h" #include "RICindication.h" #include "RICserviceQuery.h" #include "ErrorIndication.h" -#include -#include -#include +#include "RICsubscriptionDeleteRequired.h" +#include "OPEN_TYPE.h" +#include "constr_CHOICE.h" +#include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { @@ -51,7 +58,9 @@ typedef enum UnsuccessfulOutcome__value_PR { UnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure, UnsuccessfulOutcome__value_PR_RICserviceUpdateFailure, UnsuccessfulOutcome__value_PR_RICcontrolFailure, - UnsuccessfulOutcome__value_PR_E2setupFailure + UnsuccessfulOutcome__value_PR_E2setupFailure, + UnsuccessfulOutcome__value_PR_E2nodeConfigurationUpdateFailure, + UnsuccessfulOutcome__value_PR_E2connectionUpdateFailure } UnsuccessfulOutcome__value_PR; /* UnsuccessfulOutcome */ @@ -66,6 +75,8 @@ typedef struct UnsuccessfulOutcome { RICserviceUpdateFailure_t RICserviceUpdateFailure; RICcontrolFailure_t RICcontrolFailure; E2setupFailure_t E2setupFailure; + E2nodeConfigurationUpdateFailure_t E2nodeConfigurationUpdateFailure; + E2connectionUpdateFailure_t E2connectionUpdateFailure; } choice; /* Context for parsing across buffer boundaries */ @@ -86,4 +97,4 @@ extern asn_TYPE_member_t asn_MBR_UnsuccessfulOutcome_1[3]; #endif #endif /* _UnsuccessfulOutcome_H_ */ -#include +#include "asn_internal.h" diff --git a/e2ap/headers/aper_decoder.h b/e2ap/headers/aper_decoder.h new file mode 100644 index 0000000..10352c7 --- /dev/null +++ b/e2ap/headers/aper_decoder.h @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _APER_DECODER_H_ +#define _APER_DECODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * 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 */ + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _APER_DECODER_H_ */ diff --git a/e2ap/headers/aper_encoder.h b/e2ap/headers/aper_encoder.h new file mode 100644 index 0000000..957b0bd --- /dev/null +++ b/e2ap/headers/aper_encoder.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 2006-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _APER_ENCODER_H_ +#define _APER_ENCODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Aligned 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 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 aper_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 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 aper_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 aper_encode() and aper_encode_to_buffer(). + */ +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 +); + +#ifdef __cplusplus +} +#endif + +#endif /* _APER_ENCODER_H_ */ diff --git a/e2ap/headers/aper_opentype.h b/e2ap/headers/aper_opentype.h new file mode 100644 index 0000000..451b01c --- /dev/null +++ b/e2ap/headers/aper_opentype.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2007-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _APER_OPENTYPE_H_ +#define _APER_OPENTYPE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +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 /* _APER_OPENTYPE_H_ */ diff --git a/e2ap/headers/aper_support.h b/e2ap/headers/aper_support.h new file mode 100644 index 0000000..a372445 --- /dev/null +++ b/e2ap/headers/aper_support.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _APER_SUPPORT_H_ +#define _APER_SUPPORT_H_ + +#include /* Platform-specific types */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * X.691 (08/2015) #11.9 "General rules for encoding a length determinant" + * Get the length "n" from the Aligned PER stream. + */ +ssize_t aper_get_length(asn_per_data_t *pd, ssize_t lb, ssize_t ub, + int effective_bound_bits, int *repeat); + +/* + * Get the normally small length "n". + */ +ssize_t aper_get_nslength(asn_per_data_t *pd); + +/* + * Get the normally small non-negative whole number. + */ +ssize_t aper_get_nsnnwn(asn_per_data_t *pd, int range); + +/* + * X.691 (08/2015) #11.9 "General rules for encoding a length determinant" + * Put the length "n" to the Aligned PER stream. + * If (opt_need_eom) is given, it will be set to 1 if final 0-n is needed. + * In that case, invoke aper_put_length(po, -1, -1, 0, NULL) after encoding the + * last block. + * This function returns the number of units which may be flushed + * in the next units saving iteration. + */ +ssize_t aper_put_length(asn_per_outp_t *po, ssize_t lb, ssize_t ub, size_t n, + int *opt_need_eom); + +/* 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 aper_put_nslength(asn_per_outp_t *po, size_t length); + +/* + * Put the normally small non-negative whole number. + */ +int aper_put_nsnnwn(asn_per_outp_t *po, int range, int number); + +#ifdef __cplusplus +} +#endif + +#endif /* _APER_SUPPORT_H_ */ diff --git a/e2ap/headers/asn_application.h b/e2ap/headers/asn_application.h index 034f646..bf10cd3 100644 --- a/e2ap/headers/asn_application.h +++ b/e2ap/headers/asn_application.h @@ -10,6 +10,7 @@ #include "asn_system.h" /* for platform-dependent types */ #include "asn_codecs.h" /* for ASN.1 codecs specifics */ +#include "asn_config.h" #ifdef __cplusplus extern "C" { @@ -59,7 +60,8 @@ enum asn_transfer_syntax { * CANONICAL-XER is a more strict variant of BASIC-XER. */ ATS_BASIC_XER, - ATS_CANONICAL_XER + ATS_CANONICAL_XER, + ATS_JER, }; /* diff --git a/e2ap/headers/asn_bit_data.h b/e2ap/headers/asn_bit_data.h index 59de7af..f14714b 100644 --- a/e2ap/headers/asn_bit_data.h +++ b/e2ap/headers/asn_bit_data.h @@ -36,7 +36,7 @@ asn_bit_data_t *asn_bit_data_new_contiguous(const void *data, size_t size_bits); */ int32_t asn_get_few_bits(asn_bit_data_t *, int get_nbits); -/* Undo the immediately preceeding "get_few_bits" operation */ +/* Undo the immediately preceding "get_few_bits" operation */ void asn_get_undo(asn_bit_data_t *, int get_nbits); /* diff --git a/e2ap/headers/asn_codecs_prim.h b/e2ap/headers/asn_codecs_prim.h index fbc5576..5bbd9cf 100644 --- a/e2ap/headers/asn_codecs_prim.h +++ b/e2ap/headers/asn_codecs_prim.h @@ -12,23 +12,27 @@ 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! */ + 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; + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f ber_decode_primitive; der_type_encoder_f der_encode_primitive; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) /* * 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 */ + 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, @@ -43,6 +47,7 @@ asn_dec_rval_t xer_decode_primitive( 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); +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2ap/headers/asn_config.h b/e2ap/headers/asn_config.h new file mode 100644 index 0000000..551bcc7 --- /dev/null +++ b/e2ap/headers/asn_config.h @@ -0,0 +1,2 @@ +// Generated automatically. Don't edit manually! + diff --git a/e2ap/headers/asn_constant.h b/e2ap/headers/asn_constant.h index a6f348c..87f8474 100644 --- a/e2ap/headers/asn_constant.h +++ b/e2ap/headers/asn_constant.h @@ -9,10 +9,31 @@ extern "C" { #endif +#define min_val_ProcedureCode (0) +#define max_val_ProcedureCode (255) +#define min_val_ProtocolIE_ID (0) +#define max_val_ProtocolIE_ID (65535) #define maxProtocolIEs (65535) #define maxnoofErrors (256) +#define maxofE2nodeComponents (1024) #define maxofRANfunctionID (256) #define maxofRICactionID (16) +#define maxofTNLA (32) +#define maxofRICrequestID (4294967295) +#define min_val_GNB_CU_UP_ID (0) +#define max_val_GNB_CU_UP_ID (68719476735) +#define min_val_GNB_DU_ID (0) +#define max_val_GNB_DU_ID (68719476735) +#define min_val_NGENB_DU_ID (0) +#define max_val_NGENB_DU_ID (68719476735) +#define min_val_RANfunctionID (0) +#define max_val_RANfunctionID (4095) +#define min_val_RANfunctionRevision (0) +#define max_val_RANfunctionRevision (4095) +#define min_val_RICactionID (0) +#define max_val_RICactionID (255) +#define min_val_RICindicationSN (0) +#define max_val_RICindicationSN (65535) #ifdef __cplusplus diff --git a/e2ap/headers/asn_internal.h b/e2ap/headers/asn_internal.h index c4105ad..d6ce619 100644 --- a/e2ap/headers/asn_internal.h +++ b/e2ap/headers/asn_internal.h @@ -7,7 +7,9 @@ */ #ifndef ASN_INTERNAL_H #define ASN_INTERNAL_H +#ifndef __EXTENSIONS__ #define __EXTENSIONS__ /* for Sun */ +#endif #include "asn_application.h" /* Application-visible API */ @@ -19,6 +21,15 @@ extern "C" { #endif +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#include +#include +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#include +#include +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + /* 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 */ @@ -42,8 +53,7 @@ int get_asn1c_environment_version(void); /* Run-time version */ */ #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 +#if __STDC_VERSION__ >= 199901L #ifdef ASN_THREAD_SAFE /* Thread safety requires sacrifice in output indentation: * Retain empty definition of ASN_DEBUG_INDENT_ADD. */ @@ -53,12 +63,6 @@ int get_asn1c_environment_version(void); /* Run-time version */ 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, " "); \ @@ -66,7 +70,6 @@ extern int logAsn1c(const char *filename, int linenumber, const char *format, .. 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 @@ -133,7 +136,31 @@ asn__format_to_callback( /* * Check stack against overflow, if limit is set. */ + +/* Since GCC 13, AddressSanitizer started defaulting to +* ASAN_OPTIONS="detect_stack_use_after_return=1", which makes this check +* fail due to apparently jumping stack pointers. +* Hence, disable this check if building with ASan, as documented in: +* GCC: https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html +* Clang: https://clang.llvm.org/docs/AddressSanitizer.html#conditional-compilation-with-has-feature-address-sanitizer +*/ +#if defined(__SANITIZE_ADDRESS__) + #define ASN__SANITIZE_ENABLED 1 +#elif defined(__has_feature) +#if __has_feature(address_sanitizer) + #define ASN__SANITIZE_ENABLED 1 +#endif +#endif + #define ASN__DEFAULT_STACK_MAX (30000) + +#if defined(ASN__SANITIZE_ENABLED) || defined(ASN_DISABLE_STACK_OVERFLOW_CHECK) +static int CC_NOTUSED +ASN__STACK_OVERFLOW_CHECK(const asn_codec_ctx_t *ctx) { + (void)ctx; + return 0; +} +#else static int CC_NOTUSED ASN__STACK_OVERFLOW_CHECK(const asn_codec_ctx_t *ctx) { if(ctx && ctx->max_stack_size) { @@ -151,6 +178,7 @@ ASN__STACK_OVERFLOW_CHECK(const asn_codec_ctx_t *ctx) { } return 0; } +#endif #ifdef __cplusplus } diff --git a/e2ap/headers/asn_system.h b/e2ap/headers/asn_system.h index fa8cf11..0f0d495 100644 --- a/e2ap/headers/asn_system.h +++ b/e2ap/headers/asn_system.h @@ -27,12 +27,15 @@ #include /* For LONG_MAX */ #include /* For va_start */ #include /* for offsetof and ptrdiff_t */ +#include /* for PRIdMAX */ #ifdef _WIN32 #include +#ifndef __MINGW32__ #define snprintf _snprintf #define vsnprintf _vsnprintf +#endif /* To avoid linking with ws2_32.lib, here's the definition of ntohl() */ #define sys_ntohl(l) ((((l) << 24) & 0xff000000) \ @@ -75,7 +78,9 @@ typedef unsigned int uint32_t; #else /* !defined(__vxworks) */ #include /* C99 specifies this file */ +#ifdef HAVE_NETINET_IN_H #include /* for ntohl() */ +#endif #define sys_ntohl(foo) ntohl(foo) #endif /* defined(__vxworks) */ @@ -86,11 +91,25 @@ typedef unsigned int uint32_t; #else #define CC_ATTRIBUTE(attr) #endif -#define CC_PRINTFLIKE(fmt, var) CC_ATTRIBUTE(format(printf, fmt, var)) +#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__>= 4) || __GNUC__ > 4) +#define CC_PRINTFLIKE(fmt, var) CC_ATTRIBUTE(format(gnu_printf, fmt, var)) +#elif defined(__GNUC__) +#if defined(ANDROID) +#define CC_PRINTFLIKE(fmt, var) CC_ATTRIBUTE(__format__(__printf__, fmt, var)) +#else +#define CC_PRINTFLIKE(fmt, var) CC_ATTRIBUTE(format(printf, fmt, var)) +#endif +#else +#define CC_PRINTFLIKE(fmt, var) +#endif #define CC_NOTUSED CC_ATTRIBUTE(unused) #ifndef CC_ATTR_NO_SANITIZE +#if __GNUC__ < 8 +#define CC_ATTR_NO_SANITIZE(what) +#else #define CC_ATTR_NO_SANITIZE(what) CC_ATTRIBUTE(no_sanitize(what)) #endif +#endif /* Figure out if thread safety is requested */ #if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || defined(_REENTRANT)) diff --git a/e2ap/headers/constr_CHOICE.h b/e2ap/headers/constr_CHOICE.h index a1999ed..03d606c 100644 --- a/e2ap/headers/constr_CHOICE.h +++ b/e2ap/headers/constr_CHOICE.h @@ -40,23 +40,62 @@ typedef struct asn_CHOICE_specifics_s { * A set specialized functions dealing with the CHOICE type. */ asn_struct_free_f CHOICE_free; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f CHOICE_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f CHOICE_compare; + asn_constr_check_f CHOICE_constraint; + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f CHOICE_decode_ber; der_type_encoder_f CHOICE_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f CHOICE_decode_xer; xer_type_encoder_f CHOICE_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f CHOICE_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f CHOICE_decode_oer; oer_type_encoder_f CHOICE_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f CHOICE_decode_uper; per_type_encoder_f CHOICE_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f CHOICE_decode_aper; per_type_encoder_f CHOICE_encode_aper; -asn_outmost_tag_f CHOICE_outmost_tag; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) asn_random_fill_f CHOICE_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +asn_outmost_tag_f CHOICE_outmost_tag; + extern asn_TYPE_operation_t asn_OP_CHOICE; +unsigned _fetch_present_idx( + const void *struct_ptr, + unsigned off, + unsigned size); + +void _set_present_idx( + void *sptr, + unsigned offset, + unsigned size, + unsigned present); + /* * Return the 1-based choice variant presence index. * Returns 0 in case of error. diff --git a/e2ap/headers/constr_SEQUENCE.h b/e2ap/headers/constr_SEQUENCE.h index a22ed3a..5ecfd8f 100644 --- a/e2ap/headers/constr_SEQUENCE.h +++ b/e2ap/headers/constr_SEQUENCE.h @@ -45,20 +45,47 @@ typedef struct asn_SEQUENCE_specifics_s { * A set specialized functions dealing with the SEQUENCE type. */ asn_struct_free_f SEQUENCE_free; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f SEQUENCE_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f SEQUENCE_compare; + asn_constr_check_f SEQUENCE_constraint; + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f SEQUENCE_decode_ber; der_type_encoder_f SEQUENCE_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f SEQUENCE_decode_xer; xer_type_encoder_f SEQUENCE_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f SEQUENCE_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f SEQUENCE_decode_oer; oer_type_encoder_f SEQUENCE_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f SEQUENCE_decode_uper; per_type_encoder_f SEQUENCE_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f SEQUENCE_decode_aper; per_type_encoder_f SEQUENCE_encode_aper; -asn_random_fill_f SEQUENCE_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f SEQUENCE_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + extern asn_TYPE_operation_t asn_OP_SEQUENCE; #ifdef __cplusplus diff --git a/e2ap/headers/constr_SEQUENCE_OF.h b/e2ap/headers/constr_SEQUENCE_OF.h index 6857f0f..1768582 100644 --- a/e2ap/headers/constr_SEQUENCE_OF.h +++ b/e2ap/headers/constr_SEQUENCE_OF.h @@ -16,23 +16,49 @@ extern "C" { * A set specialized functions dealing with the SEQUENCE OF type. * Generally implemented using SET OF. */ +#define SEQUENCE_OF_free SET_OF_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define SEQUENCE_OF_print SET_OF_print +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f SEQUENCE_OF_compare; + +#define SEQUENCE_OF_constraint SET_OF_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define SEQUENCE_OF_decode_ber SET_OF_decode_ber der_type_encoder_f SEQUENCE_OF_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define SEQUENCE_OF_decode_xer SET_OF_decode_xer xer_type_encoder_f SEQUENCE_OF_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f SEQUENCE_OF_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) +#define SEQUENCE_OF_decode_oer SET_OF_decode_oer +#define SEQUENCE_OF_encode_oer SET_OF_encode_oer +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#define SEQUENCE_OF_decode_uper SET_OF_decode_uper per_type_encoder_f SEQUENCE_OF_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define SEQUENCE_OF_decode_aper SET_OF_decode_aper per_type_encoder_f SEQUENCE_OF_encode_aper; -extern asn_TYPE_operation_t asn_OP_SEQUENCE_OF; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ -#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 +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +#define SEQUENCE_OF_random_fill SET_OF_random_fill +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +extern asn_TYPE_operation_t asn_OP_SEQUENCE_OF; #ifdef __cplusplus } diff --git a/e2ap/headers/constr_SET_OF.h b/e2ap/headers/constr_SET_OF.h index 7681062..0e9dd39 100644 --- a/e2ap/headers/constr_SET_OF.h +++ b/e2ap/headers/constr_SET_OF.h @@ -6,6 +6,7 @@ #define CONSTR_SET_OF_H #include +#include #ifdef __cplusplus extern "C" { @@ -26,22 +27,74 @@ typedef struct asn_SET_OF_specifics_s { * A set specialized functions dealing with the SET OF type. */ asn_struct_free_f SET_OF_free; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f SET_OF_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f SET_OF_compare; + asn_constr_check_f SET_OF_constraint; + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f SET_OF_decode_ber; der_type_encoder_f SET_OF_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f SET_OF_decode_xer; xer_type_encoder_f SET_OF_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f SET_OF_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f SET_OF_decode_oer; oer_type_encoder_f SET_OF_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f SET_OF_decode_uper; per_type_encoder_f SET_OF_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f SET_OF_decode_aper; per_type_encoder_f SET_OF_encode_aper; -asn_random_fill_f SET_OF_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f SET_OF_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + extern asn_TYPE_operation_t asn_OP_SET_OF; +/* + * Internally visible buffer holding a single encoded element. + */ +struct _el_buffer { + uint8_t *buf; + size_t length; + size_t allocated_size; + unsigned bits_unused; +}; + +enum SET_OF__encode_method { + SOES_DER, /* Distinguished Encoding Rules */ + SOES_CUPER, /* Canonical Unaligned Packed Encoding Rules */ + SOES_CAPER /* Canonical Aligned Packed Encoding Rules */ +}; + +struct _el_buffer * SET_OF__encode_sorted( + const asn_TYPE_member_t *elm, + const asn_anonymous_set_ *list, + enum SET_OF__encode_method method); + +void SET_OF__encode_sorted_free( + struct _el_buffer *el_buf, + size_t count); + #ifdef __cplusplus } #endif diff --git a/e2ap/headers/constr_TYPE.h b/e2ap/headers/constr_TYPE.h index d80dea5..55c2574 100644 --- a/e2ap/headers/constr_TYPE.h +++ b/e2ap/headers/constr_TYPE.h @@ -34,23 +34,51 @@ typedef struct asn_struct_ctx_s { 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 +#if !defined(ASN_DISABLE_BER_SUPPORT) +#include /* Basic Encoding Rules decoder */ +#include /* Distinguished Encoding Rules encoder */ +#else +typedef void (ber_type_decoder_f)(void); +typedef void (der_type_encoder_f)(void); +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#include /* Decoder of XER (XML, text) */ +#include /* Encoder into XER (XML, text) */ +#else +typedef void (xer_type_decoder_f)(void); +typedef void (xer_type_encoder_f)(void); +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +#include /* Encoder into JER (JSON, text) */ +#else +typedef void (jer_type_encoder_f)(void); +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +#include /* Packet Encoding Rules decoder */ +#include /* Packet Encoding Rules encoder */ +#else +typedef void (per_type_decoder_f)(void); +typedef void (per_type_encoder_f)(void); +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + +#include /* Subtype constraints support */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +#include /* Random structures support */ +#else +typedef void (asn_random_fill_f)(void); +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) +#include /* Octet Encoding Rules encoder */ +#include /* Octet Encoding Rules encoder */ +#else 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 +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ /* * Free the structure according to its specification. @@ -149,6 +177,7 @@ typedef struct asn_TYPE_operation_s { 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 */ + jer_type_encoder_f *jer_encoder; /* Generic JER 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 */ @@ -163,8 +192,12 @@ typedef struct asn_TYPE_operation_s { * A constraints tuple specifying both the OER and PER constraints. */ typedef struct asn_encoding_constraints_s { +#if !defined(ASN_DISABLE_OER_SUPPORT) const struct asn_oer_constraints_s *oer_constraints; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) const struct asn_per_constraints_s *per_constraints; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_constr_check_f *general_constraints; } asn_encoding_constraints_t; @@ -239,8 +272,8 @@ typedef struct asn_TYPE_member_s { 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 */ + int toff_first; /* First occurrence of the el_tag, relative */ + int toff_last; /* Last occurrence of the el_tag, relative */ } asn_TYPE_tag2member_t; /* diff --git a/e2ap/headers/constraints.h b/e2ap/headers/constraints.h index 0bd86a9..0c093fa 100644 --- a/e2ap/headers/constraints.h +++ b/e2ap/headers/constraints.h @@ -6,6 +6,7 @@ #define ASN1_CONSTRAINTS_VALIDATOR_H #include /* Platform-dependent types */ +#include #ifdef __cplusplus extern "C" { diff --git a/e2ap/headers/jer_encoder.h b/e2ap/headers/jer_encoder.h new file mode 100644 index 0000000..672976d --- /dev/null +++ b/e2ap/headers/jer_encoder.h @@ -0,0 +1,86 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _JER_ENCODER_H_ +#define _JER_ENCODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* Flags used by the jer_encode() and (*jer_type_encoder_f), defined below + * + * This isn't actually used, it might be used in the future to support + * both normal JSON and prettified JSON output or removed. + * It came from XER + */ +enum jer_encoder_flags_e { + /* Mode of encoding */ + JER_F = 0x01, /* JER (pretty-printing) */ +}; + +/* + * The JER encoder of any type. May be invoked by the application. + * Produces JER output. + */ +asn_enc_rval_t jer_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 */ +); + +/* + * The variant of the above function which dumps the JER + * 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 jer_fprint(FILE *stream, const struct asn_TYPE_descriptor_s *td, + const void *struct_ptr); + +/* + * A helper function that uses JER encoding/decoding to verify that: + * - Both structures encode into the same JER. + * - Both resulting JER byte streams can be decoded back. + * - Both decoded structures encode into the same JER (round-trip). + * All of this verifies equivalence between structures and a round-trip. + * ARGUMENTS: + * (opt_debug_stream) - If specified, prints ongoing details. + */ +enum jer_equivalence_e { + JEQ_SUCCESS, /* The only completely positive return value */ + JEQ_FAILURE, /* General failure */ + JEQ_ENCODE1_FAILED, /* First structure JER encoding failed */ + JEQ_ENCODE2_FAILED, /* Second structure JER encoding failed */ + JEQ_DIFFERENT, /* Structures encoded into different JER */ + JEQ_DECODE_FAILED, /* Decode of the JER data failed */ + JEQ_ROUND_TRIP_FAILED /* Bad round-trip */ +}; +enum jer_equivalence_e jer_equivalent( + const struct asn_TYPE_descriptor_s *type_descriptor, const void *struct1, + const void *struct2, FILE *opt_debug_stream); + +/* + * Type of the generic JER encoder. + */ +typedef asn_enc_rval_t(jer_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 jer_encoder_flags_e jer_flags, + asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ +); + +#ifdef __cplusplus +} +#endif + +#endif /* _JER_ENCODER_H_ */ diff --git a/e2ap/headers/per_decoder.h b/e2ap/headers/per_decoder.h index eea474a..3cc0c6b 100644 --- a/e2ap/headers/per_decoder.h +++ b/e2ap/headers/per_decoder.h @@ -14,58 +14,6 @@ extern "C" { 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. */ diff --git a/e2ap/headers/per_encoder.h b/e2ap/headers/per_encoder.h index b615ef0..8bb0771 100644 --- a/e2ap/headers/per_encoder.h +++ b/e2ap/headers/per_encoder.h @@ -14,70 +14,6 @@ extern "C" { 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. */ @@ -86,6 +22,15 @@ typedef asn_enc_rval_t(per_type_encoder_f)( const asn_per_constraints_t *constraints, const void *struct_ptr, asn_per_outp_t *per_output); +int ignore_output(const void *data, size_t size, void *app_key); + +typedef struct enc_dyn_arg { + void *buffer; + size_t length; + size_t allocated; +} enc_dyn_arg; +int encode_dyn_cb(const void *buffer, size_t size, void *key); + #ifdef __cplusplus } #endif diff --git a/e2ap/headers/per_opentype.h b/e2ap/headers/per_opentype.h index 1493b2d..fc37855 100644 --- a/e2ap/headers/per_opentype.h +++ b/e2ap/headers/per_opentype.h @@ -5,37 +5,17 @@ #ifndef _PER_OPENTYPE_H_ #define _PER_OPENTYPE_H_ +#include + #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); +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); #ifdef __cplusplus } diff --git a/e2ap/headers/per_support.h b/e2ap/headers/per_support.h index 23079c9..b3056a2 100644 --- a/e2ap/headers/per_support.h +++ b/e2ap/headers/per_support.h @@ -24,8 +24,8 @@ typedef struct asn_per_constraint_s { } 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 */ + intmax_t lower_bound; /* "lb" value */ + intmax_t upper_bound; /* "ub" value */ } asn_per_constraint_t; typedef struct asn_per_constraints_s { asn_per_constraint_t value; @@ -41,85 +41,12 @@ typedef struct asn_bit_data_s asn_per_data_t; #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 diff --git a/e2ap/headers/uper_decoder.h b/e2ap/headers/uper_decoder.h new file mode 100644 index 0000000..ded8515 --- /dev/null +++ b/e2ap/headers/uper_decoder.h @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _UPER_DECODER_H_ +#define _UPER_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 */ +); + +#ifdef __cplusplus +} +#endif + +#endif /* _UPER_DECODER_H_ */ diff --git a/e2ap/headers/uper_encoder.h b/e2ap/headers/uper_encoder.h new file mode 100644 index 0000000..8f73980 --- /dev/null +++ b/e2ap/headers/uper_encoder.h @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2006-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _UPER_ENCODER_H_ +#define _UPER_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 */ +); + +/* + * 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) */ +); + +/* + * 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 */ +); + +#ifdef __cplusplus +} +#endif + +#endif /* _UPER_ENCODER_H_ */ diff --git a/e2ap/headers/uper_opentype.h b/e2ap/headers/uper_opentype.h new file mode 100644 index 0000000..3a24822 --- /dev/null +++ b/e2ap/headers/uper_opentype.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2007-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _UPER_OPENTYPE_H_ +#define _UPER_OPENTYPE_H_ + +#include + +#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); + +#ifdef __cplusplus +} +#endif + +#endif /* _UPER_OPENTYPE_H_ */ diff --git a/e2ap/headers/uper_support.h b/e2ap/headers/uper_support.h new file mode 100644 index 0000000..6c9d4ea --- /dev/null +++ b/e2ap/headers/uper_support.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _UPER_SUPPORT_H_ +#define _UPER_SUPPORT_H_ + +#include /* Platform-specific types */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * 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); + +/* + * Get the normally small length "n". + */ +ssize_t uper_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); + +/* X.691-2008/11, #11.5.6 */ +int uper_get_constrained_whole_number(asn_per_data_t *pd, uintmax_t *v, int nbits); + +/* + * 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, intmax_t lb, intmax_t ub, unsigned long *output); +int per_imax_range_rebase(intmax_t v, intmax_t lb, intmax_t ub, uintmax_t *output); +/* The inverse operation: restores the value by the offset and its bounds. */ +int per_long_range_unrebase(unsigned long inp, intmax_t lb, intmax_t ub, long *outp); +int per_imax_range_unrebase(uintmax_t inp, intmax_t lb, intmax_t ub, intmax_t *outp); + +/* X.691-2008/11, #11.5 */ +int uper_put_constrained_whole_number_u(asn_per_outp_t *po, uintmax_t 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); + +/* + * 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); + +/* + * Put the normally small non-negative whole number. + */ +int uper_put_nsnnwn(asn_per_outp_t *po, int n); + +#ifdef __cplusplus +} +#endif + +#endif /* _UPER_SUPPORT_H_ */ diff --git a/e2ap/headers/xer_encoder.h b/e2ap/headers/xer_encoder.h index 9d75922..6cfc505 100644 --- a/e2ap/headers/xer_encoder.h +++ b/e2ap/headers/xer_encoder.h @@ -54,7 +54,7 @@ int xer_fprint(FILE *stream, const struct asn_TYPE_descriptor_s *td, 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_ENCODE1_FAILED, /* First structure 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 */ diff --git a/e2ap/headers/xer_support.h b/e2ap/headers/xer_support.h index c3a36e7..2c3f369 100644 --- a/e2ap/headers/xer_support.h +++ b/e2ap/headers/xer_support.h @@ -40,8 +40,8 @@ typedef int (pxml_callback_f)(pxml_chunk_type_e _type, /* * 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. + * Invoke the specified callback each time the meaningful data is found. + * This function returns number of bytes consumed from the buffer. * It will always be lesser than or equal to the specified _size. * The next invocation of this function must account the difference. */ diff --git a/e2sm/lib/GNB-CU-CP-Name.c b/e2ap/lib/AMFName.c similarity index 61% rename from e2sm/lib/GNB-CU-CP-Name.c rename to e2ap/lib/AMFName.c index bfc4771..7750cc9 100644 --- a/e2sm/lib/GNB-CU-CP-Name.c +++ b/e2ap/lib/AMFName.c @@ -1,11 +1,11 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ -#include "GNB-CU-CP-Name.h" +#include "AMFName.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, /* */ @@ -40,7 +40,7 @@ static int check_permitted_alphabet_1(const void *sptr) { } int -GNB_CU_CP_Name_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, +AMFName_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; @@ -54,7 +54,7 @@ GNB_CU_CP_Name_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size >= 1 && size <= 150) + if((size >= 1UL && size <= 150UL) && !check_permitted_alphabet_1(st)) { /* Constraint check succeeded */ return 0; @@ -66,12 +66,12 @@ GNB_CU_CP_Name_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, } } -static int asn_PER_MAP_GNB_CU_CP_Name_1_v2c(unsigned int value) { +static int asn_PER_MAP_AMFName_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) { +static int asn_PER_MAP_AMFName_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]; @@ -80,29 +80,41 @@ static int asn_PER_MAP_GNB_CU_CP_Name_1_c2v(unsigned int 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 = { +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_AMFName_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 = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_AMFName_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 */ + asn_PER_MAP_AMFName_1_v2c, /* Value to PER code map */ + asn_PER_MAP_AMFName_1_c2v /* PER code to value map */ }; -static const ber_tlv_tag_t asn_DEF_GNB_CU_CP_Name_tags_1[] = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static const ber_tlv_tag_t asn_DEF_AMFName_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_TYPE_descriptor_t asn_DEF_AMFName = { + "AMFName", + "AMFName", &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 }, + asn_DEF_AMFName_tags_1, + sizeof(asn_DEF_AMFName_tags_1) + /sizeof(asn_DEF_AMFName_tags_1[0]), /* 1 */ + asn_DEF_AMFName_tags_1, /* Same as above */ + sizeof(asn_DEF_AMFName_tags_1) + /sizeof(asn_DEF_AMFName_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_AMFName_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_AMFName_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + AMFName_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2ap/lib/ANY.c b/e2ap/lib/ANY.c index 0b81557..bf988db 100644 --- a/e2ap/lib/ANY.c +++ b/e2ap/lib/ANY.c @@ -4,447 +4,77 @@ */ #include #include -#include asn_OCTET_STRING_specifics_t asn_SPC_ANY_specs = { - sizeof(ANY_t), - offsetof(ANY_t, _asn_ctx), - ASN_OSUBV_ANY + sizeof(ANY_t), + offsetof(ANY_t, _asn_ctx), + ASN_OSUBV_ANY }; asn_TYPE_operation_t asn_OP_ANY = { - OCTET_STRING_free, - OCTET_STRING_print, - OCTET_STRING_compare, - OCTET_STRING_decode_ber, - OCTET_STRING_encode_der, - OCTET_STRING_decode_xer_hex, - ANY_encode_xer, -#ifdef ASN_DISABLE_OER_SUPPORT - 0, - 0, + OCTET_STRING_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OCTET_STRING_print, #else - 0, - 0, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, 0, 0, 0, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, + OCTET_STRING_encode_der, #else - ANY_decode_uper, - ANY_encode_uper, - ANY_decode_aper, - ANY_encode_aper, -#endif /* ASN_DISABLE_PER_SUPPORT */ - 0, /* Random fill is not defined for ANY type */ - 0 /* Use generic outmost tag fetcher */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_hex, + ANY_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + ANY_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, + 0, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + ANY_decode_uper, + ANY_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + ANY_decode_aper, + ANY_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + 0, /* Random fill is not defined for ANY type */ + 0 /* Use generic outmost tag fetcher */ }; asn_TYPE_descriptor_t asn_DEF_ANY = { - "ANY", - "ANY", - &asn_OP_ANY, - 0, 0, 0, 0, - { 0, 0, asn_generic_no_constraint }, /* No constraints */ - 0, 0, /* No members */ - &asn_SPC_ANY_specs, + "ANY", + "ANY", + &asn_OP_ANY, + 0, 0, 0, 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_no_constraint + }, /* No constraints */ + 0, 0, /* No members */ + &asn_SPC_ANY_specs, }; - -#undef RETURN -#define RETURN(_code) \ - do { \ - asn_dec_rval_t tmprval; \ - tmprval.code = _code; \ - tmprval.consumed = consumed_myself; \ - return tmprval; \ - } while(0) - -asn_enc_rval_t -ANY_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) { - if(flags & XER_F_CANONICAL) { - /* - * Canonical XER-encoding of ANY type is not supported. - */ - ASN__ENCODE_FAILED; - } - - /* Dump as binary */ - return OCTET_STRING_encode_xer(td, sptr, ilevel, flags, cb, app_key); -} - -struct _callback_arg { - uint8_t *buffer; - size_t offset; - size_t size; -}; - -static int ANY__consume_bytes(const void *buffer, size_t size, void *key); - -int -ANY_fromType(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr) { - struct _callback_arg arg; - asn_enc_rval_t erval = {0,0,0}; - - if(!st || !td) { - errno = EINVAL; - return -1; - } - - if(!sptr) { - if(st->buf) FREEMEM(st->buf); - st->size = 0; - return 0; - } - - arg.offset = arg.size = 0; - arg.buffer = 0; - - erval = der_encode(td, sptr, ANY__consume_bytes, &arg); - if(erval.encoded == -1) { - if(arg.buffer) FREEMEM(arg.buffer); - return -1; - } - assert((size_t)erval.encoded == arg.offset); - - if(st->buf) FREEMEM(st->buf); - st->buf = arg.buffer; - st->size = arg.offset; - - return 0; -} - -int -ANY_fromType_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr) { - uint8_t *buffer = NULL; - ssize_t erval; - - if(!st || !td) { - errno = EINVAL; - return -1; - } - - if(!sptr) { - if(st->buf) FREEMEM(st->buf); - st->size = 0; - return 0; - } - - erval = aper_encode_to_new_buffer(td, td->encoding_constraints.per_constraints, sptr, (void**)&buffer); - - if(erval == -1) { - if(buffer) FREEMEM(buffer); - return -1; - } - assert((size_t)erval > 0); - - if(st->buf) FREEMEM(st->buf); - st->buf = buffer; - st->size = erval; - - return 0; -} - -ANY_t * -ANY_new_fromType(asn_TYPE_descriptor_t *td, void *sptr) { - ANY_t tmp; - ANY_t *st; - - if(!td || !sptr) { - errno = EINVAL; - return 0; - } - - memset(&tmp, 0, sizeof(tmp)); - - if(ANY_fromType(&tmp, td, sptr)) return 0; - - st = (ANY_t *)CALLOC(1, sizeof(ANY_t)); - if(st) { - *st = tmp; - return st; - } else { - FREEMEM(tmp.buf); - return 0; - } -} - -ANY_t * -ANY_new_fromType_aper(asn_TYPE_descriptor_t *td, void *sptr) { - ANY_t tmp; - ANY_t *st; - - if(!td || !sptr) { - errno = EINVAL; - return 0; - } - - memset(&tmp, 0, sizeof(tmp)); - - if(ANY_fromType_aper(&tmp, td, sptr)) return 0; - - st = (ANY_t *)CALLOC(1, sizeof(ANY_t)); - if(st) { - *st = tmp; - return st; - } else { - FREEMEM(tmp.buf); - return 0; - } -} - -int -ANY_to_type(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) { - asn_dec_rval_t rval; - void *newst = 0; - - if(!st || !td || !struct_ptr) { - errno = EINVAL; - return -1; - } - - if(st->buf == 0) { - /* Nothing to convert, make it empty. */ - *struct_ptr = (void *)0; - return 0; - } - - rval = ber_decode(0, td, (void **)&newst, st->buf, st->size); - if(rval.code == RC_OK) { - *struct_ptr = newst; - return 0; - } else { - /* Remove possibly partially decoded data. */ - ASN_STRUCT_FREE(*td, newst); - return -1; - } -} - -int -ANY_to_type_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) { - asn_dec_rval_t rval; - void *newst = 0; - - if(!st || !td || !struct_ptr) { - errno = EINVAL; - return -1; - } - - if(st->buf == 0) { - /* Nothing to convert, make it empty. */ - *struct_ptr = (void *)0; - return 0; - } - - rval = aper_decode(0, td, (void **)&newst, st->buf, st->size, 0, 0); - if(rval.code == RC_OK) { - *struct_ptr = newst; - return 0; - } else { - /* Remove possibly partially decoded data. */ - ASN_STRUCT_FREE(*td, newst); - return -1; - } -} - -static int ANY__consume_bytes(const void *buffer, size_t size, void *key) { - struct _callback_arg *arg = (struct _callback_arg *)key; - - if((arg->offset + size) >= arg->size) { - size_t nsize = (arg->size ? arg->size << 2 : 16) + size; - void *p = REALLOC(arg->buffer, nsize); - if(!p) return -1; - arg->buffer = (uint8_t *)p; - arg->size = nsize; - } - - memcpy(arg->buffer + arg->offset, buffer, size); - arg->offset += size; - assert(arg->offset < arg->size); - - return 0; -} - -#ifndef ASN_DISABLE_PER_SUPPORT - -asn_dec_rval_t -ANY_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_ANY_specs; - size_t consumed_myself = 0; - int repeat; - ANY_t *st = (ANY_t *)*sptr; - - (void)opt_codec_ctx; - (void)constraints; - - /* - * Allocate the structure. - */ - if(!st) { - st = (ANY_t *)(*sptr = CALLOC(1, specs->struct_size)); - if(!st) RETURN(RC_FAIL); - } - - ASN_DEBUG("UPER Decoding ANY type"); - - 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, -1, 0, &repeat); - if(raw_len < 0) RETURN(RC_WMORE); - if(raw_len == 0 && st->buf) break; - - ASN_DEBUG("Got PER length len %" ASN_PRI_SIZE ", %s (%s)", raw_len, - repeat ? "repeat" : "once", td->name); - len_bytes = raw_len; - len_bits = len_bytes * 8; - - 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); - consumed_myself += len_bits; - st->size += len_bytes; - } while(repeat); - st->buf[st->size] = 0; /* nul-terminate */ - - RETURN(RC_OK); -} - -asn_enc_rval_t -ANY_encode_uper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, const void *sptr, - asn_per_outp_t *po) { - const ANY_t *st = (const ANY_t *)sptr; - asn_enc_rval_t er = {0, 0, 0}; - const uint8_t *buf; - size_t size; - int ret; - - (void)constraints; - - if(!st || (!st->buf && st->size)) ASN__ENCODE_FAILED; - - buf = st->buf; - size = st->size; - do { - int need_eom = 0; - ssize_t may_save = uper_put_length(po, size, &need_eom); - if(may_save < 0) ASN__ENCODE_FAILED; - - ret = per_put_many_bits(po, buf, may_save * 8); - if(ret) ASN__ENCODE_FAILED; - - buf += may_save; - size -= may_save; - assert(!(may_save & 0x07) || !size); - if(need_eom && uper_put_length(po, 0, 0)) - ASN__ENCODE_FAILED; /* End of Message length */ - } while(size); - - ASN__ENCODED_OK(er); -} - -asn_dec_rval_t -ANY_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_ANY_specs; - size_t consumed_myself = 0; - int repeat; - ANY_t *st = (ANY_t *)*sptr; - - (void)opt_codec_ctx; - (void)constraints; - - /* - * Allocate the structure. - */ - if(!st) { - st = (ANY_t *)(*sptr = CALLOC(1, specs->struct_size)); - if(!st) RETURN(RC_FAIL); - } - - ASN_DEBUG("APER Decoding ANY type"); - - 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 = aper_get_length(pd, -1, 0, &repeat); - if(raw_len < 0) RETURN(RC_WMORE); - if(raw_len == 0 && st->buf) break; - - ASN_DEBUG("Got PER length len %" ASN_PRI_SIZE ", %s (%s)", raw_len, - repeat ? "repeat" : "once", td->name); - len_bytes = raw_len; - len_bits = len_bytes * 8; - - 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); - consumed_myself += len_bits; - st->size += len_bytes; - } while(repeat); - st->buf[st->size] = 0; /* nul-terminate */ - - RETURN(RC_OK); -} - -asn_enc_rval_t -ANY_encode_aper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, const void *sptr, - asn_per_outp_t *po) { - const ANY_t *st = (const ANY_t *)sptr; - asn_enc_rval_t er = {0, 0, 0}; - const uint8_t *buf; - size_t size; - int ret; - - (void)constraints; - - if(!st || (!st->buf && st->size)) ASN__ENCODE_FAILED; - - buf = st->buf; - size = st->size; - do { - int need_eom = 0; - ssize_t may_save = uper_put_length(po, size, &need_eom); - if(may_save < 0) ASN__ENCODE_FAILED; - - ret = per_put_many_bits(po, buf, may_save * 8); - if(ret) ASN__ENCODE_FAILED; - - buf += may_save; - size -= may_save; - assert(!(may_save & 0x07) || !size); - if(need_eom && uper_put_length(po, 0, 0)) - ASN__ENCODE_FAILED; /* End of Message length */ - } while(size); - - ASN__ENCODED_OK(er); -} -#endif /* ASN_DISABLE_PER_SUPPORT */ - diff --git a/e2ap/lib/ANY_aper.c b/e2ap/lib/ANY_aper.c new file mode 100644 index 0000000..91d7277 --- /dev/null +++ b/e2ap/lib/ANY_aper.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +#undef RETURN +#define RETURN(_code) \ + do { \ + asn_dec_rval_t tmprval; \ + tmprval.code = _code; \ + tmprval.consumed = consumed_myself; \ + return tmprval; \ + } while(0) + +int +ANY_fromType_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr) { + uint8_t *buffer = NULL; + ssize_t erval; + + if(!st || !td) { + errno = EINVAL; + return -1; + } + + if(!sptr) { + if(st->buf) FREEMEM(st->buf); + st->size = 0; + return 0; + } + + erval = aper_encode_to_new_buffer(td, td->encoding_constraints.per_constraints, sptr, (void**)&buffer); + + if(erval == -1) { + if(buffer) FREEMEM(buffer); + return -1; + } + assert((size_t)erval > 0); + + if(st->buf) FREEMEM(st->buf); + st->buf = buffer; + st->size = erval; + + return 0; +} + +ANY_t * +ANY_new_fromType_aper(asn_TYPE_descriptor_t *td, void *sptr) { + ANY_t tmp; + ANY_t *st; + + if(!td || !sptr) { + errno = EINVAL; + return 0; + } + + memset(&tmp, 0, sizeof(tmp)); + + if(ANY_fromType_aper(&tmp, td, sptr)) return 0; + + st = (ANY_t *)CALLOC(1, sizeof(ANY_t)); + if(st) { + *st = tmp; + return st; + } else { + FREEMEM(tmp.buf); + return 0; + } +} + +int +ANY_to_type_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) { + asn_dec_rval_t rval; + void *newst = 0; + + if(!st || !td || !struct_ptr) { + errno = EINVAL; + return -1; + } + + if(st->buf == 0) { + /* Nothing to convert, make it empty. */ + *struct_ptr = (void *)0; + return 0; + } + + rval = aper_decode(0, td, (void **)&newst, st->buf, st->size, 0, 0); + if(rval.code == RC_OK) { + *struct_ptr = newst; + return 0; + } else { + /* Remove possibly partially decoded data. */ + ASN_STRUCT_FREE(*td, newst); + return -1; + } +} + +asn_dec_rval_t +ANY_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_ANY_specs; + size_t consumed_myself = 0; + int repeat; + ANY_t *st = (ANY_t *)*sptr; + + (void)opt_codec_ctx; + (void)constraints; + + /* + * Allocate the structure. + */ + if(!st) { + st = (ANY_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) RETURN(RC_FAIL); + } + + ASN_DEBUG("APER Decoding ANY type"); + + 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 = aper_get_length(pd, -1, -1, 0, &repeat); + if(raw_len < 0) RETURN(RC_WMORE); + if(raw_len == 0 && st->buf) break; + + ASN_DEBUG("Got PER length len %" ASN_PRI_SIZE ", %s (%s)", raw_len, + repeat ? "repeat" : "once", td->name); + len_bytes = raw_len; + len_bits = len_bytes * 8; + + 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); + consumed_myself += len_bits; + st->size += len_bytes; + } while(repeat); + st->buf[st->size] = 0; /* nul-terminate */ + + RETURN(RC_OK); +} + +asn_enc_rval_t +ANY_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const ANY_t *st = (const ANY_t *)sptr; + asn_enc_rval_t er = {0, 0, 0}; + const uint8_t *buf; + size_t size; + int ret; + + (void)constraints; + + if(!st || (!st->buf && st->size)) ASN__ENCODE_FAILED; + + buf = st->buf; + size = st->size; + do { + int need_eom = 0; + ssize_t may_save = aper_put_length(po, -1, -1, size, &need_eom); + if(may_save < 0) ASN__ENCODE_FAILED; + + ret = per_put_many_bits(po, buf, may_save * 8); + if(ret) ASN__ENCODE_FAILED; + + buf += may_save; + size -= may_save; + assert(!(may_save & 0x07) || !size); + if(need_eom && aper_put_length(po, -1, -1, 0, NULL)) + ASN__ENCODE_FAILED; /* End of Message length */ + } while(size); + + ASN__ENCODED_OK(er); +} diff --git a/e2ap/lib/ANY_ber.c b/e2ap/lib/ANY_ber.c new file mode 100644 index 0000000..2ebe45b --- /dev/null +++ b/e2ap/lib/ANY_ber.c @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +struct _callback_arg { + uint8_t *buffer; + size_t offset; + size_t size; +}; + +static int ANY__consume_bytes(const void *buffer, size_t size, void *key) { + struct _callback_arg *arg = (struct _callback_arg *)key; + + if((arg->offset + size) >= arg->size) { + size_t nsize = (arg->size ? arg->size << 2 : 16) + size; + void *p = REALLOC(arg->buffer, nsize); + if(!p) return -1; + arg->buffer = (uint8_t *)p; + arg->size = nsize; + } + + memcpy(arg->buffer + arg->offset, buffer, size); + arg->offset += size; + assert(arg->offset < arg->size); + + return 0; +} + +int +ANY_fromType(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr) { + struct _callback_arg arg; + asn_enc_rval_t erval = {0,0,0}; + + if(!st || !td) { + errno = EINVAL; + return -1; + } + + if(!sptr) { + if(st->buf) FREEMEM(st->buf); + st->size = 0; + return 0; + } + + arg.offset = arg.size = 0; + arg.buffer = 0; + + erval = der_encode(td, sptr, ANY__consume_bytes, &arg); + if(erval.encoded == -1) { + if(arg.buffer) FREEMEM(arg.buffer); + return -1; + } + assert((size_t)erval.encoded == arg.offset); + + if(st->buf) FREEMEM(st->buf); + st->buf = arg.buffer; + st->size = arg.offset; + + return 0; +} + +ANY_t * +ANY_new_fromType(asn_TYPE_descriptor_t *td, void *sptr) { + ANY_t tmp; + ANY_t *st; + + if(!td || !sptr) { + errno = EINVAL; + return 0; + } + + memset(&tmp, 0, sizeof(tmp)); + + if(ANY_fromType(&tmp, td, sptr)) return 0; + + st = (ANY_t *)CALLOC(1, sizeof(ANY_t)); + if(st) { + *st = tmp; + return st; + } else { + FREEMEM(tmp.buf); + return 0; + } +} + +int +ANY_to_type(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) { + asn_dec_rval_t rval; + void *newst = 0; + + if(!st || !td || !struct_ptr) { + errno = EINVAL; + return -1; + } + + if(st->buf == 0) { + /* Nothing to convert, make it empty. */ + *struct_ptr = (void *)0; + return 0; + } + + rval = ber_decode(0, td, (void **)&newst, st->buf, st->size); + if(rval.code == RC_OK) { + *struct_ptr = newst; + return 0; + } else { + /* Remove possibly partially decoded data. */ + ASN_STRUCT_FREE(*td, newst); + return -1; + } +} diff --git a/e2ap/lib/ANY_jer.c b/e2ap/lib/ANY_jer.c new file mode 100644 index 0000000..a86db9c --- /dev/null +++ b/e2ap/lib/ANY_jer.c @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +ANY_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum jer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, + void *app_key) { + ASN__ENCODE_FAILED; + + /* Dump as binary */ + return OCTET_STRING_encode_jer(td, sptr, ilevel, flags, cb, app_key); +} diff --git a/e2ap/lib/ANY_uper.c b/e2ap/lib/ANY_uper.c new file mode 100644 index 0000000..65f1519 --- /dev/null +++ b/e2ap/lib/ANY_uper.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +#undef RETURN +#define RETURN(_code) \ + do { \ + asn_dec_rval_t tmprval; \ + tmprval.code = _code; \ + tmprval.consumed = consumed_myself; \ + return tmprval; \ + } while(0) + +asn_dec_rval_t +ANY_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_ANY_specs; + size_t consumed_myself = 0; + int repeat; + ANY_t *st = (ANY_t *)*sptr; + + (void)opt_codec_ctx; + (void)constraints; + + /* + * Allocate the structure. + */ + if(!st) { + st = (ANY_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) RETURN(RC_FAIL); + } + + ASN_DEBUG("UPER Decoding ANY type"); + + 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, -1, 0, &repeat); + if(raw_len < 0) RETURN(RC_WMORE); + if(raw_len == 0 && st->buf) break; + + ASN_DEBUG("Got PER length len %" ASN_PRI_SIZE ", %s (%s)", raw_len, + repeat ? "repeat" : "once", td->name); + len_bytes = raw_len; + len_bits = len_bytes * 8; + + 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); + consumed_myself += len_bits; + st->size += len_bytes; + } while(repeat); + st->buf[st->size] = 0; /* nul-terminate */ + + RETURN(RC_OK); +} + +asn_enc_rval_t +ANY_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const ANY_t *st = (const ANY_t *)sptr; + asn_enc_rval_t er = {0, 0, 0}; + const uint8_t *buf; + size_t size; + int ret; + + (void)constraints; + + if(!st || (!st->buf && st->size)) ASN__ENCODE_FAILED; + + buf = st->buf; + size = st->size; + do { + int need_eom = 0; + ssize_t may_save = uper_put_length(po, size, &need_eom); + if(may_save < 0) ASN__ENCODE_FAILED; + + ret = per_put_many_bits(po, buf, may_save * 8); + if(ret) ASN__ENCODE_FAILED; + + buf += may_save; + size -= may_save; + assert(!(may_save & 0x07) || !size); + if(need_eom && uper_put_length(po, 0, 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + } while(size); + + ASN__ENCODED_OK(er); +} diff --git a/e2ap/lib/ANY_xer.c b/e2ap/lib/ANY_xer.c new file mode 100644 index 0000000..112c213 --- /dev/null +++ b/e2ap/lib/ANY_xer.c @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +ANY_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) { + if(flags & XER_F_CANONICAL) { + /* + * Canonical XER-encoding of ANY type is not supported. + */ + ASN__ENCODE_FAILED; + } + + /* Dump as binary */ + return OCTET_STRING_encode_xer(td, sptr, ilevel, flags, cb, app_key); +} diff --git a/e2ap/lib/BIT_STRING.c b/e2ap/lib/BIT_STRING.c index e8d7354..b5ba940 100644 --- a/e2ap/lib/BIT_STRING.c +++ b/e2ap/lib/BIT_STRING.c @@ -4,61 +4,94 @@ */ #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_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 + 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, + OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + BIT_STRING_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + BIT_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_binary, + BIT_STRING_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + BIT_STRING_encode_jer, #else - BIT_STRING_decode_oer, - BIT_STRING_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + BIT_STRING_decode_oer, + BIT_STRING_encode_oer, #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + BIT_STRING_decode_uper, /* Unaligned PER decoder */ + BIT_STRING_encode_uper, /* Unaligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, /* Aligned PER decoder */ + OCTET_STRING_encode_aper, /* Aligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + BIT_STRING_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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", + "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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + BIT_STRING_constraint + }, + 0, 0, /* No members */ + &asn_SPC_BIT_STRING_specs }; /* @@ -87,136 +120,10 @@ BIT_STRING_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, 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 * +const BIT_STRING_t * BIT_STRING__compactify(const BIT_STRING_t *st, BIT_STRING_t *tmp) { const uint8_t *b; union { @@ -271,6 +178,7 @@ BIT_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const BIT_STRING_t *b = BIT_STRING__compactify(bptr, &compact_b); const asn_OCTET_STRING_specifics_t *specs = td->specifics; + (void)specs; assert(specs && specs->subvariant == ASN_OSUBV_BIT); if(a && b) { @@ -303,354 +211,3 @@ BIT_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, 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/e2ap/lib/BIT_STRING_jer.c b/e2ap/lib/BIT_STRING_jer.c new file mode 100644 index 0000000..f66238d --- /dev/null +++ b/e2ap/lib/BIT_STRING_jer.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +BIT_STRING_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = {0, 0, 0}; + const char * const h2c = "0123456789ABCDEF"; + char scratch[16 * 3 + 4]; + char *p = scratch; + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + 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 */ + + /* + * Hex dump + */ + *p++ = '"'; + for(int i = 0; buf < end; buf++, i++) { + if(!(i % 16) && (i || st->size > 16)) { + ASN__CALLBACK(scratch, p-scratch); + p = scratch; + } + *p++ = h2c[*buf >> 4]; + *p++ = h2c[*buf & 0x0F]; + } + + ASN__CALLBACK(scratch, p - scratch); + p = scratch; + + if(buf == end) { + int ubits = st->bits_unused; + uint8_t v = *buf & (0xff << ubits); + *p++ = h2c[v >> 4]; + *p++ = h2c[v & 0x0F]; + ASN__CALLBACK(scratch, p - scratch); + p = scratch; + } + *p++ = '"'; + ASN__CALLBACK(scratch, p - scratch); + ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} diff --git a/e2ap/lib/BIT_STRING_oer.c b/e2ap/lib/BIT_STRING_oer.c index aff5075..95c9558 100644 --- a/e2ap/lib/BIT_STRING_oer.c +++ b/e2ap/lib/BIT_STRING_oer.c @@ -3,11 +3,8 @@ * 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, @@ -169,6 +166,3 @@ BIT_STRING_encode_oer(const asn_TYPE_descriptor_t *td, return erval; } - - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2ap/lib/BIT_STRING_print.c b/e2ap/lib/BIT_STRING_print.c new file mode 100644 index 0000000..bab1ea5 --- /dev/null +++ b/e2ap/lib/BIT_STRING_print.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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; +} diff --git a/e2ap/lib/BIT_STRING_rfill.c b/e2ap/lib/BIT_STRING_rfill.c new file mode 100644 index 0000000..a6e6a95 --- /dev/null +++ b/e2ap/lib/BIT_STRING_rfill.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 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 { +#else + if(!constraints) constraints = &td->encoding_constraints; + { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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/e2ap/lib/BIT_STRING_uper.c b/e2ap/lib/BIT_STRING_uper.c new file mode 100644 index 0000000..d82349e --- /dev/null +++ b/e2ap/lib/BIT_STRING_uper.c @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +#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); +} diff --git a/e2ap/lib/BIT_STRING_xer.c b/e2ap/lib/BIT_STRING_xer.c new file mode 100644 index 0000000..67d5cb8 --- /dev/null +++ b/e2ap/lib/BIT_STRING_xer.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2ap/lib/Cause.c b/e2ap/lib/Cause.c index bdb51be..62dfb0f 100644 --- a/e2ap/lib/Cause.c +++ b/e2ap/lib/Cause.c @@ -1,27 +1,39 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "Cause.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_Cause_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_Cause_constr_1 CC_NOTUSED = { - { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 4 } /* (0..4,...) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 5 } /* (0..5,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_Cause_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Cause, choice.ricRequest), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_CauseRIC, + &asn_DEF_CauseRICrequest, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricRequest" }, @@ -30,34 +42,83 @@ asn_TYPE_member_t asn_MBR_Cause_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_CauseRICservice, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricService" }, - { ATF_NOFLAGS, 0, offsetof(struct Cause, choice.transport), + { ATF_NOFLAGS, 0, offsetof(struct Cause, choice.e2Node), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ + &asn_DEF_CauseE2node, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2Node" + }, + { ATF_NOFLAGS, 0, offsetof(struct Cause, choice.transport), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ &asn_DEF_CauseTransport, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "transport" }, { ATF_NOFLAGS, 0, offsetof(struct Cause, choice.protocol), - (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CauseProtocol, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocol" }, { ATF_NOFLAGS, 0, offsetof(struct Cause, choice.misc), - (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CauseMisc, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "misc" }, @@ -65,9 +126,10 @@ asn_TYPE_member_t asn_MBR_Cause_1[] = { static const asn_TYPE_tag2member_t asn_MAP_Cause_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_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* e2Node */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* misc */ }; asn_CHOICE_specifics_t asn_SPC_Cause_specs_1 = { sizeof(struct Cause), @@ -75,9 +137,9 @@ asn_CHOICE_specifics_t asn_SPC_Cause_specs_1 = { offsetof(struct Cause, present), sizeof(((struct Cause *)0)->present), asn_MAP_Cause_tag2el_1, - 5, /* Count of tags in the map */ + 6, /* Count of tags in the map */ 0, 0, - 5 /* Extensions start */ + 6 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Cause = { "Cause", @@ -87,9 +149,17 @@ asn_TYPE_descriptor_t asn_DEF_Cause = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { &asn_OER_type_Cause_constr_1, &asn_PER_type_Cause_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_Cause_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_Cause_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_Cause_1, - 5, /* Elements count */ + 6, /* Elements count */ &asn_SPC_Cause_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/CauseE2node.c b/e2ap/lib/CauseE2node.c new file mode 100644 index 0000000..0eaef40 --- /dev/null +++ b/e2ap/lib/CauseE2node.c @@ -0,0 +1,68 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "CauseE2node.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_CauseE2node_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_CauseE2node_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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static const asn_INTEGER_enum_map_t asn_MAP_CauseE2node_value2enum_1[] = { + { 0, 24, "e2node-component-unknown" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseE2node_enum2value_1[] = { + 0 /* e2node-component-unknown(0) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseE2node_specs_1 = { + asn_MAP_CauseE2node_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseE2node_enum2value_1, /* N => "tag"; sorted by N */ + 1, /* Number of elements in the maps */ + 2, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseE2node_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseE2node = { + "CauseE2node", + "CauseE2node", + &asn_OP_NativeEnumerated, + asn_DEF_CauseE2node_tags_1, + sizeof(asn_DEF_CauseE2node_tags_1) + /sizeof(asn_DEF_CauseE2node_tags_1[0]), /* 1 */ + asn_DEF_CauseE2node_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseE2node_tags_1) + /sizeof(asn_DEF_CauseE2node_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_CauseE2node_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_CauseE2node_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseE2node_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/CauseMisc.c b/e2ap/lib/CauseMisc.c index e09c0b1..6d68a98 100644 --- a/e2ap/lib/CauseMisc.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "CauseMisc.h" @@ -11,14 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_CauseMisc_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_CauseMisc_value2enum_1[] = { { 0, 27, "control-processing-overload" }, { 1, 16, "hardware-failure" }, @@ -55,7 +59,15 @@ asn_TYPE_descriptor_t asn_DEF_CauseMisc = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_CauseMisc_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_CauseMisc_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_CauseMisc_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/CauseProtocol.c b/e2ap/lib/CauseProtocol.c index 66bb383..ad81d56 100644 --- a/e2ap/lib/CauseProtocol.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "CauseProtocol.h" @@ -11,14 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_CauseProtocol_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_CauseProtocol_value2enum_1[] = { { 0, 21, "transfer-syntax-error" }, { 1, 28, "abstract-syntax-error-reject" }, @@ -61,7 +65,15 @@ asn_TYPE_descriptor_t asn_DEF_CauseProtocol = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_CauseProtocol_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_CauseProtocol_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_CauseProtocol_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/CauseRIC.c b/e2ap/lib/CauseRIC.c deleted file mode 100644 index 7d94696..0000000 --- a/e2ap/lib/CauseRIC.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2ap/lib/CauseRICrequest.c b/e2ap/lib/CauseRICrequest.c new file mode 100644 index 0000000..43ab462 --- /dev/null +++ b/e2ap/lib/CauseRICrequest.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "CauseRICrequest.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_CauseRICrequest_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_CauseRICrequest_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 4, 4, 0, 13 } /* (0..13,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static const asn_INTEGER_enum_map_t asn_MAP_CauseRICrequest_value2enum_1[] = { + { 0, 23, "ran-function-id-invalid" }, + { 1, 20, "action-not-supported" }, + { 2, 17, "excessive-actions" }, + { 3, 16, "duplicate-action" }, + { 4, 23, "duplicate-event-trigger" }, + { 5, 23, "function-resource-limit" }, + { 6, 18, "request-id-unknown" }, + { 7, 46, "inconsistent-action-subsequent-action-sequence" }, + { 8, 23, "control-message-invalid" }, + { 9, 27, "ric-call-process-id-invalid" }, + { 10, 21, "control-timer-expired" }, + { 11, 25, "control-failed-to-execute" }, + { 12, 16, "system-not-ready" }, + { 13, 11, "unspecified" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseRICrequest_enum2value_1[] = { + 1, /* action-not-supported(1) */ + 11, /* control-failed-to-execute(11) */ + 8, /* control-message-invalid(8) */ + 10, /* control-timer-expired(10) */ + 3, /* duplicate-action(3) */ + 4, /* duplicate-event-trigger(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) */ + 9, /* ric-call-process-id-invalid(9) */ + 12, /* system-not-ready(12) */ + 13 /* unspecified(13) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseRICrequest_specs_1 = { + asn_MAP_CauseRICrequest_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseRICrequest_enum2value_1, /* N => "tag"; sorted by N */ + 14, /* Number of elements in the maps */ + 15, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseRICrequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseRICrequest = { + "CauseRICrequest", + "CauseRICrequest", + &asn_OP_NativeEnumerated, + asn_DEF_CauseRICrequest_tags_1, + sizeof(asn_DEF_CauseRICrequest_tags_1) + /sizeof(asn_DEF_CauseRICrequest_tags_1[0]), /* 1 */ + asn_DEF_CauseRICrequest_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseRICrequest_tags_1) + /sizeof(asn_DEF_CauseRICrequest_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_CauseRICrequest_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_CauseRICrequest_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseRICrequest_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/CauseRICservice.c b/e2ap/lib/CauseRICservice.c index c2cbccb..e886229 100644 --- a/e2ap/lib/CauseRICservice.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "CauseRICservice.h" @@ -11,23 +11,27 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_CauseRICservice_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_CauseRICservice_value2enum_1[] = { - { 0, 21, "function-not-required" }, + { 0, 26, "ran-function-not-supported" }, { 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) */ + 0, /* ran-function-not-supported(0) */ 2 /* ric-resource-limit(2) */ /* This list is extensible */ }; @@ -53,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_CauseRICservice = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_CauseRICservice_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_CauseRICservice_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_CauseRICservice_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/CauseTransport.c b/e2ap/lib/CauseTransport.c index a0a5f38..1f2070a 100644 --- a/e2ap/lib/CauseTransport.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "CauseTransport.h" @@ -11,14 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_CauseTransport_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_CauseTransport_value2enum_1[] = { { 0, 11, "unspecified" }, { 1, 30, "transport-resource-unavailable" } @@ -51,7 +55,15 @@ asn_TYPE_descriptor_t asn_DEF_CauseTransport = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_CauseTransport_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_CauseTransport_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_CauseTransport_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/Criticality.c b/e2ap/lib/Criticality.c index 9bfe1ca..93b2c05 100644 --- a/e2ap/lib/Criticality.c +++ b/e2ap/lib/Criticality.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP-CommonDataTypes-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "commonDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "Criticality.h" @@ -11,14 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_Criticality_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_Criticality_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_Criticality_value2enum_1[] = { { 0, 6, "reject" }, { 1, 6, "ignore" }, @@ -51,7 +55,15 @@ asn_TYPE_descriptor_t asn_DEF_Criticality = { asn_DEF_Criticality_tags_1, /* Same as above */ sizeof(asn_DEF_Criticality_tags_1) /sizeof(asn_DEF_Criticality_tags_1[0]), /* 1 */ - { &asn_OER_type_Criticality_constr_1, &asn_PER_type_Criticality_constr_1, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_Criticality_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_Criticality_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_Criticality_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/CriticalityDiagnostics-IE-Item.c b/e2ap/lib/CriticalityDiagnostics-IE-Item.c index d950a0c..2fa613f 100644 --- a/e2ap/lib/CriticalityDiagnostics-IE-Item.c +++ b/e2ap/lib/CriticalityDiagnostics-IE-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "CriticalityDiagnostics-IE-Item.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_Criticality, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "iECriticality" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_ProtocolIE_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "iE-ID" }, @@ -31,7 +47,15 @@ asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_TypeOfError, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "typeOfError" }, @@ -62,7 +86,15 @@ asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_Item = { asn_DEF_CriticalityDiagnostics_IE_Item_tags_1, /* Same as above */ sizeof(asn_DEF_CriticalityDiagnostics_IE_Item_tags_1) /sizeof(asn_DEF_CriticalityDiagnostics_IE_Item_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_CriticalityDiagnostics_IE_Item_1, 3, /* Elements count */ &asn_SPC_CriticalityDiagnostics_IE_Item_specs_1 /* Additional specs */ diff --git a/e2ap/lib/CriticalityDiagnostics-IE-List.c b/e2ap/lib/CriticalityDiagnostics-IE-List.c index 29ae2dd..a190f77 100644 --- a/e2ap/lib/CriticalityDiagnostics-IE-List.c +++ b/e2ap/lib/CriticalityDiagnostics-IE-List.c @@ -1,28 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "CriticalityDiagnostics-IE-List.h" #include "CriticalityDiagnostics-IE-Item.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_CriticalityDiagnostics_IE_List_constr_1 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(1..256)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_CriticalityDiagnostics_IE_List_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_CriticalityDiagnostics_IE_Item, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -45,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_List = { asn_DEF_CriticalityDiagnostics_IE_List_tags_1, /* Same as above */ sizeof(asn_DEF_CriticalityDiagnostics_IE_List_tags_1) /sizeof(asn_DEF_CriticalityDiagnostics_IE_List_tags_1[0]), /* 1 */ - { &asn_OER_type_CriticalityDiagnostics_IE_List_constr_1, &asn_PER_type_CriticalityDiagnostics_IE_List_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_CriticalityDiagnostics_IE_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_CriticalityDiagnostics_IE_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_CriticalityDiagnostics_IE_List_1, 1, /* Single element */ &asn_SPC_CriticalityDiagnostics_IE_List_specs_1 /* Additional specs */ diff --git a/e2ap/lib/CriticalityDiagnostics.c b/e2ap/lib/CriticalityDiagnostics.c index c07926c..14b2b56 100644 --- a/e2ap/lib/CriticalityDiagnostics.c +++ b/e2ap/lib/CriticalityDiagnostics.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "CriticalityDiagnostics.h" @@ -15,7 +15,15 @@ asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_ProcedureCode, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "procedureCode" }, @@ -24,7 +32,15 @@ asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_TriggeringMessage, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "triggeringMessage" }, @@ -33,7 +49,15 @@ asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_Criticality, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "procedureCriticality" }, @@ -42,7 +66,15 @@ asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RICrequestID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricRequestorID" }, @@ -51,7 +83,15 @@ asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_CriticalityDiagnostics_IE_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "iEsCriticalityDiagnostics" }, @@ -86,7 +126,15 @@ asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics = { asn_DEF_CriticalityDiagnostics_tags_1, /* Same as above */ sizeof(asn_DEF_CriticalityDiagnostics_tags_1) /sizeof(asn_DEF_CriticalityDiagnostics_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_CriticalityDiagnostics_1, 5, /* Elements count */ &asn_SPC_CriticalityDiagnostics_specs_1 /* Additional specs */ diff --git a/e2ap/lib/E2AP-PDU.c b/e2ap/lib/E2AP-PDU.c index c8386c2..080442e 100644 --- a/e2ap/lib/E2AP-PDU.c +++ b/e2ap/lib/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-PDU-Descriptions-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "elementryProcedureDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2AP-PDU.h" @@ -10,21 +10,33 @@ #include "InitiatingMessage.h" #include "SuccessfulOutcome.h" #include "UnsuccessfulOutcome.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_E2AP_PDU_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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_InitiatingMessage, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "initiatingMessage" }, @@ -33,7 +45,15 @@ static asn_TYPE_member_t asn_MBR_E2AP_PDU_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_SuccessfulOutcome, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "successfulOutcome" }, @@ -42,7 +62,15 @@ static asn_TYPE_member_t asn_MBR_E2AP_PDU_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_UnsuccessfulOutcome, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "unsuccessfulOutcome" }, @@ -70,7 +98,15 @@ asn_TYPE_descriptor_t asn_DEF_E2AP_PDU = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2AP_PDU_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2AP_PDU_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_E2AP_PDU_1, 3, /* Elements count */ &asn_SPC_E2AP_PDU_specs_1 /* Additional specs */ diff --git a/e2ap/lib/E2connectionSetupFailed-Item.c b/e2ap/lib/E2connectionSetupFailed-Item.c new file mode 100644 index 0000000..501bec2 --- /dev/null +++ b/e2ap/lib/E2connectionSetupFailed-Item.c @@ -0,0 +1,84 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2connectionSetupFailed-Item.h" + +asn_TYPE_member_t asn_MBR_E2connectionSetupFailed_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionSetupFailed_Item, tnlInformation), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_TNLinformation, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "tnlInformation" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2connectionSetupFailed_Item, cause), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_Cause, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "cause" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionSetupFailed_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2connectionSetupFailed_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* tnlInformation */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* cause */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2connectionSetupFailed_Item_specs_1 = { + sizeof(struct E2connectionSetupFailed_Item), + offsetof(struct E2connectionSetupFailed_Item, _asn_ctx), + asn_MAP_E2connectionSetupFailed_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_E2connectionSetupFailed_Item = { + "E2connectionSetupFailed-Item", + "E2connectionSetupFailed-Item", + &asn_OP_SEQUENCE, + asn_DEF_E2connectionSetupFailed_Item_tags_1, + sizeof(asn_DEF_E2connectionSetupFailed_Item_tags_1) + /sizeof(asn_DEF_E2connectionSetupFailed_Item_tags_1[0]), /* 1 */ + asn_DEF_E2connectionSetupFailed_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_E2connectionSetupFailed_Item_tags_1) + /sizeof(asn_DEF_E2connectionSetupFailed_Item_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionSetupFailed_Item_1, + 2, /* Elements count */ + &asn_SPC_E2connectionSetupFailed_Item_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2connectionSetupFailed-List.c b/e2ap/lib/E2connectionSetupFailed-List.c new file mode 100644 index 0000000..0b581bc --- /dev/null +++ b/e2ap/lib/E2connectionSetupFailed-List.c @@ -0,0 +1,73 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2connectionSetupFailed-List.h" + +#include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2connectionSetupFailed_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..32)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2connectionSetupFailed_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_E2connectionSetupFailed_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainer_88P6, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionSetupFailed_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_E2connectionSetupFailed_List_specs_1 = { + sizeof(struct E2connectionSetupFailed_List), + offsetof(struct E2connectionSetupFailed_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_E2connectionSetupFailed_List = { + "E2connectionSetupFailed-List", + "E2connectionSetupFailed-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_E2connectionSetupFailed_List_tags_1, + sizeof(asn_DEF_E2connectionSetupFailed_List_tags_1) + /sizeof(asn_DEF_E2connectionSetupFailed_List_tags_1[0]), /* 1 */ + asn_DEF_E2connectionSetupFailed_List_tags_1, /* Same as above */ + sizeof(asn_DEF_E2connectionSetupFailed_List_tags_1) + /sizeof(asn_DEF_E2connectionSetupFailed_List_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2connectionSetupFailed_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2connectionSetupFailed_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_E2connectionSetupFailed_List_1, + 1, /* Single element */ + &asn_SPC_E2connectionSetupFailed_List_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2connectionUpdate-Item.c b/e2ap/lib/E2connectionUpdate-Item.c new file mode 100644 index 0000000..f7f22a6 --- /dev/null +++ b/e2ap/lib/E2connectionUpdate-Item.c @@ -0,0 +1,84 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2connectionUpdate-Item.h" + +asn_TYPE_member_t asn_MBR_E2connectionUpdate_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_Item, tnlInformation), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_TNLinformation, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "tnlInformation" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_Item, tnlUsage), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_TNLusage, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "tnlUsage" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionUpdate_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2connectionUpdate_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* tnlInformation */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* tnlUsage */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdate_Item_specs_1 = { + sizeof(struct E2connectionUpdate_Item), + offsetof(struct E2connectionUpdate_Item, _asn_ctx), + asn_MAP_E2connectionUpdate_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_E2connectionUpdate_Item = { + "E2connectionUpdate-Item", + "E2connectionUpdate-Item", + &asn_OP_SEQUENCE, + asn_DEF_E2connectionUpdate_Item_tags_1, + sizeof(asn_DEF_E2connectionUpdate_Item_tags_1) + /sizeof(asn_DEF_E2connectionUpdate_Item_tags_1[0]), /* 1 */ + asn_DEF_E2connectionUpdate_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdate_Item_tags_1) + /sizeof(asn_DEF_E2connectionUpdate_Item_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdate_Item_1, + 2, /* Elements count */ + &asn_SPC_E2connectionUpdate_Item_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2connectionUpdate-List.c b/e2ap/lib/E2connectionUpdate-List.c new file mode 100644 index 0000000..37b0c7f --- /dev/null +++ b/e2ap/lib/E2connectionUpdate-List.c @@ -0,0 +1,73 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2connectionUpdate-List.h" + +#include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2connectionUpdate_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..32)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2connectionUpdate_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_E2connectionUpdate_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainer_88P4, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionUpdate_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_E2connectionUpdate_List_specs_1 = { + sizeof(struct E2connectionUpdate_List), + offsetof(struct E2connectionUpdate_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_E2connectionUpdate_List = { + "E2connectionUpdate-List", + "E2connectionUpdate-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_E2connectionUpdate_List_tags_1, + sizeof(asn_DEF_E2connectionUpdate_List_tags_1) + /sizeof(asn_DEF_E2connectionUpdate_List_tags_1[0]), /* 1 */ + asn_DEF_E2connectionUpdate_List_tags_1, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdate_List_tags_1) + /sizeof(asn_DEF_E2connectionUpdate_List_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2connectionUpdate_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2connectionUpdate_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_E2connectionUpdate_List_1, + 1, /* Single element */ + &asn_SPC_E2connectionUpdate_List_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2connectionUpdate.c b/e2ap/lib/E2connectionUpdate.c new file mode 100644 index 0000000..0a1b6fd --- /dev/null +++ b/e2ap/lib/E2connectionUpdate.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2connectionUpdate.h" + +asn_TYPE_member_t asn_MBR_E2connectionUpdate_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_Container_85P15, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionUpdate_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2connectionUpdate_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdate_specs_1 = { + sizeof(struct E2connectionUpdate), + offsetof(struct E2connectionUpdate, _asn_ctx), + asn_MAP_E2connectionUpdate_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_E2connectionUpdate = { + "E2connectionUpdate", + "E2connectionUpdate", + &asn_OP_SEQUENCE, + asn_DEF_E2connectionUpdate_tags_1, + sizeof(asn_DEF_E2connectionUpdate_tags_1) + /sizeof(asn_DEF_E2connectionUpdate_tags_1[0]), /* 1 */ + asn_DEF_E2connectionUpdate_tags_1, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdate_tags_1) + /sizeof(asn_DEF_E2connectionUpdate_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdate_1, + 1, /* Elements count */ + &asn_SPC_E2connectionUpdate_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2connectionUpdateAcknowledge.c b/e2ap/lib/E2connectionUpdateAcknowledge.c new file mode 100644 index 0000000..0f90700 --- /dev/null +++ b/e2ap/lib/E2connectionUpdateAcknowledge.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2connectionUpdateAcknowledge.h" + +asn_TYPE_member_t asn_MBR_E2connectionUpdateAcknowledge_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateAcknowledge, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_Container_85P16, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionUpdateAcknowledge_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2connectionUpdateAcknowledge_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateAcknowledge_specs_1 = { + sizeof(struct E2connectionUpdateAcknowledge), + offsetof(struct E2connectionUpdateAcknowledge, _asn_ctx), + asn_MAP_E2connectionUpdateAcknowledge_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_E2connectionUpdateAcknowledge = { + "E2connectionUpdateAcknowledge", + "E2connectionUpdateAcknowledge", + &asn_OP_SEQUENCE, + asn_DEF_E2connectionUpdateAcknowledge_tags_1, + sizeof(asn_DEF_E2connectionUpdateAcknowledge_tags_1) + /sizeof(asn_DEF_E2connectionUpdateAcknowledge_tags_1[0]), /* 1 */ + asn_DEF_E2connectionUpdateAcknowledge_tags_1, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdateAcknowledge_tags_1) + /sizeof(asn_DEF_E2connectionUpdateAcknowledge_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdateAcknowledge_1, + 1, /* Elements count */ + &asn_SPC_E2connectionUpdateAcknowledge_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2connectionUpdateFailure.c b/e2ap/lib/E2connectionUpdateFailure.c new file mode 100644 index 0000000..22665e0 --- /dev/null +++ b/e2ap/lib/E2connectionUpdateFailure.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2connectionUpdateFailure.h" + +asn_TYPE_member_t asn_MBR_E2connectionUpdateFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_Container_85P17, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionUpdateFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2connectionUpdateFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateFailure_specs_1 = { + sizeof(struct E2connectionUpdateFailure), + offsetof(struct E2connectionUpdateFailure, _asn_ctx), + asn_MAP_E2connectionUpdateFailure_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_E2connectionUpdateFailure = { + "E2connectionUpdateFailure", + "E2connectionUpdateFailure", + &asn_OP_SEQUENCE, + asn_DEF_E2connectionUpdateFailure_tags_1, + sizeof(asn_DEF_E2connectionUpdateFailure_tags_1) + /sizeof(asn_DEF_E2connectionUpdateFailure_tags_1[0]), /* 1 */ + asn_DEF_E2connectionUpdateFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdateFailure_tags_1) + /sizeof(asn_DEF_E2connectionUpdateFailure_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdateFailure_1, + 1, /* Elements count */ + &asn_SPC_E2connectionUpdateFailure_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2connectionUpdateRemove-Item.c b/e2ap/lib/E2connectionUpdateRemove-Item.c new file mode 100644 index 0000000..584bdcc --- /dev/null +++ b/e2ap/lib/E2connectionUpdateRemove-Item.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2connectionUpdateRemove-Item.h" + +asn_TYPE_member_t asn_MBR_E2connectionUpdateRemove_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateRemove_Item, tnlInformation), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_TNLinformation, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "tnlInformation" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionUpdateRemove_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2connectionUpdateRemove_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* tnlInformation */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateRemove_Item_specs_1 = { + sizeof(struct E2connectionUpdateRemove_Item), + offsetof(struct E2connectionUpdateRemove_Item, _asn_ctx), + asn_MAP_E2connectionUpdateRemove_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_E2connectionUpdateRemove_Item = { + "E2connectionUpdateRemove-Item", + "E2connectionUpdateRemove-Item", + &asn_OP_SEQUENCE, + asn_DEF_E2connectionUpdateRemove_Item_tags_1, + sizeof(asn_DEF_E2connectionUpdateRemove_Item_tags_1) + /sizeof(asn_DEF_E2connectionUpdateRemove_Item_tags_1[0]), /* 1 */ + asn_DEF_E2connectionUpdateRemove_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdateRemove_Item_tags_1) + /sizeof(asn_DEF_E2connectionUpdateRemove_Item_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdateRemove_Item_1, + 1, /* Elements count */ + &asn_SPC_E2connectionUpdateRemove_Item_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2connectionUpdateRemove-List.c b/e2ap/lib/E2connectionUpdateRemove-List.c new file mode 100644 index 0000000..dcea9a8 --- /dev/null +++ b/e2ap/lib/E2connectionUpdateRemove-List.c @@ -0,0 +1,73 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2connectionUpdateRemove-List.h" + +#include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2connectionUpdateRemove_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..32)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2connectionUpdateRemove_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_E2connectionUpdateRemove_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainer_88P5, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionUpdateRemove_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_E2connectionUpdateRemove_List_specs_1 = { + sizeof(struct E2connectionUpdateRemove_List), + offsetof(struct E2connectionUpdateRemove_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_E2connectionUpdateRemove_List = { + "E2connectionUpdateRemove-List", + "E2connectionUpdateRemove-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_E2connectionUpdateRemove_List_tags_1, + sizeof(asn_DEF_E2connectionUpdateRemove_List_tags_1) + /sizeof(asn_DEF_E2connectionUpdateRemove_List_tags_1[0]), /* 1 */ + asn_DEF_E2connectionUpdateRemove_List_tags_1, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdateRemove_List_tags_1) + /sizeof(asn_DEF_E2connectionUpdateRemove_List_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2connectionUpdateRemove_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2connectionUpdateRemove_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_E2connectionUpdateRemove_List_1, + 1, /* Single element */ + &asn_SPC_E2connectionUpdateRemove_List_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigAddition-Item.c b/e2ap/lib/E2nodeComponentConfigAddition-Item.c new file mode 100644 index 0000000..15fe45c --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigAddition-Item.c @@ -0,0 +1,102 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigAddition-Item.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAddition_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAddition_Item, e2nodeComponentInterfaceType), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceType, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceType" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAddition_Item, e2nodeComponentID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_E2nodeComponentID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAddition_Item, e2nodeComponentConfiguration), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentConfiguration, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentConfiguration" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigAddition_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigAddition_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* e2nodeComponentInterfaceType */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* e2nodeComponentID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* e2nodeComponentConfiguration */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigAddition_Item_specs_1 = { + sizeof(struct E2nodeComponentConfigAddition_Item), + offsetof(struct E2nodeComponentConfigAddition_Item, _asn_ctx), + asn_MAP_E2nodeComponentConfigAddition_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_E2nodeComponentConfigAddition_Item = { + "E2nodeComponentConfigAddition-Item", + "E2nodeComponentConfigAddition-Item", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigAddition_Item_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigAddition_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigAddition_Item_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigAddition_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigAddition_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigAddition_Item_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigAddition_Item_1, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigAddition_Item_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigAddition-List.c b/e2ap/lib/E2nodeComponentConfigAddition-List.c new file mode 100644 index 0000000..bfd1ff9 --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigAddition-List.c @@ -0,0 +1,73 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigAddition-List.h" + +#include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2nodeComponentConfigAddition_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..1024)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2nodeComponentConfigAddition_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 10, 10, 1, 1024 } /* (SIZE(1..1024)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAddition_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainer_88P7, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigAddition_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigAddition_List_specs_1 = { + sizeof(struct E2nodeComponentConfigAddition_List), + offsetof(struct E2nodeComponentConfigAddition_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigAddition_List = { + "E2nodeComponentConfigAddition-List", + "E2nodeComponentConfigAddition-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_E2nodeComponentConfigAddition_List_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigAddition_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigAddition_List_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigAddition_List_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigAddition_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigAddition_List_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2nodeComponentConfigAddition_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2nodeComponentConfigAddition_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_E2nodeComponentConfigAddition_List_1, + 1, /* Single element */ + &asn_SPC_E2nodeComponentConfigAddition_List_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigAdditionAck-Item.c b/e2ap/lib/E2nodeComponentConfigAdditionAck-Item.c new file mode 100644 index 0000000..f017c34 --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigAdditionAck-Item.c @@ -0,0 +1,102 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigAdditionAck-Item.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAdditionAck_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAdditionAck_Item, e2nodeComponentInterfaceType), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceType, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceType" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAdditionAck_Item, e2nodeComponentID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_E2nodeComponentID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAdditionAck_Item, e2nodeComponentConfigurationAck), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentConfigurationAck, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentConfigurationAck" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigAdditionAck_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigAdditionAck_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* e2nodeComponentInterfaceType */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* e2nodeComponentID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* e2nodeComponentConfigurationAck */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigAdditionAck_Item_specs_1 = { + sizeof(struct E2nodeComponentConfigAdditionAck_Item), + offsetof(struct E2nodeComponentConfigAdditionAck_Item, _asn_ctx), + asn_MAP_E2nodeComponentConfigAdditionAck_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_E2nodeComponentConfigAdditionAck_Item = { + "E2nodeComponentConfigAdditionAck-Item", + "E2nodeComponentConfigAdditionAck-Item", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigAdditionAck_Item_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_Item_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigAdditionAck_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_Item_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigAdditionAck_Item_1, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigAdditionAck_Item_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigAdditionAck-List.c b/e2ap/lib/E2nodeComponentConfigAdditionAck-List.c new file mode 100644 index 0000000..093858a --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigAdditionAck-List.c @@ -0,0 +1,73 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigAdditionAck-List.h" + +#include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2nodeComponentConfigAdditionAck_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..1024)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2nodeComponentConfigAdditionAck_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 10, 10, 1, 1024 } /* (SIZE(1..1024)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAdditionAck_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainer_88P11, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigAdditionAck_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigAdditionAck_List_specs_1 = { + sizeof(struct E2nodeComponentConfigAdditionAck_List), + offsetof(struct E2nodeComponentConfigAdditionAck_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigAdditionAck_List = { + "E2nodeComponentConfigAdditionAck-List", + "E2nodeComponentConfigAdditionAck-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_E2nodeComponentConfigAdditionAck_List_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_List_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigAdditionAck_List_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_List_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2nodeComponentConfigAdditionAck_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2nodeComponentConfigAdditionAck_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_E2nodeComponentConfigAdditionAck_List_1, + 1, /* Single element */ + &asn_SPC_E2nodeComponentConfigAdditionAck_List_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigRemoval-Item.c b/e2ap/lib/E2nodeComponentConfigRemoval-Item.c new file mode 100644 index 0000000..05d6cb2 --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigRemoval-Item.c @@ -0,0 +1,84 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigRemoval-Item.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemoval_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemoval_Item, e2nodeComponentInterfaceType), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceType, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceType" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemoval_Item, e2nodeComponentID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_E2nodeComponentID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentID" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigRemoval_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigRemoval_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* e2nodeComponentInterfaceType */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* e2nodeComponentID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigRemoval_Item_specs_1 = { + sizeof(struct E2nodeComponentConfigRemoval_Item), + offsetof(struct E2nodeComponentConfigRemoval_Item, _asn_ctx), + asn_MAP_E2nodeComponentConfigRemoval_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_E2nodeComponentConfigRemoval_Item = { + "E2nodeComponentConfigRemoval-Item", + "E2nodeComponentConfigRemoval-Item", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigRemoval_Item_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigRemoval_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigRemoval_Item_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigRemoval_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigRemoval_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigRemoval_Item_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigRemoval_Item_1, + 2, /* Elements count */ + &asn_SPC_E2nodeComponentConfigRemoval_Item_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigRemoval-List.c b/e2ap/lib/E2nodeComponentConfigRemoval-List.c new file mode 100644 index 0000000..caed682 --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigRemoval-List.c @@ -0,0 +1,73 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigRemoval-List.h" + +#include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2nodeComponentConfigRemoval_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..1024)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2nodeComponentConfigRemoval_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 10, 10, 1, 1024 } /* (SIZE(1..1024)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemoval_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainer_88P9, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigRemoval_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigRemoval_List_specs_1 = { + sizeof(struct E2nodeComponentConfigRemoval_List), + offsetof(struct E2nodeComponentConfigRemoval_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigRemoval_List = { + "E2nodeComponentConfigRemoval-List", + "E2nodeComponentConfigRemoval-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_E2nodeComponentConfigRemoval_List_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigRemoval_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigRemoval_List_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigRemoval_List_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigRemoval_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigRemoval_List_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2nodeComponentConfigRemoval_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2nodeComponentConfigRemoval_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_E2nodeComponentConfigRemoval_List_1, + 1, /* Single element */ + &asn_SPC_E2nodeComponentConfigRemoval_List_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigRemovalAck-Item.c b/e2ap/lib/E2nodeComponentConfigRemovalAck-Item.c new file mode 100644 index 0000000..4e6b572 --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigRemovalAck-Item.c @@ -0,0 +1,102 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigRemovalAck-Item.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemovalAck_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemovalAck_Item, e2nodeComponentInterfaceType), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceType, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceType" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemovalAck_Item, e2nodeComponentID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_E2nodeComponentID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemovalAck_Item, e2nodeComponentConfigurationAck), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentConfigurationAck, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentConfigurationAck" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigRemovalAck_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigRemovalAck_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* e2nodeComponentInterfaceType */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* e2nodeComponentID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* e2nodeComponentConfigurationAck */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigRemovalAck_Item_specs_1 = { + sizeof(struct E2nodeComponentConfigRemovalAck_Item), + offsetof(struct E2nodeComponentConfigRemovalAck_Item, _asn_ctx), + asn_MAP_E2nodeComponentConfigRemovalAck_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_E2nodeComponentConfigRemovalAck_Item = { + "E2nodeComponentConfigRemovalAck-Item", + "E2nodeComponentConfigRemovalAck-Item", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigRemovalAck_Item_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_Item_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigRemovalAck_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_Item_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigRemovalAck_Item_1, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigRemovalAck_Item_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigRemovalAck-List.c b/e2ap/lib/E2nodeComponentConfigRemovalAck-List.c new file mode 100644 index 0000000..e8da110 --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigRemovalAck-List.c @@ -0,0 +1,73 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigRemovalAck-List.h" + +#include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2nodeComponentConfigRemovalAck_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..1024)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2nodeComponentConfigRemovalAck_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 10, 10, 1, 1024 } /* (SIZE(1..1024)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemovalAck_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainer_88P13, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigRemovalAck_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigRemovalAck_List_specs_1 = { + sizeof(struct E2nodeComponentConfigRemovalAck_List), + offsetof(struct E2nodeComponentConfigRemovalAck_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigRemovalAck_List = { + "E2nodeComponentConfigRemovalAck-List", + "E2nodeComponentConfigRemovalAck-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_E2nodeComponentConfigRemovalAck_List_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_List_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigRemovalAck_List_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_List_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2nodeComponentConfigRemovalAck_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2nodeComponentConfigRemovalAck_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_E2nodeComponentConfigRemovalAck_List_1, + 1, /* Single element */ + &asn_SPC_E2nodeComponentConfigRemovalAck_List_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigUpdate-Item.c b/e2ap/lib/E2nodeComponentConfigUpdate-Item.c new file mode 100644 index 0000000..1f9325c --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigUpdate-Item.c @@ -0,0 +1,102 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigUpdate-Item.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdate_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdate_Item, e2nodeComponentInterfaceType), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceType, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceType" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdate_Item, e2nodeComponentID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_E2nodeComponentID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdate_Item, e2nodeComponentConfiguration), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentConfiguration, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentConfiguration" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigUpdate_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigUpdate_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* e2nodeComponentInterfaceType */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* e2nodeComponentID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* e2nodeComponentConfiguration */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigUpdate_Item_specs_1 = { + sizeof(struct E2nodeComponentConfigUpdate_Item), + offsetof(struct E2nodeComponentConfigUpdate_Item, _asn_ctx), + asn_MAP_E2nodeComponentConfigUpdate_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_E2nodeComponentConfigUpdate_Item = { + "E2nodeComponentConfigUpdate-Item", + "E2nodeComponentConfigUpdate-Item", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigUpdate_Item_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigUpdate_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigUpdate_Item_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigUpdate_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigUpdate_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigUpdate_Item_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigUpdate_Item_1, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigUpdate_Item_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigUpdate-List.c b/e2ap/lib/E2nodeComponentConfigUpdate-List.c new file mode 100644 index 0000000..56ecc09 --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigUpdate-List.c @@ -0,0 +1,73 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigUpdate-List.h" + +#include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2nodeComponentConfigUpdate_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..1024)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2nodeComponentConfigUpdate_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 10, 10, 1, 1024 } /* (SIZE(1..1024)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdate_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainer_88P8, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigUpdate_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigUpdate_List_specs_1 = { + sizeof(struct E2nodeComponentConfigUpdate_List), + offsetof(struct E2nodeComponentConfigUpdate_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigUpdate_List = { + "E2nodeComponentConfigUpdate-List", + "E2nodeComponentConfigUpdate-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_E2nodeComponentConfigUpdate_List_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigUpdate_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigUpdate_List_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigUpdate_List_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigUpdate_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigUpdate_List_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2nodeComponentConfigUpdate_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2nodeComponentConfigUpdate_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_E2nodeComponentConfigUpdate_List_1, + 1, /* Single element */ + &asn_SPC_E2nodeComponentConfigUpdate_List_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigUpdateAck-Item.c b/e2ap/lib/E2nodeComponentConfigUpdateAck-Item.c new file mode 100644 index 0000000..a95bbea --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigUpdateAck-Item.c @@ -0,0 +1,102 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigUpdateAck-Item.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdateAck_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdateAck_Item, e2nodeComponentInterfaceType), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceType, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceType" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdateAck_Item, e2nodeComponentID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_E2nodeComponentID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdateAck_Item, e2nodeComponentConfigurationAck), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentConfigurationAck, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentConfigurationAck" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigUpdateAck_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigUpdateAck_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* e2nodeComponentInterfaceType */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* e2nodeComponentID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* e2nodeComponentConfigurationAck */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigUpdateAck_Item_specs_1 = { + sizeof(struct E2nodeComponentConfigUpdateAck_Item), + offsetof(struct E2nodeComponentConfigUpdateAck_Item, _asn_ctx), + asn_MAP_E2nodeComponentConfigUpdateAck_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_E2nodeComponentConfigUpdateAck_Item = { + "E2nodeComponentConfigUpdateAck-Item", + "E2nodeComponentConfigUpdateAck-Item", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigUpdateAck_Item_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_Item_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigUpdateAck_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_Item_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_Item_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigUpdateAck_Item_1, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigUpdateAck_Item_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigUpdateAck-List.c b/e2ap/lib/E2nodeComponentConfigUpdateAck-List.c new file mode 100644 index 0000000..34b2c26 --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigUpdateAck-List.c @@ -0,0 +1,73 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigUpdateAck-List.h" + +#include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2nodeComponentConfigUpdateAck_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..1024)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2nodeComponentConfigUpdateAck_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 10, 10, 1, 1024 } /* (SIZE(1..1024)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdateAck_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainer_88P12, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigUpdateAck_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_E2nodeComponentConfigUpdateAck_List_specs_1 = { + sizeof(struct E2nodeComponentConfigUpdateAck_List), + offsetof(struct E2nodeComponentConfigUpdateAck_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigUpdateAck_List = { + "E2nodeComponentConfigUpdateAck-List", + "E2nodeComponentConfigUpdateAck-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_E2nodeComponentConfigUpdateAck_List_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_List_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigUpdateAck_List_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_List_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_List_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2nodeComponentConfigUpdateAck_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2nodeComponentConfigUpdateAck_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_E2nodeComponentConfigUpdateAck_List_1, + 1, /* Single element */ + &asn_SPC_E2nodeComponentConfigUpdateAck_List_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfiguration.c b/e2ap/lib/E2nodeComponentConfiguration.c new file mode 100644 index 0000000..9f0608c --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfiguration.c @@ -0,0 +1,84 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfiguration.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfiguration_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfiguration, e2nodeComponentRequestPart), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentRequestPart" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfiguration, e2nodeComponentResponsePart), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentResponsePart" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfiguration_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfiguration_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* e2nodeComponentRequestPart */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* e2nodeComponentResponsePart */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfiguration_specs_1 = { + sizeof(struct E2nodeComponentConfiguration), + offsetof(struct E2nodeComponentConfiguration, _asn_ctx), + asn_MAP_E2nodeComponentConfiguration_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_E2nodeComponentConfiguration = { + "E2nodeComponentConfiguration", + "E2nodeComponentConfiguration", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfiguration_tags_1, + sizeof(asn_DEF_E2nodeComponentConfiguration_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfiguration_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfiguration_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfiguration_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfiguration_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfiguration_1, + 2, /* Elements count */ + &asn_SPC_E2nodeComponentConfiguration_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentConfigurationAck.c b/e2ap/lib/E2nodeComponentConfigurationAck.c new file mode 100644 index 0000000..9dc259a --- /dev/null +++ b/e2ap/lib/E2nodeComponentConfigurationAck.c @@ -0,0 +1,150 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentConfigurationAck.h" + +#include "Cause.h" +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_updateOutcome_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_type_updateOutcome_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static const asn_INTEGER_enum_map_t asn_MAP_updateOutcome_value2enum_2[] = { + { 0, 7, "success" }, + { 1, 7, "failure" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_updateOutcome_enum2value_2[] = { + 1, /* failure(1) */ + 0 /* success(0) */ + /* This list is extensible */ +}; +static const asn_INTEGER_specifics_t asn_SPC_updateOutcome_specs_2 = { + asn_MAP_updateOutcome_value2enum_2, /* "tag" => N; sorted by tag */ + asn_MAP_updateOutcome_enum2value_2, /* 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_updateOutcome_tags_2[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_updateOutcome_2 = { + "updateOutcome", + "updateOutcome", + &asn_OP_NativeEnumerated, + asn_DEF_updateOutcome_tags_2, + sizeof(asn_DEF_updateOutcome_tags_2) + /sizeof(asn_DEF_updateOutcome_tags_2[0]) - 1, /* 1 */ + asn_DEF_updateOutcome_tags_2, /* Same as above */ + sizeof(asn_DEF_updateOutcome_tags_2) + /sizeof(asn_DEF_updateOutcome_tags_2[0]), /* 2 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_updateOutcome_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_updateOutcome_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_updateOutcome_specs_2 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigurationAck_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigurationAck, updateOutcome), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_updateOutcome_2, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "updateOutcome" + }, + { ATF_POINTER, 1, offsetof(struct E2nodeComponentConfigurationAck, failureCause), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_Cause, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "failureCause" + }, +}; +static const int asn_MAP_E2nodeComponentConfigurationAck_oms_1[] = { 1 }; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigurationAck_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigurationAck_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* updateOutcome */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* failureCause */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigurationAck_specs_1 = { + sizeof(struct E2nodeComponentConfigurationAck), + offsetof(struct E2nodeComponentConfigurationAck, _asn_ctx), + asn_MAP_E2nodeComponentConfigurationAck_tag2el_1, + 2, /* Count of tags in the map */ + asn_MAP_E2nodeComponentConfigurationAck_oms_1, /* Optional members */ + 1, 0, /* Root/Additions */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigurationAck = { + "E2nodeComponentConfigurationAck", + "E2nodeComponentConfigurationAck", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigurationAck_tags_1, + sizeof(asn_DEF_E2nodeComponentConfigurationAck_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigurationAck_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigurationAck_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigurationAck_tags_1) + /sizeof(asn_DEF_E2nodeComponentConfigurationAck_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigurationAck_1, + 2, /* Elements count */ + &asn_SPC_E2nodeComponentConfigurationAck_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentID.c b/e2ap/lib/E2nodeComponentID.c new file mode 100644 index 0000000..0917899 --- /dev/null +++ b/e2ap/lib/E2nodeComponentID.c @@ -0,0 +1,190 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentID.h" + +#include "E2nodeComponentInterfaceNG.h" +#include "E2nodeComponentInterfaceXn.h" +#include "E2nodeComponentInterfaceE1.h" +#include "E2nodeComponentInterfaceF1.h" +#include "E2nodeComponentInterfaceW1.h" +#include "E2nodeComponentInterfaceS1.h" +#include "E2nodeComponentInterfaceX2.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2nodeComponentID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2nodeComponentID_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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_E2nodeComponentID_1[] = { + { ATF_POINTER, 0, offsetof(struct E2nodeComponentID, choice.e2nodeComponentInterfaceTypeNG), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceNG, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceTypeNG" + }, + { ATF_POINTER, 0, offsetof(struct E2nodeComponentID, choice.e2nodeComponentInterfaceTypeXn), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceXn, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceTypeXn" + }, + { ATF_POINTER, 0, offsetof(struct E2nodeComponentID, choice.e2nodeComponentInterfaceTypeE1), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceE1, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceTypeE1" + }, + { ATF_POINTER, 0, offsetof(struct E2nodeComponentID, choice.e2nodeComponentInterfaceTypeF1), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceF1, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceTypeF1" + }, + { ATF_POINTER, 0, offsetof(struct E2nodeComponentID, choice.e2nodeComponentInterfaceTypeW1), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceW1, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceTypeW1" + }, + { ATF_POINTER, 0, offsetof(struct E2nodeComponentID, choice.e2nodeComponentInterfaceTypeS1), + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceS1, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceTypeS1" + }, + { ATF_POINTER, 0, offsetof(struct E2nodeComponentID, choice.e2nodeComponentInterfaceTypeX2), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2nodeComponentInterfaceX2, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "e2nodeComponentInterfaceTypeX2" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* e2nodeComponentInterfaceTypeNG */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* e2nodeComponentInterfaceTypeXn */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* e2nodeComponentInterfaceTypeE1 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* e2nodeComponentInterfaceTypeF1 */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* e2nodeComponentInterfaceTypeW1 */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* e2nodeComponentInterfaceTypeS1 */ + { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* e2nodeComponentInterfaceTypeX2 */ +}; +asn_CHOICE_specifics_t asn_SPC_E2nodeComponentID_specs_1 = { + sizeof(struct E2nodeComponentID), + offsetof(struct E2nodeComponentID, _asn_ctx), + offsetof(struct E2nodeComponentID, present), + sizeof(((struct E2nodeComponentID *)0)->present), + asn_MAP_E2nodeComponentID_tag2el_1, + 7, /* Count of tags in the map */ + 0, 0, + 7 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentID = { + "E2nodeComponentID", + "E2nodeComponentID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2nodeComponentID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2nodeComponentID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, + asn_MBR_E2nodeComponentID_1, + 7, /* Elements count */ + &asn_SPC_E2nodeComponentID_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentInterfaceE1.c b/e2ap/lib/E2nodeComponentInterfaceE1.c new file mode 100644 index 0000000..cbccaf2 --- /dev/null +++ b/e2ap/lib/E2nodeComponentInterfaceE1.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentInterfaceE1.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceE1_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentInterfaceE1, gNB_CU_CP_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_CU_UP_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "gNB-CU-CP-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentInterfaceE1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentInterfaceE1_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gNB-CU-CP-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceE1_specs_1 = { + sizeof(struct E2nodeComponentInterfaceE1), + offsetof(struct E2nodeComponentInterfaceE1, _asn_ctx), + asn_MAP_E2nodeComponentInterfaceE1_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_E2nodeComponentInterfaceE1 = { + "E2nodeComponentInterfaceE1", + "E2nodeComponentInterfaceE1", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentInterfaceE1_tags_1, + sizeof(asn_DEF_E2nodeComponentInterfaceE1_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceE1_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentInterfaceE1_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentInterfaceE1_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceE1_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentInterfaceE1_1, + 1, /* Elements count */ + &asn_SPC_E2nodeComponentInterfaceE1_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentInterfaceF1.c b/e2ap/lib/E2nodeComponentInterfaceF1.c new file mode 100644 index 0000000..5246601 --- /dev/null +++ b/e2ap/lib/E2nodeComponentInterfaceF1.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentInterfaceF1.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceF1_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentInterfaceF1, gNB_DU_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_DU_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "gNB-DU-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentInterfaceF1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentInterfaceF1_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gNB-DU-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceF1_specs_1 = { + sizeof(struct E2nodeComponentInterfaceF1), + offsetof(struct E2nodeComponentInterfaceF1, _asn_ctx), + asn_MAP_E2nodeComponentInterfaceF1_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_E2nodeComponentInterfaceF1 = { + "E2nodeComponentInterfaceF1", + "E2nodeComponentInterfaceF1", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentInterfaceF1_tags_1, + sizeof(asn_DEF_E2nodeComponentInterfaceF1_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceF1_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentInterfaceF1_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentInterfaceF1_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceF1_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentInterfaceF1_1, + 1, /* Elements count */ + &asn_SPC_E2nodeComponentInterfaceF1_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentInterfaceNG.c b/e2ap/lib/E2nodeComponentInterfaceNG.c new file mode 100644 index 0000000..0c32b1e --- /dev/null +++ b/e2ap/lib/E2nodeComponentInterfaceNG.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentInterfaceNG.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceNG_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentInterfaceNG, amf_name), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_AMFName, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "amf-name" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentInterfaceNG_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentInterfaceNG_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* amf-name */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceNG_specs_1 = { + sizeof(struct E2nodeComponentInterfaceNG), + offsetof(struct E2nodeComponentInterfaceNG, _asn_ctx), + asn_MAP_E2nodeComponentInterfaceNG_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_E2nodeComponentInterfaceNG = { + "E2nodeComponentInterfaceNG", + "E2nodeComponentInterfaceNG", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentInterfaceNG_tags_1, + sizeof(asn_DEF_E2nodeComponentInterfaceNG_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceNG_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentInterfaceNG_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentInterfaceNG_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceNG_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentInterfaceNG_1, + 1, /* Elements count */ + &asn_SPC_E2nodeComponentInterfaceNG_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentInterfaceS1.c b/e2ap/lib/E2nodeComponentInterfaceS1.c new file mode 100644 index 0000000..accaa9b --- /dev/null +++ b/e2ap/lib/E2nodeComponentInterfaceS1.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentInterfaceS1.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceS1_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentInterfaceS1, mme_name), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_MMEname, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "mme-name" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentInterfaceS1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentInterfaceS1_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mme-name */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceS1_specs_1 = { + sizeof(struct E2nodeComponentInterfaceS1), + offsetof(struct E2nodeComponentInterfaceS1, _asn_ctx), + asn_MAP_E2nodeComponentInterfaceS1_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_E2nodeComponentInterfaceS1 = { + "E2nodeComponentInterfaceS1", + "E2nodeComponentInterfaceS1", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentInterfaceS1_tags_1, + sizeof(asn_DEF_E2nodeComponentInterfaceS1_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceS1_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentInterfaceS1_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentInterfaceS1_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceS1_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentInterfaceS1_1, + 1, /* Elements count */ + &asn_SPC_E2nodeComponentInterfaceS1_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentInterfaceType.c b/e2ap/lib/E2nodeComponentInterfaceType.c new file mode 100644 index 0000000..644a31f --- /dev/null +++ b/e2ap/lib/E2nodeComponentInterfaceType.c @@ -0,0 +1,80 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentInterfaceType.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2nodeComponentInterfaceType_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2nodeComponentInterfaceType_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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static const asn_INTEGER_enum_map_t asn_MAP_E2nodeComponentInterfaceType_value2enum_1[] = { + { 0, 2, "ng" }, + { 1, 2, "xn" }, + { 2, 2, "e1" }, + { 3, 2, "f1" }, + { 4, 2, "w1" }, + { 5, 2, "s1" }, + { 6, 2, "x2" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_E2nodeComponentInterfaceType_enum2value_1[] = { + 2, /* e1(2) */ + 3, /* f1(3) */ + 0, /* ng(0) */ + 5, /* s1(5) */ + 4, /* w1(4) */ + 6, /* x2(6) */ + 1 /* xn(1) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_E2nodeComponentInterfaceType_specs_1 = { + asn_MAP_E2nodeComponentInterfaceType_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_E2nodeComponentInterfaceType_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_E2nodeComponentInterfaceType_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentInterfaceType = { + "E2nodeComponentInterfaceType", + "E2nodeComponentInterfaceType", + &asn_OP_NativeEnumerated, + asn_DEF_E2nodeComponentInterfaceType_tags_1, + sizeof(asn_DEF_E2nodeComponentInterfaceType_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceType_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentInterfaceType_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentInterfaceType_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceType_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2nodeComponentInterfaceType_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2nodeComponentInterfaceType_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_E2nodeComponentInterfaceType_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentInterfaceW1.c b/e2ap/lib/E2nodeComponentInterfaceW1.c new file mode 100644 index 0000000..252f9c2 --- /dev/null +++ b/e2ap/lib/E2nodeComponentInterfaceW1.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentInterfaceW1.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceW1_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentInterfaceW1, ng_eNB_DU_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NGENB_DU_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "ng-eNB-DU-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentInterfaceW1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentInterfaceW1_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ng-eNB-DU-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceW1_specs_1 = { + sizeof(struct E2nodeComponentInterfaceW1), + offsetof(struct E2nodeComponentInterfaceW1, _asn_ctx), + asn_MAP_E2nodeComponentInterfaceW1_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_E2nodeComponentInterfaceW1 = { + "E2nodeComponentInterfaceW1", + "E2nodeComponentInterfaceW1", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentInterfaceW1_tags_1, + sizeof(asn_DEF_E2nodeComponentInterfaceW1_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceW1_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentInterfaceW1_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentInterfaceW1_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceW1_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentInterfaceW1_1, + 1, /* Elements count */ + &asn_SPC_E2nodeComponentInterfaceW1_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentInterfaceX2.c b/e2ap/lib/E2nodeComponentInterfaceX2.c new file mode 100644 index 0000000..2241f43 --- /dev/null +++ b/e2ap/lib/E2nodeComponentInterfaceX2.c @@ -0,0 +1,88 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentInterfaceX2.h" + +#include "GlobalENB-ID.h" +#include "GlobalenGNB-ID.h" +asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceX2_1[] = { + { ATF_POINTER, 2, offsetof(struct E2nodeComponentInterfaceX2, global_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalENB_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "global-eNB-ID" + }, + { ATF_POINTER, 1, offsetof(struct E2nodeComponentInterfaceX2, global_en_gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalenGNB_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "global-en-gNB-ID" + }, +}; +static const int asn_MAP_E2nodeComponentInterfaceX2_oms_1[] = { 0, 1 }; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentInterfaceX2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentInterfaceX2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* global-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* global-en-gNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceX2_specs_1 = { + sizeof(struct E2nodeComponentInterfaceX2), + offsetof(struct E2nodeComponentInterfaceX2, _asn_ctx), + asn_MAP_E2nodeComponentInterfaceX2_tag2el_1, + 2, /* Count of tags in the map */ + asn_MAP_E2nodeComponentInterfaceX2_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentInterfaceX2 = { + "E2nodeComponentInterfaceX2", + "E2nodeComponentInterfaceX2", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentInterfaceX2_tags_1, + sizeof(asn_DEF_E2nodeComponentInterfaceX2_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceX2_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentInterfaceX2_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentInterfaceX2_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceX2_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentInterfaceX2_1, + 2, /* Elements count */ + &asn_SPC_E2nodeComponentInterfaceX2_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeComponentInterfaceXn.c b/e2ap/lib/E2nodeComponentInterfaceXn.c new file mode 100644 index 0000000..9fbf467 --- /dev/null +++ b/e2ap/lib/E2nodeComponentInterfaceXn.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeComponentInterfaceXn.h" + +asn_TYPE_member_t asn_MBR_E2nodeComponentInterfaceXn_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentInterfaceXn, global_NG_RAN_Node_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_GlobalNG_RANNode_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "global-NG-RAN-Node-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentInterfaceXn_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentInterfaceXn_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-NG-RAN-Node-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentInterfaceXn_specs_1 = { + sizeof(struct E2nodeComponentInterfaceXn), + offsetof(struct E2nodeComponentInterfaceXn, _asn_ctx), + asn_MAP_E2nodeComponentInterfaceXn_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_E2nodeComponentInterfaceXn = { + "E2nodeComponentInterfaceXn", + "E2nodeComponentInterfaceXn", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentInterfaceXn_tags_1, + sizeof(asn_DEF_E2nodeComponentInterfaceXn_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceXn_tags_1[0]), /* 1 */ + asn_DEF_E2nodeComponentInterfaceXn_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentInterfaceXn_tags_1) + /sizeof(asn_DEF_E2nodeComponentInterfaceXn_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentInterfaceXn_1, + 1, /* Elements count */ + &asn_SPC_E2nodeComponentInterfaceXn_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeConfigurationUpdate.c b/e2ap/lib/E2nodeConfigurationUpdate.c new file mode 100644 index 0000000..908cd52 --- /dev/null +++ b/e2ap/lib/E2nodeConfigurationUpdate.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeConfigurationUpdate.h" + +asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdate_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdate, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_Container_85P18, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeConfigurationUpdate_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeConfigurationUpdate_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdate_specs_1 = { + sizeof(struct E2nodeConfigurationUpdate), + offsetof(struct E2nodeConfigurationUpdate, _asn_ctx), + asn_MAP_E2nodeConfigurationUpdate_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_E2nodeConfigurationUpdate = { + "E2nodeConfigurationUpdate", + "E2nodeConfigurationUpdate", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeConfigurationUpdate_tags_1, + sizeof(asn_DEF_E2nodeConfigurationUpdate_tags_1) + /sizeof(asn_DEF_E2nodeConfigurationUpdate_tags_1[0]), /* 1 */ + asn_DEF_E2nodeConfigurationUpdate_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeConfigurationUpdate_tags_1) + /sizeof(asn_DEF_E2nodeConfigurationUpdate_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeConfigurationUpdate_1, + 1, /* Elements count */ + &asn_SPC_E2nodeConfigurationUpdate_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeConfigurationUpdateAcknowledge.c b/e2ap/lib/E2nodeConfigurationUpdateAcknowledge.c new file mode 100644 index 0000000..5a1b763 --- /dev/null +++ b/e2ap/lib/E2nodeConfigurationUpdateAcknowledge.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeConfigurationUpdateAcknowledge.h" + +asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdateAcknowledge_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateAcknowledge, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_Container_85P19, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeConfigurationUpdateAcknowledge_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeConfigurationUpdateAcknowledge_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdateAcknowledge_specs_1 = { + sizeof(struct E2nodeConfigurationUpdateAcknowledge), + offsetof(struct E2nodeConfigurationUpdateAcknowledge, _asn_ctx), + asn_MAP_E2nodeConfigurationUpdateAcknowledge_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_E2nodeConfigurationUpdateAcknowledge = { + "E2nodeConfigurationUpdateAcknowledge", + "E2nodeConfigurationUpdateAcknowledge", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeConfigurationUpdateAcknowledge_tags_1, + sizeof(asn_DEF_E2nodeConfigurationUpdateAcknowledge_tags_1) + /sizeof(asn_DEF_E2nodeConfigurationUpdateAcknowledge_tags_1[0]), /* 1 */ + asn_DEF_E2nodeConfigurationUpdateAcknowledge_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeConfigurationUpdateAcknowledge_tags_1) + /sizeof(asn_DEF_E2nodeConfigurationUpdateAcknowledge_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeConfigurationUpdateAcknowledge_1, + 1, /* Elements count */ + &asn_SPC_E2nodeConfigurationUpdateAcknowledge_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeConfigurationUpdateFailure.c b/e2ap/lib/E2nodeConfigurationUpdateFailure.c new file mode 100644 index 0000000..3ee1919 --- /dev/null +++ b/e2ap/lib/E2nodeConfigurationUpdateFailure.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeConfigurationUpdateFailure.h" + +asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdateFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_Container_85P20, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeConfigurationUpdateFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeConfigurationUpdateFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdateFailure_specs_1 = { + sizeof(struct E2nodeConfigurationUpdateFailure), + offsetof(struct E2nodeConfigurationUpdateFailure, _asn_ctx), + asn_MAP_E2nodeConfigurationUpdateFailure_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_E2nodeConfigurationUpdateFailure = { + "E2nodeConfigurationUpdateFailure", + "E2nodeConfigurationUpdateFailure", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeConfigurationUpdateFailure_tags_1, + sizeof(asn_DEF_E2nodeConfigurationUpdateFailure_tags_1) + /sizeof(asn_DEF_E2nodeConfigurationUpdateFailure_tags_1[0]), /* 1 */ + asn_DEF_E2nodeConfigurationUpdateFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeConfigurationUpdateFailure_tags_1) + /sizeof(asn_DEF_E2nodeConfigurationUpdateFailure_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeConfigurationUpdateFailure_1, + 1, /* Elements count */ + &asn_SPC_E2nodeConfigurationUpdateFailure_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeTNLassociationRemoval-Item.c b/e2ap/lib/E2nodeTNLassociationRemoval-Item.c new file mode 100644 index 0000000..f050144 --- /dev/null +++ b/e2ap/lib/E2nodeTNLassociationRemoval-Item.c @@ -0,0 +1,84 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeTNLassociationRemoval-Item.h" + +asn_TYPE_member_t asn_MBR_E2nodeTNLassociationRemoval_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeTNLassociationRemoval_Item, tnlInformation), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_TNLinformation, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "tnlInformation" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeTNLassociationRemoval_Item, tnlInformationRIC), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_TNLinformation, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "tnlInformationRIC" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeTNLassociationRemoval_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeTNLassociationRemoval_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* tnlInformation */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* tnlInformationRIC */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeTNLassociationRemoval_Item_specs_1 = { + sizeof(struct E2nodeTNLassociationRemoval_Item), + offsetof(struct E2nodeTNLassociationRemoval_Item, _asn_ctx), + asn_MAP_E2nodeTNLassociationRemoval_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_E2nodeTNLassociationRemoval_Item = { + "E2nodeTNLassociationRemoval-Item", + "E2nodeTNLassociationRemoval-Item", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeTNLassociationRemoval_Item_tags_1, + sizeof(asn_DEF_E2nodeTNLassociationRemoval_Item_tags_1) + /sizeof(asn_DEF_E2nodeTNLassociationRemoval_Item_tags_1[0]), /* 1 */ + asn_DEF_E2nodeTNLassociationRemoval_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeTNLassociationRemoval_Item_tags_1) + /sizeof(asn_DEF_E2nodeTNLassociationRemoval_Item_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeTNLassociationRemoval_Item_1, + 2, /* Elements count */ + &asn_SPC_E2nodeTNLassociationRemoval_Item_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2nodeTNLassociationRemoval-List.c b/e2ap/lib/E2nodeTNLassociationRemoval-List.c new file mode 100644 index 0000000..f60b0a3 --- /dev/null +++ b/e2ap/lib/E2nodeTNLassociationRemoval-List.c @@ -0,0 +1,73 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "E2nodeTNLassociationRemoval-List.h" + +#include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E2nodeTNLassociationRemoval_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..32)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_E2nodeTNLassociationRemoval_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_E2nodeTNLassociationRemoval_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainer_88P10, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeTNLassociationRemoval_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_E2nodeTNLassociationRemoval_List_specs_1 = { + sizeof(struct E2nodeTNLassociationRemoval_List), + offsetof(struct E2nodeTNLassociationRemoval_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeTNLassociationRemoval_List = { + "E2nodeTNLassociationRemoval-List", + "E2nodeTNLassociationRemoval-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_E2nodeTNLassociationRemoval_List_tags_1, + sizeof(asn_DEF_E2nodeTNLassociationRemoval_List_tags_1) + /sizeof(asn_DEF_E2nodeTNLassociationRemoval_List_tags_1[0]), /* 1 */ + asn_DEF_E2nodeTNLassociationRemoval_List_tags_1, /* Same as above */ + sizeof(asn_DEF_E2nodeTNLassociationRemoval_List_tags_1) + /sizeof(asn_DEF_E2nodeTNLassociationRemoval_List_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E2nodeTNLassociationRemoval_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E2nodeTNLassociationRemoval_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_E2nodeTNLassociationRemoval_List_1, + 1, /* Single element */ + &asn_SPC_E2nodeTNLassociationRemoval_List_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/E2setupFailure.c b/e2ap/lib/E2setupFailure.c index 1b0bd35..b15426f 100644 --- a/e2ap/lib/E2setupFailure.c +++ b/e2ap/lib/E2setupFailure.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2setupFailure.h" -static asn_TYPE_member_t asn_MBR_E2setupFailure_1[] = { +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_Container_87P13, + &asn_DEF_ProtocolIE_Container_85P14, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_E2setupFailure_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_E2setupFailure_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_E2setupFailure_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_E2setupFailure_specs_1 = { sizeof(struct E2setupFailure), offsetof(struct E2setupFailure, _asn_ctx), asn_MAP_E2setupFailure_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_E2setupFailure = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2setupFailure_1, 1, /* Elements count */ &asn_SPC_E2setupFailure_specs_1 /* Additional specs */ diff --git a/e2ap/lib/E2setupRequest.c b/e2ap/lib/E2setupRequest.c index 92fd09b..b0e14b3 100644 --- a/e2ap/lib/E2setupRequest.c +++ b/e2ap/lib/E2setupRequest.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2setupRequest.h" -static asn_TYPE_member_t asn_MBR_E2setupRequest_1[] = { +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_Container_87P11, + &asn_DEF_ProtocolIE_Container_85P12, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_E2setupRequest_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_E2setupRequest_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_E2setupRequest_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_E2setupRequest_specs_1 = { sizeof(struct E2setupRequest), offsetof(struct E2setupRequest, _asn_ctx), asn_MAP_E2setupRequest_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_E2setupRequest = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2setupRequest_1, 1, /* Elements count */ &asn_SPC_E2setupRequest_specs_1 /* Additional specs */ diff --git a/e2ap/lib/E2setupResponse.c b/e2ap/lib/E2setupResponse.c index b08bc06..13e965d 100644 --- a/e2ap/lib/E2setupResponse.c +++ b/e2ap/lib/E2setupResponse.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2setupResponse.h" -static asn_TYPE_member_t asn_MBR_E2setupResponse_1[] = { +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_Container_87P12, + &asn_DEF_ProtocolIE_Container_85P13, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_E2setupResponse_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_E2setupResponse_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_E2setupResponse_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_E2setupResponse_specs_1 = { sizeof(struct E2setupResponse), offsetof(struct E2setupResponse, _asn_ctx), asn_MAP_E2setupResponse_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_E2setupResponse = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2setupResponse_1, 1, /* Elements count */ &asn_SPC_E2setupResponse_specs_1 /* Additional specs */ diff --git a/e2ap/lib/ENB-ID-Choice.c b/e2ap/lib/ENB-ID-Choice.c index b95e5eb..ae0e8b9 100644 --- a/e2ap/lib/ENB-ID-Choice.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ENB-ID-Choice.h" @@ -27,7 +27,7 @@ memb_enb_ID_macro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr size = 0; } - if((size == 20)) { + if((size == 20UL)) { /* Constraint check succeeded */ return 0; } else { @@ -58,7 +58,7 @@ memb_enb_ID_shortmacro_constraint_1(const asn_TYPE_descriptor_t *td, const void size = 0; } - if((size == 18)) { + if((size == 18UL)) { /* Constraint check succeeded */ return 0; } else { @@ -89,7 +89,7 @@ memb_enb_ID_longmacro_constraint_1(const asn_TYPE_descriptor_t *td, const void * size = 0; } - if((size == 21)) { + if((size == 21UL)) { /* Constraint check succeeded */ return 0; } else { @@ -100,45 +100,69 @@ memb_enb_ID_longmacro_constraint_1(const asn_TYPE_descriptor_t *td, const void * } } +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_enb_ID_macro_constr_2 CC_NOTUSED = { { 0, 0 }, 20 /* (SIZE(20..20)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_enb_ID_shortmacro_constr_3 CC_NOTUSED = { { 0, 0 }, 18 /* (SIZE(18..18)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_enb_ID_longmacro_constr_4 CC_NOTUSED = { { 0, 0 }, 21 /* (SIZE(21..21)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_ENB_ID_Choice_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_enb_ID_macro_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_enb_ID_macro_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_enb_ID_macro_constraint_1 + }, 0, 0, /* No default value */ "enb-ID-macro" }, @@ -147,7 +171,15 @@ asn_TYPE_member_t asn_MBR_ENB_ID_Choice_1[] = { -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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_enb_ID_shortmacro_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_enb_ID_shortmacro_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_enb_ID_shortmacro_constraint_1 + }, 0, 0, /* No default value */ "enb-ID-shortmacro" }, @@ -156,7 +188,15 @@ asn_TYPE_member_t asn_MBR_ENB_ID_Choice_1[] = { -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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_enb_ID_longmacro_constr_4, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_enb_ID_longmacro_constr_4, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_enb_ID_longmacro_constraint_1 + }, 0, 0, /* No default value */ "enb-ID-longmacro" }, @@ -184,7 +224,15 @@ asn_TYPE_descriptor_t asn_DEF_ENB_ID_Choice = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ENB_ID_Choice_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ENB_ID_Choice_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_ENB_ID_Choice_1, 3, /* Elements count */ &asn_SPC_ENB_ID_Choice_specs_1 /* Additional specs */ diff --git a/e2ap/lib/ENB-ID.c b/e2ap/lib/ENB-ID.c index 96b8cb5..111836d 100644 --- a/e2ap/lib/ENB-ID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ENB-ID.h" @@ -27,7 +27,7 @@ memb_macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr size = 0; } - if((size == 20)) { + if((size == 20UL)) { /* Constraint check succeeded */ return 0; } else { @@ -58,7 +58,7 @@ memb_home_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size == 28)) { + if((size == 28UL)) { /* Constraint check succeeded */ return 0; } else { @@ -89,7 +89,7 @@ memb_short_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void size = 0; } - if((size == 18)) { + if((size == 18UL)) { /* Constraint check succeeded */ return 0; } else { @@ -120,7 +120,7 @@ memb_long_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void size = 0; } - if((size == 21)) { + if((size == 21UL)) { /* Constraint check succeeded */ return 0; } else { @@ -131,53 +131,81 @@ memb_long_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void } } +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_macro_eNB_ID_constr_2 CC_NOTUSED = { { 0, 0 }, 20 /* (SIZE(20..20)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_home_eNB_ID_constr_3 CC_NOTUSED = { { 0, 0 }, 28 /* (SIZE(28..28)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_short_Macro_eNB_ID_constr_5 CC_NOTUSED = { { 0, 0 }, 18 /* (SIZE(18..18)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_long_Macro_eNB_ID_constr_6 CC_NOTUSED = { { 0, 0 }, 21 /* (SIZE(21..21)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_ENB_ID_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_macro_eNB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_macro_eNB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_macro_eNB_ID_constraint_1 + }, 0, 0, /* No default value */ "macro-eNB-ID" }, @@ -186,7 +214,15 @@ asn_TYPE_member_t asn_MBR_ENB_ID_1[] = { -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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_home_eNB_ID_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_home_eNB_ID_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_home_eNB_ID_constraint_1 + }, 0, 0, /* No default value */ "home-eNB-ID" }, @@ -195,7 +231,15 @@ asn_TYPE_member_t asn_MBR_ENB_ID_1[] = { -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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_short_Macro_eNB_ID_constr_5, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_short_Macro_eNB_ID_constr_5, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_short_Macro_eNB_ID_constraint_1 + }, 0, 0, /* No default value */ "short-Macro-eNB-ID" }, @@ -204,7 +248,15 @@ asn_TYPE_member_t asn_MBR_ENB_ID_1[] = { -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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_long_Macro_eNB_ID_constr_6, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_long_Macro_eNB_ID_constr_6, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_long_Macro_eNB_ID_constraint_1 + }, 0, 0, /* No default value */ "long-Macro-eNB-ID" }, @@ -233,7 +285,15 @@ asn_TYPE_descriptor_t asn_DEF_ENB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ENB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ENB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_ENB_ID_1, 4, /* Elements count */ &asn_SPC_ENB_ID_specs_1 /* Additional specs */ diff --git a/e2ap/lib/ENGNB-ID.c b/e2ap/lib/ENGNB-ID.c index 4bfdbd8..be47ea2 100644 --- a/e2ap/lib/ENGNB-ID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ENGNB-ID.h" @@ -27,7 +27,7 @@ memb_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size >= 22 && size <= 32)) { + if((size >= 22UL && size <= 32UL)) { /* Constraint check succeeded */ return 0; } else { @@ -38,29 +38,45 @@ memb_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, } } +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_gNB_ID_constr_2 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(22..32)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_ENGNB_ID_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_gNB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_gNB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_gNB_ID_constraint_1 + }, 0, 0, /* No default value */ "gNB-ID" }, @@ -86,7 +102,15 @@ asn_TYPE_descriptor_t asn_DEF_ENGNB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ENGNB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ENGNB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_ENGNB_ID_1, 1, /* Elements count */ &asn_SPC_ENGNB_ID_specs_1 /* Additional specs */ diff --git a/e2ap/lib/EXTERNAL.c b/e2ap/lib/EXTERNAL.c new file mode 100644 index 0000000..10fcf63 --- /dev/null +++ b/e2ap/lib/EXTERNAL.c @@ -0,0 +1,228 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "ASN1C-UsefulInformationObjectClasses" + * found in "/usr/local/share/asn1c/standard-modules/ASN1C-UsefulInformationObjectClasses.asn1" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "EXTERNAL.h" + +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_encoding_constr_5 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_type_encoding_constr_5 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static asn_TYPE_member_t asn_MBR_encoding_5[] = { + { ATF_NOFLAGS, 0, offsetof(struct EXTERNAL__encoding, choice.single_ASN1_type), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_ANY, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "single-ASN1-type" + }, + { ATF_NOFLAGS, 0, offsetof(struct EXTERNAL__encoding, choice.octet_aligned), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "octet-aligned" + }, + { ATF_NOFLAGS, 0, offsetof(struct EXTERNAL__encoding, choice.arbitrary), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "arbitrary" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_encoding_tag2el_5[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* single-ASN1-type */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* octet-aligned */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* arbitrary */ +}; +static asn_CHOICE_specifics_t asn_SPC_encoding_specs_5 = { + sizeof(struct EXTERNAL__encoding), + offsetof(struct EXTERNAL__encoding, _asn_ctx), + offsetof(struct EXTERNAL__encoding, present), + sizeof(((struct EXTERNAL__encoding *)0)->present), + asn_MAP_encoding_tag2el_5, + 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_encoding_5 = { + "encoding", + "encoding", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_encoding_constr_5, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_encoding_constr_5, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, + asn_MBR_encoding_5, + 3, /* Elements count */ + &asn_SPC_encoding_specs_5 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_EXTERNAL_1[] = { + { ATF_POINTER, 3, offsetof(struct EXTERNAL, direct_reference), + (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), + 0, + &asn_DEF_OBJECT_IDENTIFIER, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "direct-reference" + }, + { ATF_POINTER, 2, offsetof(struct EXTERNAL, indirect_reference), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_NativeInteger, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "indirect-reference" + }, + { ATF_POINTER, 1, offsetof(struct EXTERNAL, data_value_descriptor), + (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)), + 0, + &asn_DEF_ObjectDescriptor, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "data-value-descriptor" + }, + { ATF_NOFLAGS, 0, offsetof(struct EXTERNAL, encoding), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_encoding_5, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "encoding" + }, +}; +static const int asn_MAP_EXTERNAL_oms_1[] = { 0, 1, 2 }; +static const ber_tlv_tag_t asn_DEF_EXTERNAL_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (8 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_EXTERNAL_tag2el_1[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* indirect-reference */ + { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 0, 0, 0 }, /* direct-reference */ + { (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)), 2, 0, 0 }, /* data-value-descriptor */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 3, 0, 0 }, /* single-ASN1-type */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 3, 0, 0 }, /* octet-aligned */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 3, 0, 0 } /* arbitrary */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_EXTERNAL_specs_1 = { + sizeof(struct EXTERNAL), + offsetof(struct EXTERNAL, _asn_ctx), + asn_MAP_EXTERNAL_tag2el_1, + 6, /* Count of tags in the map */ + asn_MAP_EXTERNAL_oms_1, /* Optional members */ + 3, 0, /* Root/Additions */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_EXTERNAL = { + "EXTERNAL", + "EXTERNAL", + &asn_OP_SEQUENCE, + asn_DEF_EXTERNAL_tags_1, + sizeof(asn_DEF_EXTERNAL_tags_1) + /sizeof(asn_DEF_EXTERNAL_tags_1[0]) - 1, /* 1 */ + asn_DEF_EXTERNAL_tags_1, /* Same as above */ + sizeof(asn_DEF_EXTERNAL_tags_1) + /sizeof(asn_DEF_EXTERNAL_tags_1[0]), /* 2 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_EXTERNAL_1, + 4, /* Elements count */ + &asn_SPC_EXTERNAL_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/ErrorIndication.c b/e2ap/lib/ErrorIndication.c index a47c6e0..492d55f 100644 --- a/e2ap/lib/ErrorIndication.c +++ b/e2ap/lib/ErrorIndication.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ErrorIndication.h" -static asn_TYPE_member_t asn_MBR_ErrorIndication_1[] = { +asn_TYPE_member_t asn_MBR_ErrorIndication_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_Container_87P10, + &asn_DEF_ProtocolIE_Container_85P11, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_ErrorIndication_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_ErrorIndication_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_specs_1 = { sizeof(struct ErrorIndication), offsetof(struct ErrorIndication, _asn_ctx), asn_MAP_ErrorIndication_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_ErrorIndication = { asn_DEF_ErrorIndication_tags_1, /* Same as above */ sizeof(asn_DEF_ErrorIndication_tags_1) /sizeof(asn_DEF_ErrorIndication_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_ErrorIndication_1, 1, /* Elements count */ &asn_SPC_ErrorIndication_specs_1 /* Additional specs */ diff --git a/e2ap/lib/GNB-CU-UP-ID.c b/e2ap/lib/GNB-CU-UP-ID.c index 8f960e2..e957f8d 100644 --- a/e2ap/lib/GNB-CU-UP-ID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GNB-CU-UP-ID.h" @@ -27,7 +27,7 @@ GNB_CU_UP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if((value >= 0 && value <= 68719476735)) { + if((value >= 0L && value <= 68719476735L)) { /* Constraint check succeeded */ return 0; } else { @@ -42,14 +42,18 @@ GNB_CU_UP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using INTEGER, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_GNB_CU_UP_ID_constr_1 CC_NOTUSED = { { 8, 1 } /* (0..68719476735) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_GNB_CU_UP_ID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -63,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GNB_CU_UP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GNB_CU_UP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + GNB_CU_UP_ID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2ap/lib/GNB-DU-ID.c b/e2ap/lib/GNB-DU-ID.c index 6c0940d..b85d2e0 100644 --- a/e2ap/lib/GNB-DU-ID.c +++ b/e2ap/lib/GNB-DU-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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GNB-DU-ID.h" @@ -27,7 +27,7 @@ GNB_DU_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if((value >= 0 && value <= 68719476735)) { + if((value >= 0L && value <= 68719476735L)) { /* Constraint check succeeded */ return 0; } else { @@ -42,14 +42,18 @@ GNB_DU_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using INTEGER, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_GNB_DU_ID_constr_1 CC_NOTUSED = { { 8, 1 } /* (0..68719476735) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_GNB_DU_ID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -63,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_GNB_DU_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GNB_DU_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GNB_DU_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + GNB_DU_ID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2ap/lib/GNB-ID-Choice.c b/e2ap/lib/GNB-ID-Choice.c index 085a942..13801db 100644 --- a/e2ap/lib/GNB-ID-Choice.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GNB-ID-Choice.h" @@ -27,7 +27,7 @@ memb_gnb_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size >= 22 && size <= 32)) { + if((size >= 22UL && size <= 32UL)) { /* Constraint check succeeded */ return 0; } else { @@ -38,29 +38,45 @@ memb_gnb_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, } } +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_gnb_ID_constr_2 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(22..32)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_GNB_ID_Choice_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_gnb_ID_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_gnb_ID_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_gnb_ID_constraint_1 + }, 0, 0, /* No default value */ "gnb-ID" }, @@ -86,7 +102,15 @@ asn_TYPE_descriptor_t asn_DEF_GNB_ID_Choice = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GNB_ID_Choice_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GNB_ID_Choice_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_GNB_ID_Choice_1, 1, /* Elements count */ &asn_SPC_GNB_ID_Choice_specs_1 /* Additional specs */ diff --git a/e2ap/lib/GlobalE2node-ID.c b/e2ap/lib/GlobalE2node-ID.c index 13a8295..684ab53 100644 --- a/e2ap/lib/GlobalE2node-ID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalE2node-ID.h" @@ -11,21 +11,33 @@ #include "GlobalE2node-en-gNB-ID.h" #include "GlobalE2node-ng-eNB-ID.h" #include "GlobalE2node-eNB-ID.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_GlobalE2node_ID_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB" }, @@ -34,7 +46,15 @@ asn_TYPE_member_t asn_MBR_GlobalE2node_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalE2node_en_gNB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "en-gNB" }, @@ -43,7 +63,15 @@ asn_TYPE_member_t asn_MBR_GlobalE2node_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalE2node_ng_eNB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ng-eNB" }, @@ -52,7 +80,15 @@ asn_TYPE_member_t asn_MBR_GlobalE2node_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalE2node_eNB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "eNB" }, @@ -81,7 +117,15 @@ asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GlobalE2node_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GlobalE2node_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_GlobalE2node_ID_1, 4, /* Elements count */ &asn_SPC_GlobalE2node_ID_specs_1 /* Additional specs */ diff --git a/e2ap/lib/GlobalE2node-eNB-ID.c b/e2ap/lib/GlobalE2node-eNB-ID.c index 7cb93f1..6a9ae6b 100644 --- a/e2ap/lib/GlobalE2node-eNB-ID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalE2node-eNB-ID.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_GlobalE2node_eNB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalENB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "global-eNB-ID" }, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_GlobalE2node_eNB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalE2node_eNB_ID_1, 1, /* Elements count */ &asn_SPC_GlobalE2node_eNB_ID_specs_1 /* Additional specs */ diff --git a/e2ap/lib/GlobalE2node-en-gNB-ID.c b/e2ap/lib/GlobalE2node-en-gNB-ID.c index 6444325..f86076d 100644 --- a/e2ap/lib/GlobalE2node-en-gNB-ID.c +++ b/e2ap/lib/GlobalE2node-en-gNB-ID.c @@ -1,36 +1,82 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #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), + { ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_en_gNB_ID, global_en_gNB_ID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalenGNB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "global-gNB-ID" + "global-en-gNB-ID" + }, + { ATF_POINTER, 2, offsetof(struct GlobalE2node_en_gNB_ID, en_gNB_CU_UP_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_CU_UP_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "en-gNB-CU-UP-ID" + }, + { ATF_POINTER, 1, offsetof(struct GlobalE2node_en_gNB_ID, en_gNB_DU_ID), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_DU_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "en-gNB-DU-ID" }, }; +static const int asn_MAP_GlobalE2node_en_gNB_ID_oms_1[] = { 1, 2 }; 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_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* global-en-gNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* en-gNB-CU-UP-ID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* en-gNB-DU-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 */ + 3, /* Count of tags in the map */ + asn_MAP_GlobalE2node_en_gNB_ID_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 3, /* First extension addition */ }; asn_TYPE_descriptor_t asn_DEF_GlobalE2node_en_gNB_ID = { "GlobalE2node-en-gNB-ID", @@ -42,9 +88,17 @@ asn_TYPE_descriptor_t asn_DEF_GlobalE2node_en_gNB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalE2node_en_gNB_ID_1, - 1, /* Elements count */ + 3, /* Elements count */ &asn_SPC_GlobalE2node_en_gNB_ID_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/GlobalE2node-gNB-ID.c b/e2ap/lib/GlobalE2node-gNB-ID.c index 31bf024..6254e26 100644 --- a/e2ap/lib/GlobalE2node-gNB-ID.c +++ b/e2ap/lib/GlobalE2node-gNB-ID.c @@ -1,58 +1,101 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalE2node-gNB-ID.h" +#include "GlobalenGNB-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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "global-gNB-ID" }, - { ATF_POINTER, 2, offsetof(struct GlobalE2node_gNB_ID, gNB_CU_UP_ID), + { ATF_POINTER, 3, offsetof(struct GlobalE2node_gNB_ID, global_en_gNB_ID), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalenGNB_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "global-en-gNB-ID" + }, + { ATF_POINTER, 2, offsetof(struct GlobalE2node_gNB_ID, gNB_CU_UP_ID), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ &asn_DEF_GNB_CU_UP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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)), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GNB_DU_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-DU-ID" }, }; -static const int asn_MAP_GlobalE2node_gNB_ID_oms_1[] = { 1, 2 }; +static const int asn_MAP_GlobalE2node_gNB_ID_oms_1[] = { 1, 2, 3 }; 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_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* global-en-gNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* gNB-CU-UP-ID */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 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 */ + 4, /* Count of tags in the map */ asn_MAP_GlobalE2node_gNB_ID_oms_1, /* Optional members */ - 2, 0, /* Root/Additions */ - 3, /* First extension addition */ + 3, 0, /* Root/Additions */ + 4, /* First extension addition */ }; asn_TYPE_descriptor_t asn_DEF_GlobalE2node_gNB_ID = { "GlobalE2node-gNB-ID", @@ -64,9 +107,17 @@ asn_TYPE_descriptor_t asn_DEF_GlobalE2node_gNB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalE2node_gNB_ID_1, - 3, /* Elements count */ + 4, /* Elements count */ &asn_SPC_GlobalE2node_gNB_ID_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/GlobalE2node-ng-eNB-ID.c b/e2ap/lib/GlobalE2node-ng-eNB-ID.c index b3bb491..62f51b5 100644 --- a/e2ap/lib/GlobalE2node-ng-eNB-ID.c +++ b/e2ap/lib/GlobalE2node-ng-eNB-ID.c @@ -1,36 +1,83 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalE2node-ng-eNB-ID.h" +#include "GlobalENB-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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "global-ng-eNB-ID" }, + { ATF_POINTER, 2, offsetof(struct GlobalE2node_ng_eNB_ID, global_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalENB_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "global-eNB-ID" + }, + { ATF_POINTER, 1, offsetof(struct GlobalE2node_ng_eNB_ID, ngENB_DU_ID), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NGENB_DU_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "ngENB-DU-ID" + }, }; +static const int asn_MAP_GlobalE2node_ng_eNB_ID_oms_1[] = { 1, 2 }; 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_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* global-ng-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* global-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ngENB-DU-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 */ + 3, /* Count of tags in the map */ + asn_MAP_GlobalE2node_ng_eNB_ID_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 3, /* First extension addition */ }; asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ng_eNB_ID = { "GlobalE2node-ng-eNB-ID", @@ -42,9 +89,17 @@ asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ng_eNB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalE2node_ng_eNB_ID_1, - 1, /* Elements count */ + 3, /* Elements count */ &asn_SPC_GlobalE2node_ng_eNB_ID_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/GlobalENB-ID.c b/e2ap/lib/GlobalENB-ID.c index 9c34820..8561e9e 100644 --- a/e2ap/lib/GlobalENB-ID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalENB-ID.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMN_Identity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "pLMN-Identity" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_ENB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "eNB-ID" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalENB_ID_1, 2, /* Elements count */ &asn_SPC_GlobalENB_ID_specs_1 /* Additional specs */ diff --git a/e2ap/lib/GlobalNG-RANNode-ID.c b/e2ap/lib/GlobalNG-RANNode-ID.c new file mode 100644 index 0000000..a372885 --- /dev/null +++ b/e2ap/lib/GlobalNG-RANNode-ID.c @@ -0,0 +1,95 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "GlobalNG-RANNode-ID.h" + +#include "GlobalgNB-ID.h" +#include "GlobalngeNB-ID.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_GlobalNG_RANNode_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_GlobalNG_RANNode_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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_GlobalNG_RANNode_ID_1[] = { + { ATF_POINTER, 0, offsetof(struct GlobalNG_RANNode_ID, choice.gNB), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalgNB_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "gNB" + }, + { ATF_POINTER, 0, offsetof(struct GlobalNG_RANNode_ID, choice.ng_eNB), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalngeNB_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "ng-eNB" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalNG_RANNode_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ng-eNB */ +}; +asn_CHOICE_specifics_t asn_SPC_GlobalNG_RANNode_ID_specs_1 = { + sizeof(struct GlobalNG_RANNode_ID), + offsetof(struct GlobalNG_RANNode_ID, _asn_ctx), + offsetof(struct GlobalNG_RANNode_ID, present), + sizeof(((struct GlobalNG_RANNode_ID *)0)->present), + asn_MAP_GlobalNG_RANNode_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, + 2 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalNG_RANNode_ID = { + "GlobalNG-RANNode-ID", + "GlobalNG-RANNode-ID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GlobalNG_RANNode_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GlobalNG_RANNode_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, + asn_MBR_GlobalNG_RANNode_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalNG_RANNode_ID_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/GlobalRIC-ID.c b/e2ap/lib/GlobalRIC-ID.c index c027c79..7be36eb 100644 --- a/e2ap/lib/GlobalRIC-ID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalRIC-ID.h" @@ -27,7 +27,7 @@ memb_ric_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size == 20)) { + if((size == 20UL)) { /* Constraint check succeeded */ return 0; } else { @@ -38,21 +38,33 @@ memb_ric_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, } } +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_ric_ID_constr_3 CC_NOTUSED = { { 0, 0 }, 20 /* (SIZE(20..20)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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_Identity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "pLMN-Identity" }, @@ -61,7 +73,15 @@ asn_TYPE_member_t asn_MBR_GlobalRIC_ID_1[] = { -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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_ric_ID_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_ric_ID_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_ric_ID_constraint_1 + }, 0, 0, /* No default value */ "ric-ID" }, @@ -91,7 +111,15 @@ asn_TYPE_descriptor_t asn_DEF_GlobalRIC_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalRIC_ID_1, 2, /* Elements count */ &asn_SPC_GlobalRIC_ID_specs_1 /* Additional specs */ diff --git a/e2ap/lib/GlobalenGNB-ID.c b/e2ap/lib/GlobalenGNB-ID.c index 2599aae..2172dbc 100644 --- a/e2ap/lib/GlobalenGNB-ID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalenGNB-ID.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMN_Identity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "pLMN-Identity" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_ENGNB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-ID" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_GlobalenGNB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalenGNB_ID_1, 2, /* Elements count */ &asn_SPC_GlobalenGNB_ID_specs_1 /* Additional specs */ diff --git a/e2ap/lib/GlobalgNB-ID.c b/e2ap/lib/GlobalgNB-ID.c index 2150089..0e8702c 100644 --- a/e2ap/lib/GlobalgNB-ID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalgNB-ID.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_GlobalgNB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMN_Identity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "plmn-id" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_GlobalgNB_ID_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_GNB_ID_Choice, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gnb-id" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_GlobalgNB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalgNB_ID_1, 2, /* Elements count */ &asn_SPC_GlobalgNB_ID_specs_1 /* Additional specs */ diff --git a/e2ap/lib/GlobalngeNB-ID.c b/e2ap/lib/GlobalngeNB-ID.c index 97d1f41..b0092ba 100644 --- a/e2ap/lib/GlobalngeNB-ID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalngeNB-ID.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_GlobalngeNB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMN_Identity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "plmn-id" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_GlobalngeNB_ID_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_ENB_ID_Choice, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "enb-id" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_GlobalngeNB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalngeNB_ID_1, 2, /* Elements count */ &asn_SPC_GlobalngeNB_ID_specs_1 /* Additional specs */ diff --git a/e2ap/lib/GraphicString.c b/e2ap/lib/GraphicString.c new file mode 100644 index 0000000..b761187 --- /dev/null +++ b/e2ap/lib/GraphicString.c @@ -0,0 +1,91 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * GraphicString basic type description. + */ +static const ber_tlv_tag_t asn_DEF_GraphicString_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (25 << 2)), /* [UNIVERSAL 25] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ +}; +asn_TYPE_operation_t asn_OP_GraphicString = { + OCTET_STRING_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OCTET_STRING_print, /* non-ascii string */ +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_hex, + OCTET_STRING_encode_xer, /* Can't expect it to be ASCII/UTF8 */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_encode_jer, /* Can't expect it to be ASCII/UTF8 */ +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + OCTET_STRING_decode_oer, + OCTET_STRING_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + OCTET_STRING_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_GraphicString = { + "GraphicString", + "GraphicString", + &asn_OP_GraphicString, + asn_DEF_GraphicString_tags, + sizeof(asn_DEF_GraphicString_tags) + / sizeof(asn_DEF_GraphicString_tags[0]) - 1, + asn_DEF_GraphicString_tags, + sizeof(asn_DEF_GraphicString_tags) + / sizeof(asn_DEF_GraphicString_tags[0]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_unknown_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; diff --git a/e2ap/lib/INTEGER.c b/e2ap/lib/INTEGER.c index 2a2f4d7..095063f 100644 --- a/e2ap/lib/INTEGER.c +++ b/e2ap/lib/INTEGER.c @@ -1,134 +1,99 @@ -/*- - * Copyright (c) 2003-2014 Lev Walkin . +/* + * Copyright (c) 2003-2019 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 +#include /* * INTEGER basic type description. */ static const ber_tlv_tag_t asn_DEF_INTEGER_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) + (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, + INTEGER_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + INTEGER_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + INTEGER_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + ber_decode_primitive, + INTEGER_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + INTEGER_decode_xer, + INTEGER_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + INTEGER_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + INTEGER_decode_oer, /* OER decoder */ + INTEGER_encode_oer, /* Canonical OER encoder */ #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, + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + INTEGER_decode_uper, /* Unaligned PER decoder */ + INTEGER_encode_uper, /* Unaligned PER encoder */ #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + INTEGER_decode_aper, /* Aligned PER decoder */ + INTEGER_encode_aper, /* Aligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + INTEGER_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ +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 */ + "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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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 +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; @@ -202,89 +167,6 @@ INTEGER__dump(const asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_cons 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; @@ -304,816 +186,6 @@ INTEGER_map_value2enum(const asn_INTEGER_specifics_t *specs, long value) { 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; @@ -1428,64 +500,71 @@ asn_int642INTEGER(INTEGER_t *st, int64_t value) { */ enum asn_strtox_result_e asn_strtoimax_lim(const char *str, const char **end, intmax_t *intp) { - int sign = 1; - intmax_t value; + 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; - } - } + const intmax_t 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; - 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; - } - } + if(str >= *end) return ASN_STRTOX_ERROR_INVAL; - *end = str; - *intp = sign * value; - return ASN_STRTOX_OK; + 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++) { + if(*str >= 0x30 && *str <= 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; + } + str += 1; + if(str < *end) { + // If digits continue, we're guaranteed out of range. + *end = str; + if(*str >= 0x30 && *str <= 0x39) { + return ASN_STRTOX_ERROR_RANGE; + } else { + *intp = sign * value; + return ASN_STRTOX_EXTRA_DATA; + } + } + break; + } else { + *end = str; + return ASN_STRTOX_ERROR_RANGE; + } + } else { + *end = str; + return ASN_STRTOX_ERROR_RANGE; + } + } else { + *end = str; + *intp = sign * value; + return ASN_STRTOX_EXTRA_DATA; + } + } + + *end = str; + *intp = sign * value; + return ASN_STRTOX_OK; } /* @@ -1496,56 +575,63 @@ asn_strtoimax_lim(const char *str, const char **end, intmax_t *intp) { */ enum asn_strtox_result_e asn_strtoumax_lim(const char *str, const char **end, uintmax_t *uintp) { - uintmax_t value; + 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 + const uintmax_t asn1_uintmax_max = ((~(uintmax_t)0)); + const uintmax_t upper_boundary = asn1_uintmax_max / 10; + uintmax_t last_digit_max = asn1_uintmax_max % 10; if(str >= *end) return ASN_STRTOX_ERROR_INVAL; - switch(*str) { - case '-': + switch(*str) { + case '-': return ASN_STRTOX_ERROR_INVAL; - case '+': - str++; - if(str >= *end) { - *end = str; - return ASN_STRTOX_EXPECT_MORE; - } - } + 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) { + for(value = 0; str < (*end); str++) { + if(*str >= 0x30 && *str <= 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; + str += 1; + if(str < *end) { + // If digits continue, we're guaranteed out of range. + *end = str; + if(*str >= 0x30 && *str <= 0x39) { + return ASN_STRTOX_ERROR_RANGE; + } else { + *uintp = value; + return ASN_STRTOX_EXTRA_DATA; + } + } + break; } 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; + return ASN_STRTOX_ERROR_RANGE; + } + } else { + *end = str; + return ASN_STRTOX_ERROR_RANGE; + } + } else { + *end = str; + *uintp = value; + return ASN_STRTOX_EXTRA_DATA; + } + } - *end = str; - *uintp = value; - return ASN_STRTOX_OK; + *end = str; + *uintp = value; + return ASN_STRTOX_OK; } enum asn_strtox_result_e @@ -1650,86 +736,3 @@ INTEGER_compare(const asn_TYPE_descriptor_t *td, const void *aptr, } } - -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/e2ap/lib/INTEGER_aper.c b/e2ap/lib/INTEGER_aper.c new file mode 100644 index 0000000..fc88268 --- /dev/null +++ b/e2ap/lib/INTEGER_aper.c @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 %lld", + value, (long long int)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 %lld", + value, (long long int)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, -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/%zu) lb %lld ub %lld %s", + uval, st->buf[0], st->size, + (long long int)ct->lower_bound, + (long long int)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/%zu) lb %lld ub %lld %s", + value, st->buf[0], st->size, + (long long int)ct->lower_bound, + (long long int)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 (%lld) with range %d bits", + value, (long long int)(value - ct->lower_bound), + ct->range_bits); + + v = value - ct->lower_bound; + + /* #12 <= 8 -> alignment ? */ + int range = ct->upper_bound - ct->lower_bound + 1; + if (ct->range_bits < 8 || (ct->range_bits == 8 && range < 256)) { + 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 %lld", (long long int)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 = aper_put_length(po, -1, -1, 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 && (aper_put_length(po, -1, -1, 0, NULL) < 0)) + ASN__ENCODE_FAILED; + } + + ASN__ENCODED_OK(er); +} diff --git a/e2ap/lib/INTEGER_ber.c b/e2ap/lib/INTEGER_ber.c new file mode 100644 index 0000000..57bfe1e --- /dev/null +++ b/e2ap/lib/INTEGER_ber.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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; +} diff --git a/e2ap/lib/INTEGER_jer.c b/e2ap/lib/INTEGER_jer.c new file mode 100644 index 0000000..23d7c12 --- /dev/null +++ b/e2ap/lib/INTEGER_jer.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +INTEGER_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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); +} diff --git a/e2ap/lib/INTEGER_oer.c b/e2ap/lib/INTEGER_oer.c index 110689b..19f276d 100644 --- a/e2ap/lib/INTEGER_oer.c +++ b/e2ap/lib/INTEGER_oer.c @@ -3,11 +3,8 @@ * 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, @@ -175,5 +172,3 @@ INTEGER_encode_oer(const asn_TYPE_descriptor_t *td, ASN__ENCODED_OK(er); } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2ap/lib/INTEGER_print.c b/e2ap/lib/INTEGER_print.c new file mode 100644 index 0000000..2d37dee --- /dev/null +++ b/e2ap/lib/INTEGER_print.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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; +} diff --git a/e2ap/lib/INTEGER_rfill.c b/e2ap/lib/INTEGER_rfill.c new file mode 100644 index 0000000..fab0023 --- /dev/null +++ b/e2ap/lib/INTEGER_rfill.c @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 { + 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; +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + const asn_per_constraints_t *ct; + + 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); + } + } +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + } + + 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/e2ap/lib/INTEGER_uper.c b/e2ap/lib/INTEGER_uper.c new file mode 100644 index 0000000..ed65385 --- /dev/null +++ b/e2ap/lib/INTEGER_uper.c @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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(uintmax_t)) + ASN__DECODE_FAILED; + + if(specs && specs->field_unsigned) { + uintmax_t 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_umax2INTEGER(st, uvalue)) + ASN__DECODE_FAILED; + } else { + uintmax_t uvalue = 0; + intmax_t 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_imax_range_unrebase(uvalue, ct->lower_bound, + ct->upper_bound, &svalue) + || asn_imax2INTEGER(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 arithmetic. + */ + 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; + union { + intmax_t s; + uintmax_t u; + } value; + + 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) { + if(asn_INTEGER2umax(st, &value.u)) + ASN__ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(value.u < (uintmax_t)ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(value.u < (uintmax_t)ct->lower_bound + || value.u > (uintmax_t)ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %lu (%02x/%" ASN_PRI_SIZE ") lb %lu ub %lu %s", + value.u, st->buf[0], st->size, + ct->lower_bound, ct->upper_bound, + inext ? "ext" : "fix"); + } else { + if(asn_INTEGER2imax(st, &value.s)) + ASN__ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(value.s < ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(value.s < ct->lower_bound + || value.s > ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %ld (%02x/%" ASN_PRI_SIZE ") lb %ld ub %ld %s", + value.s, 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) { + uintmax_t v; + /* #11.5.6 -> #11.3 */ + if(specs && specs->field_unsigned) { + if(((uintmax_t)ct->lower_bound > (uintmax_t)(ct->upper_bound) + || (value.u < (uintmax_t)ct->lower_bound)) + || (value.u > (uintmax_t)ct->upper_bound)) { + ASN_DEBUG("Value %lu to-be-encoded is outside the bounds [%lu, %lu]!", + value.u, ct->lower_bound, ct->upper_bound); + ASN__ENCODE_FAILED; + } + v = value.u - (uintmax_t)ct->lower_bound; + } else { + if(per_imax_range_rebase(value.s, ct->lower_bound, ct->upper_bound, &v)) { + ASN__ENCODE_FAILED; + } + } + ASN_DEBUG("Encoding integer %lu with range %d bits", + v, ct->range_bits); + 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); +} diff --git a/e2ap/lib/INTEGER_xer.c b/e2ap/lib/INTEGER_xer.c new file mode 100644 index 0000000..4f21c86 --- /dev/null +++ b/e2ap/lib/INTEGER_xer.c @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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_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); +} diff --git a/e2ap/lib/InitiatingMessage.c b/e2ap/lib/InitiatingMessage.c index 6a6bfdb..9bd0c88 100644 --- a/e2ap/lib/InitiatingMessage.c +++ b/e2ap/lib/InitiatingMessage.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-PDU-Descriptions-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "elementryProcedureDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "InitiatingMessage.h" @@ -17,14 +17,20 @@ 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_id_E2nodeConfigurationUpdate = 10; 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_ErrorIndication = 2; +static const long asn_VAL_7_id_E2connectionUpdate = 11; +static const long asn_VAL_7_reject = 0; +static const long asn_VAL_8_id_Reset = 3; +static const long asn_VAL_8_reject = 0; +static const long asn_VAL_9_id_RICindication = 5; static const long asn_VAL_9_ignore = 1; +static const long asn_VAL_10_id_RICserviceQuery = 6; +static const long asn_VAL_10_ignore = 1; +static const long asn_VAL_11_id_ErrorIndication = 2; +static const long asn_VAL_11_ignore = 1; +static const long asn_VAL_12_id_RICsubscriptionDeleteRequired = 12; +static const long asn_VAL_12_ignore = 1; static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { { "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionRequest }, { "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionResponse }, @@ -51,29 +57,44 @@ static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { { "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2setupFailure }, { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_5_id_E2setup }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_reject }, + { "&InitiatingMessage", aioc__type, &asn_DEF_E2nodeConfigurationUpdate }, + { "&SuccessfulOutcome", aioc__type, &asn_DEF_E2nodeConfigurationUpdateAcknowledge }, + { "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2nodeConfigurationUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_E2nodeConfigurationUpdate }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject }, + { "&InitiatingMessage", aioc__type, &asn_DEF_E2connectionUpdate }, + { "&SuccessfulOutcome", aioc__type, &asn_DEF_E2connectionUpdateAcknowledge }, + { "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2connectionUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_E2connectionUpdate }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_reject }, { "&InitiatingMessage", aioc__type, &asn_DEF_ResetRequest }, { "&SuccessfulOutcome", aioc__type, &asn_DEF_ResetResponse }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_Reset }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_Reset }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_reject }, { "&InitiatingMessage", aioc__type, &asn_DEF_RICindication }, { "&SuccessfulOutcome", }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_RICindication }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_ignore }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_RICindication }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore }, { "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceQuery }, { "&SuccessfulOutcome", }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_RICserviceQuery }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_ignore }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_10_id_RICserviceQuery }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_10_ignore }, { "&InitiatingMessage", aioc__type, &asn_DEF_ErrorIndication }, { "&SuccessfulOutcome", }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_ErrorIndication }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore } + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_11_id_ErrorIndication }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_11_ignore }, + { "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionDeleteRequired }, + { "&SuccessfulOutcome", }, + { "&UnsuccessfulOutcome", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_12_id_RICsubscriptionDeleteRequired }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_12_ignore } }; static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = { - { 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } + { 12, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } }; static int memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, @@ -89,7 +110,7 @@ memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *spt value = *(const long *)sptr; - if((value >= 0 && value <= 255)) { + if((value >= 0L && value <= 255L)) { /* Constraint check succeeded */ return 0; } else { @@ -192,37 +213,57 @@ memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); } +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_procedureCode_constr_2 CC_NOTUSED = { { 1, 1 } /* (0..255) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_value_4[] = { { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.RICsubscriptionRequest), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICsubscriptionRequest, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICsubscriptionRequest" }, @@ -231,7 +272,15 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_RICsubscriptionDeleteRequest, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICsubscriptionDeleteRequest" }, @@ -240,7 +289,15 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_RICserviceUpdate, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICserviceUpdate" }, @@ -249,7 +306,15 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_RICcontrolRequest, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICcontrolRequest" }, @@ -258,16 +323,66 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_E2setupRequest, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "E2setupRequest" }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.E2nodeConfigurationUpdate), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeConfigurationUpdate, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeConfigurationUpdate" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.E2connectionUpdate), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2connectionUpdate, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2connectionUpdate" + }, { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.ResetRequest), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_ResetRequest, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ResetRequest" }, @@ -276,7 +391,15 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_RICindication, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICindication" }, @@ -285,7 +408,15 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_RICserviceQuery, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICserviceQuery" }, @@ -294,21 +425,49 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_ErrorIndication, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ErrorIndication" }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.RICsubscriptionDeleteRequired), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteRequired, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RICsubscriptionDeleteRequired" + }, }; 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 } /* ErrorIndication */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 11 }, /* RICsubscriptionRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 10 }, /* RICsubscriptionDeleteRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 9 }, /* RICserviceUpdate */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 8 }, /* RICcontrolRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 7 }, /* E2setupRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 6 }, /* E2nodeConfigurationUpdate */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 6, -6, 5 }, /* E2connectionUpdate */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 7, -7, 4 }, /* ResetRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 8, -8, 3 }, /* RICindication */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 9, -9, 2 }, /* RICserviceQuery */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 10, -10, 1 }, /* ErrorIndication */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 11, -11, 0 } /* RICsubscriptionDeleteRequired */ }; static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { sizeof(struct InitiatingMessage__value), @@ -316,7 +475,7 @@ static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { offsetof(struct InitiatingMessage__value, present), sizeof(((struct InitiatingMessage__value *)0)->present), asn_MAP_value_tag2el_4, - 9, /* Count of tags in the map */ + 12, /* Count of tags in the map */ 0, 0, -1 /* Extensions start */ }; @@ -329,9 +488,17 @@ asn_TYPE_descriptor_t asn_DEF_value_4 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, 0, OPEN_TYPE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, asn_MBR_value_4, - 9, /* Elements count */ + 12, /* Elements count */ &asn_SPC_value_specs_4 /* Additional specs */ }; @@ -341,7 +508,15 @@ asn_TYPE_member_t asn_MBR_InitiatingMessage_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_ProcedureCode, 0, - { &asn_OER_memb_procedureCode_constr_2, &asn_PER_memb_procedureCode_constr_2, memb_procedureCode_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_procedureCode_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_procedureCode_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_procedureCode_constraint_1 + }, 0, 0, /* No default value */ "procedureCode" }, @@ -350,7 +525,15 @@ asn_TYPE_member_t asn_MBR_InitiatingMessage_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_Criticality, select_InitiatingMessage_criticality_type, - { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_1 + }, 0, 0, /* No default value */ "criticality" }, @@ -359,7 +542,15 @@ asn_TYPE_member_t asn_MBR_InitiatingMessage_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_value_4, select_InitiatingMessage_value_type, - { &asn_OER_memb_value_constr_4, &asn_PER_memb_value_constr_4, memb_value_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_4, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_4, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_1 + }, 0, 0, /* No default value */ "value" }, @@ -390,7 +581,15 @@ asn_TYPE_descriptor_t asn_DEF_InitiatingMessage = { asn_DEF_InitiatingMessage_tags_1, /* Same as above */ sizeof(asn_DEF_InitiatingMessage_tags_1) /sizeof(asn_DEF_InitiatingMessage_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_InitiatingMessage_1, 3, /* Elements count */ &asn_SPC_InitiatingMessage_specs_1 /* Additional specs */ diff --git a/e2sm/lib/GNB-CU-UP-Name.c b/e2ap/lib/MMEname.c similarity index 61% rename from e2sm/lib/GNB-CU-UP-Name.c rename to e2ap/lib/MMEname.c index 59dd641..d5a8da7 100644 --- a/e2sm/lib/GNB-CU-UP-Name.c +++ b/e2ap/lib/MMEname.c @@ -1,11 +1,11 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ -#include "GNB-CU-UP-Name.h" +#include "MMEname.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, /* */ @@ -40,7 +40,7 @@ static int check_permitted_alphabet_1(const void *sptr) { } int -GNB_CU_UP_Name_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, +MMEname_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; @@ -54,7 +54,7 @@ GNB_CU_UP_Name_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size >= 1 && size <= 150) + if((size >= 1UL && size <= 150UL) && !check_permitted_alphabet_1(st)) { /* Constraint check succeeded */ return 0; @@ -66,12 +66,12 @@ GNB_CU_UP_Name_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, } } -static int asn_PER_MAP_GNB_CU_UP_Name_1_v2c(unsigned int value) { +static int asn_PER_MAP_MMEname_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) { +static int asn_PER_MAP_MMEname_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]; @@ -80,29 +80,41 @@ static int asn_PER_MAP_GNB_CU_UP_Name_1_c2v(unsigned int 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 = { +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MMEname_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 = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_MMEname_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 */ + asn_PER_MAP_MMEname_1_v2c, /* Value to PER code map */ + asn_PER_MAP_MMEname_1_c2v /* PER code to value map */ }; -static const ber_tlv_tag_t asn_DEF_GNB_CU_UP_Name_tags_1[] = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static const ber_tlv_tag_t asn_DEF_MMEname_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_TYPE_descriptor_t asn_DEF_MMEname = { + "MMEname", + "MMEname", &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 }, + asn_DEF_MMEname_tags_1, + sizeof(asn_DEF_MMEname_tags_1) + /sizeof(asn_DEF_MMEname_tags_1[0]), /* 1 */ + asn_DEF_MMEname_tags_1, /* Same as above */ + sizeof(asn_DEF_MMEname_tags_1) + /sizeof(asn_DEF_MMEname_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MMEname_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MMEname_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + MMEname_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2ap/lib/NGENB-DU-ID.c b/e2ap/lib/NGENB-DU-ID.c new file mode 100644 index 0000000..549c14b --- /dev/null +++ b/e2ap/lib/NGENB-DU-ID.c @@ -0,0 +1,82 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "NGENB-DU-ID.h" + +int +NGENB_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 >= 0L && value <= 68719476735L)) { + /* 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. + */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_NGENB_DU_ID_constr_1 CC_NOTUSED = { + { 8, 1 } /* (0..68719476735) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_NGENB_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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static const ber_tlv_tag_t asn_DEF_NGENB_DU_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_NGENB_DU_ID = { + "NGENB-DU-ID", + "NGENB-DU-ID", + &asn_OP_INTEGER, + asn_DEF_NGENB_DU_ID_tags_1, + sizeof(asn_DEF_NGENB_DU_ID_tags_1) + /sizeof(asn_DEF_NGENB_DU_ID_tags_1[0]), /* 1 */ + asn_DEF_NGENB_DU_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_NGENB_DU_ID_tags_1) + /sizeof(asn_DEF_NGENB_DU_ID_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_NGENB_DU_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_NGENB_DU_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NGENB_DU_ID_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/e2ap/lib/NativeEnumerated.c b/e2ap/lib/NativeEnumerated.c index 50ffb1d..aee450c 100644 --- a/e2ap/lib/NativeEnumerated.c +++ b/e2ap/lib/NativeEnumerated.c @@ -16,352 +16,93 @@ * NativeEnumerated basic type description. */ static const ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) + (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, + NativeInteger_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + NativeInteger_print, #else - NativeEnumerated_decode_oer, - NativeEnumerated_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + NativeInteger_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + NativeInteger_decode_ber, + NativeInteger_encode_der, #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + NativeInteger_decode_xer, + NativeEnumerated_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + NativeEnumerated_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + NativeEnumerated_decode_oer, + NativeEnumerated_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + NativeEnumerated_decode_uper, + NativeEnumerated_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + NativeEnumerated_decode_aper, + NativeEnumerated_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + NativeEnumerated_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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 */ + "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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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 +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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); + 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; } +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ diff --git a/e2ap/lib/NativeEnumerated_aper.c b/e2ap/lib/NativeEnumerated_aper.c new file mode 100644 index 0000000..5c4c256 --- /dev/null +++ b/e2ap/lib/NativeEnumerated_aper.c @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; + 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->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 = %zu Padding bits = %d", + td->name, pd->moved, padding); + ASN_DEBUG("For NativeEnumerated %s, upper bound = %llu", + td->name, (unsigned long long)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; + */ + + /* XXX handle indefinite index length > 64k */ + value = aper_get_nsnnwn(pd, 65537); + if(value < 0) ASN__DECODE_STARVED; + value += specs->extension - 1; + //if(value >= specs->map_count) + // ASN__DECODE_FAILED; + if(value >= specs->map_count) { + ASN_DEBUG("Decoded unknown index value %s = %ld", td->name, value); + /* unknown index. Workaround => set the first enumeration value */ + *native = specs->value2enum[0].nat_value; + return rval; + } + } + + *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; + int inext = 0, range_bits = 1; + 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->range_bits >= 0) { + int cmpWith = specs->extension + ? specs->extension - 1 : specs->map_count; + if(value >= cmpWith) + inext = 1; + } + if(ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) range_bits = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + + if(range_bits && 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(aper_put_nsnnwn(po, + ct->upper_bound - ct->lower_bound + 1, + value - (inext ? (specs->extension - 1) : 0))) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/e2ap/lib/NativeEnumerated_jer.c b/e2ap/lib/NativeEnumerated_jer.c new file mode 100644 index 0000000..046afe9 --- /dev/null +++ b/e2ap/lib/NativeEnumerated_jer.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +NativeEnumerated_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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; + } +} diff --git a/e2ap/lib/NativeEnumerated_oer.c b/e2ap/lib/NativeEnumerated_oer.c index ee3c189..52dbcb8 100644 --- a/e2ap/lib/NativeEnumerated_oer.c +++ b/e2ap/lib/NativeEnumerated_oer.c @@ -3,11 +3,8 @@ * 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) { @@ -145,5 +142,3 @@ NativeEnumerated_encode_oer(const asn_TYPE_descriptor_t *td, ASN__ENCODED_OK(er); } } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2ap/lib/NativeEnumerated_uper.c b/e2ap/lib/NativeEnumerated_uper.c new file mode 100644 index 0000000..e2f932a --- /dev/null +++ b/e2ap/lib/NativeEnumerated_uper.c @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; + 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->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; +} + +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; + 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->range_bits >= 0) { + int cmpWith = specs->extension + ? specs->extension - 1 : specs->map_count; + if(value >= cmpWith) + inext = 1; + } + 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; + } + + 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/e2ap/lib/NativeEnumerated_xer.c b/e2ap/lib/NativeEnumerated_xer.c new file mode 100644 index 0000000..e8d6d0d --- /dev/null +++ b/e2ap/lib/NativeEnumerated_xer.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; + } +} diff --git a/e2ap/lib/NativeInteger.c b/e2ap/lib/NativeInteger.c index 316e872..f0309b0 100644 --- a/e2ap/lib/NativeInteger.c +++ b/e2ap/lib/NativeInteger.c @@ -17,408 +17,84 @@ * NativeInteger basic type description. */ static const ber_tlv_tag_t asn_DEF_NativeInteger_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) + (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, + NativeInteger_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + NativeInteger_print, #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, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + NativeInteger_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + NativeInteger_decode_ber, + NativeInteger_encode_der, #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + NativeInteger_decode_xer, + NativeInteger_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + NativeInteger_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + NativeInteger_decode_oer, /* OER decoder */ + NativeInteger_encode_oer, /* Canonical OER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + NativeInteger_decode_uper, /* Unaligned PER decoder */ + NativeInteger_encode_uper, /* Unaligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + NativeInteger_decode_aper, /* Aligned PER decoder */ + NativeInteger_encode_aper, /* Aligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + NativeInteger_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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 */ + "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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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) { @@ -474,77 +150,3 @@ NativeInteger_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const v 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/e2ap/lib/NativeInteger_aper.c b/e2ap/lib/NativeInteger_aper.c new file mode 100644 index 0000000..1d13070 --- /dev/null +++ b/e2ap/lib/NativeInteger_aper.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2ap/lib/NativeInteger_ber.c b/e2ap/lib/NativeInteger_ber.c new file mode 100644 index 0000000..ed68362 --- /dev/null +++ b/e2ap/lib/NativeInteger_ber.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * 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 occurred, 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; +} diff --git a/e2ap/lib/NativeInteger_jer.c b/e2ap/lib/NativeInteger_jer.c new file mode 100644 index 0000000..f48f8ec --- /dev/null +++ b/e2ap/lib/NativeInteger_jer.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +NativeInteger_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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); +} diff --git a/e2ap/lib/NativeInteger_oer.c b/e2ap/lib/NativeInteger_oer.c index 411413a..4e90046 100644 --- a/e2ap/lib/NativeInteger_oer.c +++ b/e2ap/lib/NativeInteger_oer.c @@ -3,11 +3,8 @@ * 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, @@ -95,5 +92,3 @@ NativeInteger_encode_oer(const asn_TYPE_descriptor_t *td, return er; } } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2ap/lib/NativeInteger_print.c b/e2ap/lib/NativeInteger_print.c new file mode 100644 index 0000000..0602e0d --- /dev/null +++ b/e2ap/lib/NativeInteger_print.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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; + } +} diff --git a/e2ap/lib/NativeInteger_rfill.c b/e2ap/lib/NativeInteger_rfill.c new file mode 100644 index 0000000..0e2cee8 --- /dev/null +++ b/e2ap/lib/NativeInteger_rfill.c @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 { + 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; +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + const asn_per_constraints_t *ct; + + 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); + } + } +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + } + + *sptr = st; + *st = value; + return result_ok; +} diff --git a/e2ap/lib/NativeInteger_uper.c b/e2ap/lib/NativeInteger_uper.c new file mode 100644 index 0000000..4fc4ba1 --- /dev/null +++ b/e2ap/lib/NativeInteger_uper.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2ap/lib/NativeInteger_xer.c b/e2ap/lib/NativeInteger_xer.c new file mode 100644 index 0000000..18ec59a --- /dev/null +++ b/e2ap/lib/NativeInteger_xer.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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); +} diff --git a/e2ap/lib/OBJECT_IDENTIFIER.c b/e2ap/lib/OBJECT_IDENTIFIER.c new file mode 100644 index 0000000..5cf2d60 --- /dev/null +++ b/e2ap/lib/OBJECT_IDENTIFIER.c @@ -0,0 +1,532 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include +#include /* for CHAR_BIT */ +#include +#include + +/* + * OBJECT IDENTIFIER basic type description. + */ +static const ber_tlv_tag_t asn_DEF_OBJECT_IDENTIFIER_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)) +}; +asn_TYPE_operation_t asn_OP_OBJECT_IDENTIFIER = { + ASN__PRIMITIVE_TYPE_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OBJECT_IDENTIFIER_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, /* Implemented in terms of a string comparison */ +#if !defined(ASN_DISABLE_BER_SUPPORT) + ber_decode_primitive, + der_encode_primitive, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OBJECT_IDENTIFIER_decode_xer, + OBJECT_IDENTIFIER_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OBJECT_IDENTIFIER_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + OBJECT_IDENTIFIER_decode_oer, + OBJECT_IDENTIFIER_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, + OCTET_STRING_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + OBJECT_IDENTIFIER_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = { + "OBJECT IDENTIFIER", + "OBJECT_IDENTIFIER", + &asn_OP_OBJECT_IDENTIFIER, + asn_DEF_OBJECT_IDENTIFIER_tags, + sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) + / sizeof(asn_DEF_OBJECT_IDENTIFIER_tags[0]), + asn_DEF_OBJECT_IDENTIFIER_tags, /* Same as above */ + sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) + / sizeof(asn_DEF_OBJECT_IDENTIFIER_tags[0]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OBJECT_IDENTIFIER_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +int +OBJECT_IDENTIFIER_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, + void *app_key) { + const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; + + if(st && st->buf) { + if(st->size < 1) { + ASN__CTFAIL(app_key, td, sptr, + "%s: at least one numerical value " + "expected (%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 ssize_t +OBJECT_IDENTIFIER_get_first_arcs(const uint8_t *arcbuf, size_t arcbuf_len, + asn_oid_arc_t *arc0, asn_oid_arc_t *arc1) { + asn_oid_arc_t value; + + ssize_t rd = OBJECT_IDENTIFIER_get_single_arc(arcbuf, arcbuf_len, &value); + if(rd <= 0) return rd; + + if(value >= 80) { + *arc0 = 2; + *arc1 = value - 80; + } else if(value >= 40) { + *arc0 = 1; + *arc1 = value - 40; + } else { + *arc0 = 0; + *arc1 = value; + } + + return rd; +} + +ssize_t +OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, size_t arcbuf_len, + asn_oid_arc_t *ret_value) { + const uint8_t *b = arcbuf; + const uint8_t *arcend = arcbuf + arcbuf_len; /* End of arc */ + + if(arcbuf == arcend) { + return 0; + } else { + asn_oid_arc_t accum; + asn_oid_arc_t upper_limit = (ASN_OID_ARC_MAX >> 7); + /* When the value reaches "upper_limit", it can take */ + /* at most one more digit. If it exceeds "upper_limit" */ + /* but there are more digits - it's an Overflow condition */ + /* Gather all bits into the accumulator */ + for(accum = 0; b < arcend; b++) { + accum = (accum << 7) | (*b & ~0x80); + if((*b & 0x80) == 0) { // no more digits + if(accum <= ASN_OID_ARC_MAX) { + *ret_value = accum; + return 1 + (b - arcbuf); + } else { + errno = ERANGE; /* Overflow */ + return -1; + } + } else { // to make sure we aren't wrapping around + if(accum > upper_limit) { + errno = ERANGE; /* Overflow */ + return -1; + } + } + } + errno = EINVAL; + return -1; + } + +} + +ssize_t +OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st, + asn_app_consume_bytes_f *cb, void *app_key) { + char scratch[32]; + asn_oid_arc_t arc0 = 0; + asn_oid_arc_t arc1 = 0; + size_t produced = 0; + size_t off = 0; + ssize_t rd; + int ret; + + rd = OBJECT_IDENTIFIER_get_first_arcs(st->buf, st->size, &arc0, &arc1); + if(rd <= 0) { + return -1; + } + + ret = snprintf(scratch, sizeof(scratch), "%"PRIu32".%"PRIu32, arc0, arc1); + if(ret >= (ssize_t)sizeof(scratch)) { + return -1; + } + produced += ret; + if(cb(scratch, ret, app_key) < 0) + return -1; + + for(off = rd; ; ) { + asn_oid_arc_t arc; + rd = OBJECT_IDENTIFIER_get_single_arc(st->buf + off, st->size - off, + &arc); + if(rd < 0) { + return -1; + } else if(rd == 0) { + /* No more arcs. */ + break; + } else { + off += rd; + assert(off <= st->size); + ret = snprintf(scratch, sizeof(scratch), ".%" PRIu32, arc); + if(ret >= (ssize_t)sizeof(scratch)) { + return -1; + } + produced += ret; + if(cb(scratch, ret, app_key) < 0) return -1; + } + } + + if(off != st->size) { + ASN_DEBUG("Could not scan to the end of Object Identifier"); + return -1; + } + + return produced; +} + +ssize_t +OBJECT_IDENTIFIER_get_arcs(const OBJECT_IDENTIFIER_t *st, asn_oid_arc_t *arcs, + size_t arc_slots) { + asn_oid_arc_t arc0 = 0; + asn_oid_arc_t arc1 = 0; + size_t num_arcs = 0; + size_t off; + ssize_t rd; + + if(!st || !st->buf) { + errno = EINVAL; + return -1; + } + + rd = OBJECT_IDENTIFIER_get_first_arcs(st->buf, st->size, &arc0, &arc1); + if(rd <= 0) { + return -1; + } + num_arcs = 2; + switch(arc_slots) { + default: + case 2: + arcs[1] = arc1; + /* Fall through */ + case 1: + arcs[0] = arc0; + /* Fall through */ + case 0: + break; + } + + for(off = rd; ; ) { + asn_oid_arc_t arc; + rd = OBJECT_IDENTIFIER_get_single_arc(st->buf + off, st->size - off, + &arc); + if(rd < 0) { + return -1; + } else if(rd == 0) { + /* No more arcs. */ + break; + } else { + off += rd; + if(num_arcs < arc_slots) { + arcs[num_arcs] = arc; + } + num_arcs++; + } + } + + if(off != st->size) { + return -1; + } + + return num_arcs; +} + + +/* + * Save the single value as an object identifier arc. + */ +ssize_t +OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, size_t arcbuf_len, + asn_oid_arc_t value) { + /* + * The following conditions must hold: + * assert(arcbuf); + */ + uint8_t scratch[((sizeof(value) * CHAR_BIT + 6) / 7)]; + uint8_t *scratch_end = &scratch[sizeof(scratch)-1]; + uint8_t *b; + size_t result_len; + uint8_t mask; + + for(b = scratch_end, mask = 0; ; mask = 0x80, b--) { + *b = mask | (value & 0x7f); + value >>= 7; + if(!value) { + break; + } + } + + result_len = (scratch_end - b) + 1; + + if(result_len > arcbuf_len) { + return -1; + } + + memcpy(arcbuf, b, result_len); + + return result_len; +} + +int +OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *st, const asn_oid_arc_t *arcs, + size_t arc_slots) { + uint8_t *buf; + uint8_t *bp; + ssize_t wrote; + asn_oid_arc_t arc0; + asn_oid_arc_t arc1; + size_t size; + size_t i; + + if(!st || !arcs || arc_slots < 2) { + errno = EINVAL; + return -1; + } + + arc0 = arcs[0]; + arc1 = arcs[1]; + + if(arc0 <= 1) { + if(arc1 >= 40) { + /* 8.19.4: At most 39 subsequent values (including 0) */ + errno = ERANGE; + return -1; + } + } else if(arc0 == 2) { + if(arc1 > ASN_OID_ARC_MAX - 80) { + errno = ERANGE; + return -1; + } + } else if(arc0 > 2) { + /* 8.19.4: Only three values are allocated from the root node */ + errno = ERANGE; + return -1; + } + + /* + * After above tests it is known that the value of arc0 is completely + * trustworthy (0..2). However, the arc1's value is still meaningless. + */ + + /* + * Roughly estimate the maximum size necessary to encode these arcs. + * This estimation implicitly takes in account the following facts, + * that cancel each other: + * * the first two arcs are encoded in a single value. + * * the first value may require more space (+1 byte) + * * the value of the first arc which is in range (0..2) + */ + size = ((sizeof(asn_oid_arc_t) * CHAR_BIT + 6) / 7) * arc_slots; + bp = buf = (uint8_t *)MALLOC(size + 1); + if(!buf) { + /* ENOMEM */ + return -1; + } + + wrote = OBJECT_IDENTIFIER_set_single_arc(bp, size, arc0 * 40 + arc1); + if(wrote <= 0) { + FREEMEM(buf); + return -1; + } + assert((size_t)wrote <= size); + bp += wrote; + size -= wrote; + + for(i = 2; i < arc_slots; i++) { + wrote = OBJECT_IDENTIFIER_set_single_arc(bp, size, arcs[i]); + if(wrote <= 0) { + FREEMEM(buf); + return -1; + } + assert((size_t)wrote <= size); + bp += wrote; + size -= wrote; + } + + /* + * Replace buffer. + */ + st->size = bp - buf; + bp = st->buf; + st->buf = buf; + st->buf[st->size] = '\0'; + if(bp) FREEMEM(bp); + + return 0; +} + +ssize_t +OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, + asn_oid_arc_t *arcs, size_t arcs_count, + const char **opt_oid_text_end) { + size_t num_arcs = 0; + const char *oid_end; + enum { + ST_LEADSPACE, + ST_TAILSPACE, + ST_AFTERVALUE, /* Next character ought to be '.' or a space */ + ST_WAITDIGITS /* Next character is expected to be a digit */ + } state = ST_LEADSPACE; + + if(!oid_text || oid_txt_length < -1 || (arcs_count && !arcs)) { + if(opt_oid_text_end) *opt_oid_text_end = oid_text; + errno = EINVAL; + return -1; + } + + if(oid_txt_length == -1) + oid_txt_length = strlen(oid_text); + +#define _OID_CAPTURE_ARC(oid_text, oid_end) \ + do { \ + const char *endp = oid_end; \ + unsigned long value; \ + switch(asn_strtoul_lim(oid_text, &endp, &value)) { \ + case ASN_STRTOX_EXTRA_DATA: \ + case ASN_STRTOX_OK: \ + if(value <= ASN_OID_ARC_MAX) { \ + if(num_arcs < arcs_count) arcs[num_arcs] = value; \ + num_arcs++; \ + oid_text = endp - 1; \ + break; \ + } \ + /* Fall through */ \ + case ASN_STRTOX_ERROR_RANGE: \ + if(opt_oid_text_end) *opt_oid_text_end = oid_text; \ + errno = ERANGE; \ + return -1; \ + case ASN_STRTOX_ERROR_INVAL: \ + case ASN_STRTOX_EXPECT_MORE: \ + if(opt_oid_text_end) *opt_oid_text_end = oid_text; \ + errno = EINVAL; \ + return -1; \ + } \ + } while(0) + + for(oid_end = oid_text + oid_txt_length; oid_text broken OID */ + return -1; + case ST_LEADSPACE: + case ST_WAITDIGITS: + _OID_CAPTURE_ARC(oid_text, oid_end); + state = ST_AFTERVALUE; + continue; + } + break; + default: + /* Unexpected symbols */ + state = ST_WAITDIGITS; + break; + } /* switch() */ + break; + } /* for() */ + + + if(opt_oid_text_end) *opt_oid_text_end = oid_text; + + /* Finalize last arc */ + switch(state) { + case ST_LEADSPACE: + return 0; /* No OID found in input data */ + case ST_WAITDIGITS: + errno = EINVAL; /* Broken OID */ + return -1; + case ST_AFTERVALUE: + case ST_TAILSPACE: + return num_arcs; + } + + errno = EINVAL; /* Broken OID */ + return -1; +} diff --git a/e2ap/lib/OBJECT_IDENTIFIER_jer.c b/e2ap/lib/OBJECT_IDENTIFIER_jer.c new file mode 100644 index 0000000..f105f03 --- /dev/null +++ b/e2ap/lib/OBJECT_IDENTIFIER_jer.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + + +asn_enc_rval_t +OBJECT_IDENTIFIER_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; + asn_enc_rval_t er = {0,0,0}; + + (void)ilevel; + (void)flags; + + if(!st || !st->buf) { + ASN__ENCODE_FAILED; + } + + er.encoded = OBJECT_IDENTIFIER__dump_body(st, cb, app_key); + if(er.encoded < 0) ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/e2ap/lib/OBJECT_IDENTIFIER_print.c b/e2ap/lib/OBJECT_IDENTIFIER_print.c new file mode 100644 index 0000000..b0c3a9e --- /dev/null +++ b/e2ap/lib/OBJECT_IDENTIFIER_print.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +int +OBJECT_IDENTIFIER_print(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, asn_app_consume_bytes_f *cb, + void *app_key) { + const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(!st || !st->buf) + return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb("{ ", 2, app_key) < 0) + return -1; + + if(OBJECT_IDENTIFIER__dump_body(st, cb, app_key) < 0) { + return -1; + } + + return (cb(" }", 2, app_key) < 0) ? -1 : 0; +} diff --git a/e2ap/lib/OBJECT_IDENTIFIER_rfill.c b/e2ap/lib/OBJECT_IDENTIFIER_rfill.c new file mode 100644 index 0000000..55093c8 --- /dev/null +++ b/e2ap/lib/OBJECT_IDENTIFIER_rfill.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Generate values from the list of interesting values, or just a random + * value up to the upper limit. + */ +static asn_oid_arc_t +OBJECT_IDENTIFIER__biased_random_arc(asn_oid_arc_t upper_bound) { + const asn_oid_arc_t values[] = {0, 1, 127, 128, 129, 254, 255, 256}; + size_t idx; + + switch(asn_random_between(0, 2)) { + case 0: + idx = asn_random_between(0, sizeof(values) / sizeof(values[0]) - 1); + if(values[idx] < upper_bound) { + return values[idx]; + } + /* Fall through */ + case 1: + return asn_random_between(0, upper_bound); + case 2: + default: + return upper_bound; + } +} + +asn_random_fill_result_t +OBJECT_IDENTIFIER_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + 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}; + OBJECT_IDENTIFIER_t *st; + asn_oid_arc_t arcs[5]; + size_t arcs_len = asn_random_between(2, 5); + size_t i; + + (void)constraints; + + if(max_length < arcs_len) return result_skipped; + + if(*sptr) { + st = *sptr; + } else { + st = CALLOC(1, sizeof(*st)); + } + + arcs[0] = asn_random_between(0, 2); + arcs[1] = OBJECT_IDENTIFIER__biased_random_arc( + arcs[0] <= 1 ? 39 : (ASN_OID_ARC_MAX - 80)); + for(i = 2; i < arcs_len; i++) { + arcs[i] = OBJECT_IDENTIFIER__biased_random_arc(ASN_OID_ARC_MAX); + } + + if(OBJECT_IDENTIFIER_set_arcs(st, arcs, arcs_len)) { + if(st != *sptr) { + ASN_STRUCT_FREE(*td, st); + } + return result_failed; + } + + *sptr = st; + + result_ok.length = st->size; + return result_ok; +} diff --git a/e2ap/lib/OBJECT_IDENTIFIER_xer.c b/e2ap/lib/OBJECT_IDENTIFIER_xer.c new file mode 100644 index 0000000..706e51a --- /dev/null +++ b/e2ap/lib/OBJECT_IDENTIFIER_xer.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +static enum xer_pbd_rval +OBJECT_IDENTIFIER__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, + const void *chunk_buf, size_t chunk_size) { + OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)sptr; + const char *chunk_end = (const char *)chunk_buf + chunk_size; + const char *endptr; + asn_oid_arc_t s_arcs[10]; + asn_oid_arc_t *arcs = s_arcs; + ssize_t num_arcs; + ssize_t ret; + + (void)td; + + num_arcs = OBJECT_IDENTIFIER_parse_arcs( + (const char *)chunk_buf, chunk_size, arcs, + sizeof(s_arcs) / sizeof(s_arcs[0]), &endptr); + if(num_arcs < 0) { + /* Expecting more than zero arcs */ + return XPBD_BROKEN_ENCODING; + } else if(num_arcs == 0) { + return XPBD_NOT_BODY_IGNORE; + } + (void)chunk_end; + assert(endptr == chunk_end); + + if((size_t)num_arcs > sizeof(s_arcs)/sizeof(s_arcs[0])) { + arcs = (asn_oid_arc_t *)MALLOC(num_arcs * sizeof(asn_oid_arc_t)); + if(!arcs) return XPBD_SYSTEM_FAILURE; + ret = OBJECT_IDENTIFIER_parse_arcs((const char *)chunk_buf, chunk_size, + arcs, num_arcs, &endptr); + if(ret != num_arcs) + return XPBD_SYSTEM_FAILURE; /* assert?.. */ + } + + /* + * Convert arcs into BER representation. + */ + ret = OBJECT_IDENTIFIER_set_arcs(st, arcs, num_arcs); + if(arcs != s_arcs) FREEMEM(arcs); + + return ret ? XPBD_SYSTEM_FAILURE : XPBD_BODY_CONSUMED; +} + +asn_dec_rval_t +OBJECT_IDENTIFIER_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(OBJECT_IDENTIFIER_t), opt_mname, + buf_ptr, size, OBJECT_IDENTIFIER__xer_body_decode); +} + +asn_enc_rval_t +OBJECT_IDENTIFIER_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 OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; + asn_enc_rval_t er = {0,0,0}; + + (void)ilevel; + (void)flags; + + if(!st || !st->buf) { + ASN__ENCODE_FAILED; + } + + er.encoded = OBJECT_IDENTIFIER__dump_body(st, cb, app_key); + if(er.encoded < 0) ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/e2ap/lib/OCTET_STRING.c b/e2ap/lib/OCTET_STRING.c index ae34c96..d0bdead 100644 --- a/e2ap/lib/OCTET_STRING.c +++ b/e2ap/lib/OCTET_STRING.c @@ -5,2088 +5,105 @@ */ #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_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 + 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, + OCTET_STRING_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OCTET_STRING_print, /* OCTET STRING generally means a non-ascii sequence */ +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, + OCTET_STRING_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_hex, + OCTET_STRING_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_encode_jer, #else - OCTET_STRING_decode_oer, - OCTET_STRING_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + OCTET_STRING_decode_oer, + OCTET_STRING_encode_oer, #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OCTET_STRING_decode_uper, /* Unaligned PER decoder */ + OCTET_STRING_encode_uper, /* Unaligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, /* Aligned PER decoder */ + OCTET_STRING_encode_aper, /* Aligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + OCTET_STRING_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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 + "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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_no_constraint + }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs }; -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) { @@ -2094,18 +111,29 @@ OCTET_STRING_free(const asn_TYPE_descriptor_t *td, void *sptr, 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); - } +#if !defined(ASN_DISABLE_BER_SUPPORT) + const asn_OCTET_STRING_specifics_t *specs; + asn_struct_ctx_t *ctx; + + 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); + + /* + * Remove decode-time stack. + */ + struct _stack *stck; + stck = (struct _stack *)ctx->ptr; + if(stck) { + while(stck->tail) { + struct _stack_el *sel = stck->tail; + stck->tail = sel->prev; + FREEMEM(sel); + } + FREEMEM(stck); + } +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ switch(method) { case ASFM_FREE_EVERYTHING: @@ -2191,6 +219,7 @@ OCTET_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const OCTET_STRING_t *a = aptr; const OCTET_STRING_t *b = bptr; + (void)specs; assert(!specs || specs->subvariant != ASN_OSUBV_BIT); if(a && b) { @@ -2218,194 +247,137 @@ OCTET_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, } -/* - * 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 !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ } - 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); + 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; } - } else { - rnd_len = asn_random_between(0, max_length); } - } else if(rnd_len > max_length) { - rnd_len = asn_random_between(0, max_length); + return 0; } - 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; + /* 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); } - 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; + 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; } } - 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]; + return 0; +} - 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; +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; } - *(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; - } + /* 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); } - st->buf = buf; - st->size = unit_bytes * rnd_len; + 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; + } - result_ok.length = st->size; - return result_ok; + return 0; } +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ diff --git a/e2ap/lib/OCTET_STRING_aper.c b/e2ap/lib/OCTET_STRING_aper.c new file mode 100644 index 0000000..0373fe6 --- /dev/null +++ b/e2ap/lib/OCTET_STRING_aper.c @@ -0,0 +1,414 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ + +#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_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_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 %lld .. %lld bits %d", + csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible", + (long long int)csiz->lower_bound, (long long int)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; + /* X.691 #16 NOTE 1 for fixed length (<= 16 bits) strings */ + if (st->size > 2 || csiz->range_bits != 0) { + if (aper_get_align(pd) < 0) + RETURN(RC_FAIL); + } + if(bpc) { + ASN_DEBUG("Decoding OCTET STRING size %lld", + (long long int)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 %lld", + (long long int)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; + + repeat = 0; + /* Get the PER length */ + if (csiz->upper_bound - csiz->lower_bound == 0) + /* Indefinite length case */ + raw_len = aper_get_length(pd, -1, -1, csiz->effective_bits, &repeat); + else + raw_len = aper_get_length(pd, csiz->lower_bound, csiz->upper_bound, + csiz->effective_bits, &repeat); + 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); + + /* X.691 #16 NOTE 1 for fixed length (<=16 bits) strings */ + if ((raw_len > 2) || (csiz->upper_bound > 2) || (csiz->range_bits != 0)) + { + 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" + " (%lld..%lld, effective %d)%s", + td->name, sizeinunits, unit_bits, + (long long int)csiz->lower_bound, + (long long int)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 %zu bytes (%lld), length in %d bits", + st->size, (long long int)(sizeinunits - csiz->lower_bound), + csiz->effective_bits); + if (csiz->effective_bits > 0) { + ret = aper_put_length(po, csiz->lower_bound, csiz->upper_bound, + sizeinunits - csiz->lower_bound, NULL); + if(ret < 0) ASN__ENCODE_FAILED; + } + if (csiz->effective_bits > 0 || (st->size > 2) + || (csiz->upper_bound > (2 * 8 / unit_bits)) + || (csiz->range_bits != 0)) + { /* X.691 #16 NOTE 1 for fixed length (<=16 bits) strings*/ + 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 %zu bytes", st->size); + + if(sizeinunits == 0) { + if(aper_put_length(po, -1, -1, 0, NULL) < 0) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + buf = st->buf; + while(sizeinunits) { + int need_eom = 0; + ssize_t maySave = aper_put_length(po, -1, -1, sizeinunits, &need_eom); + + 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); + if(need_eom && (aper_put_length(po, -1, -1, 0, NULL) < 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + } + + ASN__ENCODED_OK(er); +} diff --git a/e2ap/lib/OCTET_STRING_ber.c b/e2ap/lib/OCTET_STRING_ber.c new file mode 100644 index 0000000..9530eae --- /dev/null +++ b/e2ap/lib/OCTET_STRING_ber.c @@ -0,0 +1,525 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ + +#undef _CH_PHASE +#define _CH_PHASE(ctx, inc) do {\ + if(ctx->phase == 0)\ + ctx->context = 0;\ + ctx->phase += inc;\ + } while(0) + +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) _CH_PHASE(ctx, +1) +#undef PREV_PHASE +#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 acquired skill everywhere afterwards. + * No, I am not going to explain what the following stuff is. + */ +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; +} diff --git a/e2ap/lib/OCTET_STRING_jer.c b/e2ap/lib/OCTET_STRING_jer.c new file mode 100644 index 0000000..d744cc3 --- /dev/null +++ b/e2ap/lib/OCTET_STRING_jer.c @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ + +asn_enc_rval_t +OCTET_STRING_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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; + ASN__CALLBACK("\"", 1); + for(i = 0; buf < end; buf++, i++) { + if(!(i % 16) && (i || st->size > 16)) { + ASN__CALLBACK(scratch, p-scratch); + p = scratch; + } + *p++ = h2c[(*buf >> 4) & 0x0F]; + *p++ = h2c[*buf & 0x0F]; + } + if(p - scratch) { + ASN__CALLBACK(scratch, p-scratch); /* Dump the rest */ + } + ASN__CALLBACK("\"", 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +static const struct OCTET_STRING__jer_escape_table_s { + const char *string; + int size; +} OCTET_STRING__jer_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"), /* > */ +}; + +asn_enc_rval_t +OCTET_STRING_encode_jer_utf8(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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__jer_escape_table) + / sizeof(OCTET_STRING__jer_escape_table[0]) + && (s_len = OCTET_STRING__jer_escape_table[ch].size)) { + if(((buf - ss) && cb(ss, buf - ss, app_key) < 0) + || cb(OCTET_STRING__jer_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); +} + diff --git a/e2ap/lib/OCTET_STRING_oer.c b/e2ap/lib/OCTET_STRING_oer.c index c16faea..e69d0a6 100644 --- a/e2ap/lib/OCTET_STRING_oer.c +++ b/e2ap/lib/OCTET_STRING_oer.c @@ -3,11 +3,8 @@ * 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, @@ -167,5 +164,3 @@ OCTET_STRING_encode_oer(const asn_TYPE_descriptor_t *td, ASN__ENCODED_OK(er); } } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2ap/lib/OCTET_STRING_print.c b/e2ap/lib/OCTET_STRING_print.c new file mode 100644 index 0000000..6daa33e --- /dev/null +++ b/e2ap/lib/OCTET_STRING_print.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 == NULL)? NULL : 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; + } +} diff --git a/e2ap/lib/OCTET_STRING_rfill.c b/e2ap/lib/OCTET_STRING_rfill.c new file mode 100644 index 0000000..5c8b064 --- /dev/null +++ b/e2ap/lib/OCTET_STRING_rfill.c @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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); + } +} + +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 !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 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; + } + } +#else + if(!constraints) constraints = &td->encoding_constraints; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + + 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; +} + +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 !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 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 { +#else + if(!constraints) constraints = &td->encoding_constraints; + { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + if(rnd_len > max_length) { + rnd_len = asn_random_between(0, max_length); + } + } + + return rnd_len; +} diff --git a/e2ap/lib/OCTET_STRING_uper.c b/e2ap/lib/OCTET_STRING_uper.c new file mode 100644 index 0000000..80130ca --- /dev/null +++ b/e2ap/lib/OCTET_STRING_uper.c @@ -0,0 +1,319 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ + +#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_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); +} diff --git a/e2ap/lib/OCTET_STRING_xer.c b/e2ap/lib/OCTET_STRING_xer.c new file mode 100644 index 0000000..490f362 --- /dev/null +++ b/e2ap/lib/OCTET_STRING_xer.c @@ -0,0 +1,627 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ + +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 == NULL)? NULL : 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); +} diff --git a/e2ap/lib/OPEN_TYPE.c b/e2ap/lib/OPEN_TYPE.c index a54e99c..c9afecf 100644 --- a/e2ap/lib/OPEN_TYPE.c +++ b/e2ap/lib/OPEN_TYPE.c @@ -5,505 +5,59 @@ #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 */ + OPEN_TYPE_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OPEN_TYPE_print, #else - OPEN_TYPE_decode_oer, - OPEN_TYPE_encode_oer, -#endif -#ifdef ASN_DISABLE_PER_SUPPORT - 0, 0, 0, 0, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OPEN_TYPE_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OPEN_TYPE_decode_ber, + OPEN_TYPE_encode_der, #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OPEN_TYPE_decode_xer, + OPEN_TYPE_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OPEN_TYPE_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + OPEN_TYPE_decode_oer, + OPEN_TYPE_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OPEN_TYPE_decode_uper, + OPEN_TYPE_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OPEN_TYPE_decode_aper, + OPEN_TYPE_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + 0, /* Random fill is not supported for open type */ +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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/e2ap/lib/OPEN_TYPE_aper.c b/e2ap/lib/OPEN_TYPE_aper.c new file mode 100644 index 0000000..3e2ab18 --- /dev/null +++ b/e2ap/lib/OPEN_TYPE_aper.c @@ -0,0 +1,173 @@ +/* + * 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_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); +} + + +int OPEN_TYPE_aper_is_unknown_type(const asn_TYPE_descriptor_t *td, void *sptr, const asn_TYPE_member_t *elm) { + asn_type_selector_result_t selected; + + if(!elm->type_selector) { + return 1; + } + else { + selected = elm->type_selector(td, sptr); + if(!selected.presence_index) { + return 1; + } + } + return 0; +} + +asn_dec_rval_t +OPEN_TYPE_aper_unknown_type_discard_bytes (asn_per_data_t *pd) { +#define ASN_DUMMY_BYTES 256 + unsigned char dummy[ASN_DUMMY_BYTES], *dummy_ptr = NULL; + ssize_t bytes; + int repeat; + asn_dec_rval_t rv; + + rv.consumed = 0; + rv.code = RC_FAIL; + + do { + bytes = aper_get_length(pd, -1, -1, -1, &repeat); + if (bytes > 10 * ASN_DUMMY_BYTES) + { + return rv; + } + else if (bytes > ASN_DUMMY_BYTES) + { + dummy_ptr = CALLOC(1, bytes); + if (!dummy_ptr) + return rv; + } + + per_get_many_bits(pd, (dummy_ptr ? dummy_ptr : dummy), 0, bytes << 3); + + if (dummy_ptr) + { + FREEMEM(dummy_ptr); + dummy_ptr = NULL; + } + } while (repeat); + + rv.code = RC_OK; + return rv; +#undef ASN_DUMMY_BYTES +} diff --git a/e2ap/lib/OPEN_TYPE_ber.c b/e2ap/lib/OPEN_TYPE_ber.c new file mode 100644 index 0000000..7d89480 --- /dev/null +++ b/e2ap/lib/OPEN_TYPE_ber.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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; +} diff --git a/e2ap/lib/OPEN_TYPE_oer.c b/e2ap/lib/OPEN_TYPE_oer.c index dd2f5c6..05a5eaa 100644 --- a/e2ap/lib/OPEN_TYPE_oer.c +++ b/e2ap/lib/OPEN_TYPE_oer.c @@ -5,7 +5,6 @@ #include #include #include -#include asn_dec_rval_t OPEN_TYPE_oer_get(const asn_codec_ctx_t *opt_codec_ctx, diff --git a/e2ap/lib/OPEN_TYPE_uper.c b/e2ap/lib/OPEN_TYPE_uper.c new file mode 100644 index 0000000..2f27bb9 --- /dev/null +++ b/e2ap/lib/OPEN_TYPE_uper.c @@ -0,0 +1,119 @@ +/* + * 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_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); +} diff --git a/e2ap/lib/OPEN_TYPE_xer.c b/e2ap/lib/OPEN_TYPE_xer.c new file mode 100644 index 0000000..fc38562 --- /dev/null +++ b/e2ap/lib/OPEN_TYPE_xer.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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; +} diff --git a/e2ap/lib/ObjectDescriptor.c b/e2ap/lib/ObjectDescriptor.c new file mode 100644 index 0000000..c311a92 --- /dev/null +++ b/e2ap/lib/ObjectDescriptor.c @@ -0,0 +1,91 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * ObjectDescriptor basic type description. + */ +static const ber_tlv_tag_t asn_DEF_ObjectDescriptor_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)), /* [UNIVERSAL 7] IMPLICIT ... */ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ +}; +asn_TYPE_operation_t asn_OP_ObjectDescriptor = { + OCTET_STRING_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OCTET_STRING_print_utf8, /* Treat as ASCII subset (it's not) */ +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_encode_jer_utf8, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, + 0, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, + OCTET_STRING_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + 0, /* Not supported for ObjectDescriptor */ +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor = { + "ObjectDescriptor", + "ObjectDescriptor", + &asn_OP_ObjectDescriptor, + asn_DEF_ObjectDescriptor_tags, + sizeof(asn_DEF_ObjectDescriptor_tags) + / sizeof(asn_DEF_ObjectDescriptor_tags[0]) - 1, + asn_DEF_ObjectDescriptor_tags, + sizeof(asn_DEF_ObjectDescriptor_tags) + / sizeof(asn_DEF_ObjectDescriptor_tags[0]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_unknown_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; diff --git a/e2ap/lib/PLMN-Identity.c b/e2ap/lib/PLMN-Identity.c index 24f3043..9b4453e 100644 --- a/e2ap/lib/PLMN-Identity.c +++ b/e2ap/lib/PLMN-Identity.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "PLMN-Identity.h" @@ -22,7 +22,7 @@ PLMN_Identity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size == 3)) { + if((size == 3UL)) { /* Constraint check succeeded */ return 0; } else { @@ -37,14 +37,18 @@ PLMN_Identity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_PLMN_Identity_constr_1 CC_NOTUSED = { { 0, 0 }, 3 /* (SIZE(3..3)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_PLMN_Identity_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; @@ -58,7 +62,15 @@ asn_TYPE_descriptor_t asn_DEF_PLMN_Identity = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_PLMN_Identity_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_PLMN_Identity_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + PLMN_Identity_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2ap/lib/Presence.c b/e2ap/lib/Presence.c index c32f9e0..747f053 100644 --- a/e2ap/lib/Presence.c +++ b/e2ap/lib/Presence.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP-CommonDataTypes-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "commonDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "Presence.h" @@ -11,14 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_Presence_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_Presence_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_Presence_value2enum_1[] = { { 0, 8, "optional" }, { 1, 11, "conditional" }, @@ -51,7 +55,15 @@ asn_TYPE_descriptor_t asn_DEF_Presence = { asn_DEF_Presence_tags_1, /* Same as above */ sizeof(asn_DEF_Presence_tags_1) /sizeof(asn_DEF_Presence_tags_1[0]), /* 1 */ - { &asn_OER_type_Presence_constr_1, &asn_PER_type_Presence_constr_1, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_Presence_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_Presence_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_Presence_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/PrintableString.c b/e2ap/lib/PrintableString.c new file mode 100644 index 0000000..f046f12 --- /dev/null +++ b/e2ap/lib/PrintableString.c @@ -0,0 +1,165 @@ +/*- + * 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 */ +}; +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_operation_t asn_OP_PrintableString = { + OCTET_STRING_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OCTET_STRING_print_utf8, /* ASCII subset */ +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_encode_jer_utf8, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + OCTET_STRING_decode_oer, + OCTET_STRING_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, + OCTET_STRING_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + OCTET_STRING_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_DEF_PrintableString_per_constraints, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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/e2ap/lib/ProcedureCode.c b/e2ap/lib/ProcedureCode.c index 8678080..cf2d437 100644 --- a/e2ap/lib/ProcedureCode.c +++ b/e2ap/lib/ProcedureCode.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP-CommonDataTypes-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "commonDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ProcedureCode.h" @@ -21,7 +21,7 @@ ProcedureCode_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 255)) { + if((value >= 0L && value <= 255L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,14 +36,18 @@ ProcedureCode_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_ProcedureCode_constr_1 CC_NOTUSED = { { 1, 1 } /* (0..255) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_ProcedureCode_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_ProcedureCode_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -57,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_ProcedureCode = { asn_DEF_ProcedureCode_tags_1, /* Same as above */ sizeof(asn_DEF_ProcedureCode_tags_1) /sizeof(asn_DEF_ProcedureCode_tags_1[0]), /* 1 */ - { &asn_OER_type_ProcedureCode_constr_1, &asn_PER_type_ProcedureCode_constr_1, ProcedureCode_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProcedureCode_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProcedureCode_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + ProcedureCode_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2ap/lib/ProtocolIE-Container.c b/e2ap/lib/ProtocolIE-Container.c index 05014c6..174d4da 100644 --- a/e2ap/lib/ProtocolIE-Container.c +++ b/e2ap/lib/ProtocolIE-Container.c @@ -1,870 +1,1711 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ProtocolIE-Container.h" #include "ProtocolIE-Field.h" -static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_87P0_constr_1 CC_NOTUSED = { +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P0_constr_1 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P0_constr_1 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P0_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_Container_87P1_constr_3 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P1_constr_3 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P1_constr_3 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P1_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_Container_87P2_constr_5 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P2_constr_5 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P2_constr_5 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P2_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_Container_87P3_constr_7 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P3_constr_7 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P3_constr_7 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P3_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_Container_87P4_constr_9 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P4_constr_9 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P4_constr_9 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P4_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_Container_87P5_constr_11 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P5_constr_11 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P5_constr_11 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P5_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_Container_87P6_constr_13 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P6_constr_13 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P6_constr_13 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P6_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_Container_87P7_constr_15 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P7_constr_15 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P7_constr_15 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P7_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_Container_87P8_constr_17 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P8_constr_17 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P8_constr_17 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P8_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_Container_87P9_constr_19 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P9_constr_19 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P9_constr_19 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P9_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_Container_87P10_constr_21 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P10_constr_21 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P10_constr_21 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P10_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_Container_87P11_constr_23 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P11_constr_23 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P11_constr_23 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P11_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_Container_87P12_constr_25 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P12_constr_25 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P12_constr_25 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P12_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_Container_87P13_constr_27 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P13_constr_27 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P13_constr_27 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P13_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_Container_87P14_constr_29 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P14_constr_29 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P14_constr_29 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P14_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_Container_87P15_constr_31 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P15_constr_31 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P15_constr_31 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P15_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_Container_87P16_constr_33 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P16_constr_33 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P16_constr_33 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P16_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_Container_87P17_constr_35 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P17_constr_35 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P17_constr_35 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P17_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_Container_87P18_constr_37 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P18_constr_37 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P18_constr_37 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P18_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_Container_87P19_constr_39 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P19_constr_39 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_Container_87P19_constr_39 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P19_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_Container_87P0_1[] = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P20_constr_41 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P20_constr_41 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P21_constr_43 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P21_constr_43 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P22_constr_45 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P22_constr_45 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P23_constr_47 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P23_constr_47 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P24_constr_49 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P24_constr_49 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P25_constr_51 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P25_constr_51 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ProtocolIE_Container_85P26_constr_53 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_ProtocolIE_Container_85P26_constr_53 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P0_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICsubscriptionRequest_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P0_tags_1[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P0_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P0_specs_1 = { - sizeof(struct ProtocolIE_Container_87P0), - offsetof(struct ProtocolIE_Container_87P0, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P0_specs_1 = { + sizeof(struct ProtocolIE_Container_85P0), + offsetof(struct ProtocolIE_Container_85P0, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P0 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P0 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P0_tags_1, - sizeof(asn_DEF_ProtocolIE_Container_87P0_tags_1) - /sizeof(asn_DEF_ProtocolIE_Container_87P0_tags_1[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P0_tags_1, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P0_tags_1) - /sizeof(asn_DEF_ProtocolIE_Container_87P0_tags_1[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P0_constr_1, &asn_PER_type_ProtocolIE_Container_87P0_constr_1, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P0_1, + asn_DEF_ProtocolIE_Container_85P0_tags_1, + sizeof(asn_DEF_ProtocolIE_Container_85P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_Container_85P0_tags_1[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P0_tags_1, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_Container_85P0_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P0_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P0_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P0_1, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P0_specs_1 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P0_specs_1 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P1_3[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P1_3[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICsubscriptionResponse_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P1_tags_3[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P1_tags_3[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P1_specs_3 = { - sizeof(struct ProtocolIE_Container_87P1), - offsetof(struct ProtocolIE_Container_87P1, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P1_specs_3 = { + sizeof(struct ProtocolIE_Container_85P1), + offsetof(struct ProtocolIE_Container_85P1, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P1 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P1 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P1_tags_3, - sizeof(asn_DEF_ProtocolIE_Container_87P1_tags_3) - /sizeof(asn_DEF_ProtocolIE_Container_87P1_tags_3[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P1_tags_3, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P1_tags_3) - /sizeof(asn_DEF_ProtocolIE_Container_87P1_tags_3[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P1_constr_3, &asn_PER_type_ProtocolIE_Container_87P1_constr_3, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P1_3, + asn_DEF_ProtocolIE_Container_85P1_tags_3, + sizeof(asn_DEF_ProtocolIE_Container_85P1_tags_3) + /sizeof(asn_DEF_ProtocolIE_Container_85P1_tags_3[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P1_tags_3, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P1_tags_3) + /sizeof(asn_DEF_ProtocolIE_Container_85P1_tags_3[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P1_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P1_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P1_3, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P1_specs_3 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P1_specs_3 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P2_5[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P2_5[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICsubscriptionFailure_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P2_tags_5[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P2_tags_5[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P2_specs_5 = { - sizeof(struct ProtocolIE_Container_87P2), - offsetof(struct ProtocolIE_Container_87P2, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P2_specs_5 = { + sizeof(struct ProtocolIE_Container_85P2), + offsetof(struct ProtocolIE_Container_85P2, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P2 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P2 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P2_tags_5, - sizeof(asn_DEF_ProtocolIE_Container_87P2_tags_5) - /sizeof(asn_DEF_ProtocolIE_Container_87P2_tags_5[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P2_tags_5, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P2_tags_5) - /sizeof(asn_DEF_ProtocolIE_Container_87P2_tags_5[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P2_constr_5, &asn_PER_type_ProtocolIE_Container_87P2_constr_5, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P2_5, + asn_DEF_ProtocolIE_Container_85P2_tags_5, + sizeof(asn_DEF_ProtocolIE_Container_85P2_tags_5) + /sizeof(asn_DEF_ProtocolIE_Container_85P2_tags_5[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P2_tags_5, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P2_tags_5) + /sizeof(asn_DEF_ProtocolIE_Container_85P2_tags_5[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P2_constr_5, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P2_constr_5, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P2_5, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P2_specs_5 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P2_specs_5 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P3_7[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P3_7[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICsubscriptionDeleteRequest_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P3_tags_7[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P3_tags_7[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P3_specs_7 = { - sizeof(struct ProtocolIE_Container_87P3), - offsetof(struct ProtocolIE_Container_87P3, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P3_specs_7 = { + sizeof(struct ProtocolIE_Container_85P3), + offsetof(struct ProtocolIE_Container_85P3, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P3 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P3 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P3_tags_7, - sizeof(asn_DEF_ProtocolIE_Container_87P3_tags_7) - /sizeof(asn_DEF_ProtocolIE_Container_87P3_tags_7[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P3_tags_7, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P3_tags_7) - /sizeof(asn_DEF_ProtocolIE_Container_87P3_tags_7[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P3_constr_7, &asn_PER_type_ProtocolIE_Container_87P3_constr_7, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P3_7, + asn_DEF_ProtocolIE_Container_85P3_tags_7, + sizeof(asn_DEF_ProtocolIE_Container_85P3_tags_7) + /sizeof(asn_DEF_ProtocolIE_Container_85P3_tags_7[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P3_tags_7, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P3_tags_7) + /sizeof(asn_DEF_ProtocolIE_Container_85P3_tags_7[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P3_constr_7, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P3_constr_7, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P3_7, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P3_specs_7 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P3_specs_7 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P4_9[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P4_9[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICsubscriptionDeleteResponse_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P4_tags_9[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P4_tags_9[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P4_specs_9 = { - sizeof(struct ProtocolIE_Container_87P4), - offsetof(struct ProtocolIE_Container_87P4, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P4_specs_9 = { + sizeof(struct ProtocolIE_Container_85P4), + offsetof(struct ProtocolIE_Container_85P4, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P4 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P4 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P4_tags_9, - sizeof(asn_DEF_ProtocolIE_Container_87P4_tags_9) - /sizeof(asn_DEF_ProtocolIE_Container_87P4_tags_9[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P4_tags_9, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P4_tags_9) - /sizeof(asn_DEF_ProtocolIE_Container_87P4_tags_9[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P4_constr_9, &asn_PER_type_ProtocolIE_Container_87P4_constr_9, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P4_9, + asn_DEF_ProtocolIE_Container_85P4_tags_9, + sizeof(asn_DEF_ProtocolIE_Container_85P4_tags_9) + /sizeof(asn_DEF_ProtocolIE_Container_85P4_tags_9[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P4_tags_9, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P4_tags_9) + /sizeof(asn_DEF_ProtocolIE_Container_85P4_tags_9[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P4_constr_9, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P4_constr_9, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P4_9, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P4_specs_9 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P4_specs_9 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P5_11[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P5_11[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICsubscriptionDeleteFailure_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P5_tags_11[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P5_specs_11 = { + sizeof(struct ProtocolIE_Container_85P5), + offsetof(struct ProtocolIE_Container_85P5, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P5 = { + "ProtocolIE-Container", + "ProtocolIE-Container", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_Container_85P5_tags_11, + sizeof(asn_DEF_ProtocolIE_Container_85P5_tags_11) + /sizeof(asn_DEF_ProtocolIE_Container_85P5_tags_11[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P5_tags_11, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P5_tags_11) + /sizeof(asn_DEF_ProtocolIE_Container_85P5_tags_11[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P5_constr_11, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P5_constr_11, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P5_11, + 1, /* Single element */ + &asn_SPC_ProtocolIE_Container_85P5_specs_11 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P6_13[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteRequired_IEs, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P5_tags_11[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P6_tags_13[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P5_specs_11 = { - sizeof(struct ProtocolIE_Container_87P5), - offsetof(struct ProtocolIE_Container_87P5, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P6_specs_13 = { + sizeof(struct ProtocolIE_Container_85P6), + offsetof(struct ProtocolIE_Container_85P6, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P5 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P6 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P5_tags_11, - sizeof(asn_DEF_ProtocolIE_Container_87P5_tags_11) - /sizeof(asn_DEF_ProtocolIE_Container_87P5_tags_11[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P5_tags_11, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P5_tags_11) - /sizeof(asn_DEF_ProtocolIE_Container_87P5_tags_11[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P5_constr_11, &asn_PER_type_ProtocolIE_Container_87P5_constr_11, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P5_11, + asn_DEF_ProtocolIE_Container_85P6_tags_13, + sizeof(asn_DEF_ProtocolIE_Container_85P6_tags_13) + /sizeof(asn_DEF_ProtocolIE_Container_85P6_tags_13[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P6_tags_13, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P6_tags_13) + /sizeof(asn_DEF_ProtocolIE_Container_85P6_tags_13[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P6_constr_13, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P6_constr_13, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P6_13, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P5_specs_11 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P6_specs_13 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P6_13[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P7_15[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICindication_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P6_tags_13[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P7_tags_15[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P6_specs_13 = { - sizeof(struct ProtocolIE_Container_87P6), - offsetof(struct ProtocolIE_Container_87P6, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P7_specs_15 = { + sizeof(struct ProtocolIE_Container_85P7), + offsetof(struct ProtocolIE_Container_85P7, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P6 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P7 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P6_tags_13, - sizeof(asn_DEF_ProtocolIE_Container_87P6_tags_13) - /sizeof(asn_DEF_ProtocolIE_Container_87P6_tags_13[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P6_tags_13, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P6_tags_13) - /sizeof(asn_DEF_ProtocolIE_Container_87P6_tags_13[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P6_constr_13, &asn_PER_type_ProtocolIE_Container_87P6_constr_13, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P6_13, + asn_DEF_ProtocolIE_Container_85P7_tags_15, + sizeof(asn_DEF_ProtocolIE_Container_85P7_tags_15) + /sizeof(asn_DEF_ProtocolIE_Container_85P7_tags_15[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P7_tags_15, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P7_tags_15) + /sizeof(asn_DEF_ProtocolIE_Container_85P7_tags_15[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P7_constr_15, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P7_constr_15, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P7_15, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P6_specs_13 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P7_specs_15 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P7_15[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P8_17[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICcontrolRequest_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P7_tags_15[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P8_tags_17[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P7_specs_15 = { - sizeof(struct ProtocolIE_Container_87P7), - offsetof(struct ProtocolIE_Container_87P7, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P8_specs_17 = { + sizeof(struct ProtocolIE_Container_85P8), + offsetof(struct ProtocolIE_Container_85P8, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P7 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P8 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P7_tags_15, - sizeof(asn_DEF_ProtocolIE_Container_87P7_tags_15) - /sizeof(asn_DEF_ProtocolIE_Container_87P7_tags_15[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P7_tags_15, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P7_tags_15) - /sizeof(asn_DEF_ProtocolIE_Container_87P7_tags_15[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P7_constr_15, &asn_PER_type_ProtocolIE_Container_87P7_constr_15, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P7_15, + asn_DEF_ProtocolIE_Container_85P8_tags_17, + sizeof(asn_DEF_ProtocolIE_Container_85P8_tags_17) + /sizeof(asn_DEF_ProtocolIE_Container_85P8_tags_17[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P8_tags_17, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P8_tags_17) + /sizeof(asn_DEF_ProtocolIE_Container_85P8_tags_17[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P8_constr_17, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P8_constr_17, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P8_17, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P7_specs_15 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P8_specs_17 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P8_17[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P9_19[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICcontrolAcknowledge_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P8_tags_17[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P9_tags_19[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P8_specs_17 = { - sizeof(struct ProtocolIE_Container_87P8), - offsetof(struct ProtocolIE_Container_87P8, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P9_specs_19 = { + sizeof(struct ProtocolIE_Container_85P9), + offsetof(struct ProtocolIE_Container_85P9, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P8 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P9 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P8_tags_17, - sizeof(asn_DEF_ProtocolIE_Container_87P8_tags_17) - /sizeof(asn_DEF_ProtocolIE_Container_87P8_tags_17[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P8_tags_17, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P8_tags_17) - /sizeof(asn_DEF_ProtocolIE_Container_87P8_tags_17[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P8_constr_17, &asn_PER_type_ProtocolIE_Container_87P8_constr_17, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P8_17, + asn_DEF_ProtocolIE_Container_85P9_tags_19, + sizeof(asn_DEF_ProtocolIE_Container_85P9_tags_19) + /sizeof(asn_DEF_ProtocolIE_Container_85P9_tags_19[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P9_tags_19, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P9_tags_19) + /sizeof(asn_DEF_ProtocolIE_Container_85P9_tags_19[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P9_constr_19, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P9_constr_19, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P9_19, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P8_specs_17 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P9_specs_19 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P9_19[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P10_21[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICcontrolFailure_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P9_tags_19[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P10_tags_21[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P9_specs_19 = { - sizeof(struct ProtocolIE_Container_87P9), - offsetof(struct ProtocolIE_Container_87P9, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P10_specs_21 = { + sizeof(struct ProtocolIE_Container_85P10), + offsetof(struct ProtocolIE_Container_85P10, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P9 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P10 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P9_tags_19, - sizeof(asn_DEF_ProtocolIE_Container_87P9_tags_19) - /sizeof(asn_DEF_ProtocolIE_Container_87P9_tags_19[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P9_tags_19, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P9_tags_19) - /sizeof(asn_DEF_ProtocolIE_Container_87P9_tags_19[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P9_constr_19, &asn_PER_type_ProtocolIE_Container_87P9_constr_19, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P9_19, + asn_DEF_ProtocolIE_Container_85P10_tags_21, + sizeof(asn_DEF_ProtocolIE_Container_85P10_tags_21) + /sizeof(asn_DEF_ProtocolIE_Container_85P10_tags_21[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P10_tags_21, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P10_tags_21) + /sizeof(asn_DEF_ProtocolIE_Container_85P10_tags_21[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P10_constr_21, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P10_constr_21, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P10_21, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P9_specs_19 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P10_specs_21 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P10_21[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P11_23[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_ErrorIndication_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P10_tags_21[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P11_tags_23[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P10_specs_21 = { - sizeof(struct ProtocolIE_Container_87P10), - offsetof(struct ProtocolIE_Container_87P10, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P11_specs_23 = { + sizeof(struct ProtocolIE_Container_85P11), + offsetof(struct ProtocolIE_Container_85P11, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P10 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P11 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P10_tags_21, - sizeof(asn_DEF_ProtocolIE_Container_87P10_tags_21) - /sizeof(asn_DEF_ProtocolIE_Container_87P10_tags_21[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P10_tags_21, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P10_tags_21) - /sizeof(asn_DEF_ProtocolIE_Container_87P10_tags_21[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P10_constr_21, &asn_PER_type_ProtocolIE_Container_87P10_constr_21, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P10_21, + asn_DEF_ProtocolIE_Container_85P11_tags_23, + sizeof(asn_DEF_ProtocolIE_Container_85P11_tags_23) + /sizeof(asn_DEF_ProtocolIE_Container_85P11_tags_23[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P11_tags_23, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P11_tags_23) + /sizeof(asn_DEF_ProtocolIE_Container_85P11_tags_23[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P11_constr_23, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P11_constr_23, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P11_23, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P10_specs_21 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P11_specs_23 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P11_23[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P12_25[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_E2setupRequestIEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P11_tags_23[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P12_tags_25[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P11_specs_23 = { - sizeof(struct ProtocolIE_Container_87P11), - offsetof(struct ProtocolIE_Container_87P11, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P12_specs_25 = { + sizeof(struct ProtocolIE_Container_85P12), + offsetof(struct ProtocolIE_Container_85P12, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P11 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P12 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P11_tags_23, - sizeof(asn_DEF_ProtocolIE_Container_87P11_tags_23) - /sizeof(asn_DEF_ProtocolIE_Container_87P11_tags_23[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P11_tags_23, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P11_tags_23) - /sizeof(asn_DEF_ProtocolIE_Container_87P11_tags_23[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P11_constr_23, &asn_PER_type_ProtocolIE_Container_87P11_constr_23, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P11_23, + asn_DEF_ProtocolIE_Container_85P12_tags_25, + sizeof(asn_DEF_ProtocolIE_Container_85P12_tags_25) + /sizeof(asn_DEF_ProtocolIE_Container_85P12_tags_25[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P12_tags_25, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P12_tags_25) + /sizeof(asn_DEF_ProtocolIE_Container_85P12_tags_25[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P12_constr_25, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P12_constr_25, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P12_25, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P11_specs_23 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P12_specs_25 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P12_25[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P13_27[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_E2setupResponseIEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P12_tags_25[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P13_tags_27[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P12_specs_25 = { - sizeof(struct ProtocolIE_Container_87P12), - offsetof(struct ProtocolIE_Container_87P12, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P13_specs_27 = { + sizeof(struct ProtocolIE_Container_85P13), + offsetof(struct ProtocolIE_Container_85P13, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P12 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P13 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P12_tags_25, - sizeof(asn_DEF_ProtocolIE_Container_87P12_tags_25) - /sizeof(asn_DEF_ProtocolIE_Container_87P12_tags_25[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P12_tags_25, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P12_tags_25) - /sizeof(asn_DEF_ProtocolIE_Container_87P12_tags_25[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P12_constr_25, &asn_PER_type_ProtocolIE_Container_87P12_constr_25, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P12_25, + asn_DEF_ProtocolIE_Container_85P13_tags_27, + sizeof(asn_DEF_ProtocolIE_Container_85P13_tags_27) + /sizeof(asn_DEF_ProtocolIE_Container_85P13_tags_27[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P13_tags_27, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P13_tags_27) + /sizeof(asn_DEF_ProtocolIE_Container_85P13_tags_27[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P13_constr_27, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P13_constr_27, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P13_27, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P12_specs_25 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P13_specs_27 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P13_27[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P14_29[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_E2setupFailureIEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P14_tags_29[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P14_specs_29 = { + sizeof(struct ProtocolIE_Container_85P14), + offsetof(struct ProtocolIE_Container_85P14, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P14 = { + "ProtocolIE-Container", + "ProtocolIE-Container", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_Container_85P14_tags_29, + sizeof(asn_DEF_ProtocolIE_Container_85P14_tags_29) + /sizeof(asn_DEF_ProtocolIE_Container_85P14_tags_29[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P14_tags_29, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P14_tags_29) + /sizeof(asn_DEF_ProtocolIE_Container_85P14_tags_29[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P14_constr_29, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P14_constr_29, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P14_29, + 1, /* Single element */ + &asn_SPC_ProtocolIE_Container_85P14_specs_29 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P15_31[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2connectionUpdate_IEs, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P13_tags_27[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P15_tags_31[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P13_specs_27 = { - sizeof(struct ProtocolIE_Container_87P13), - offsetof(struct ProtocolIE_Container_87P13, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P15_specs_31 = { + sizeof(struct ProtocolIE_Container_85P15), + offsetof(struct ProtocolIE_Container_85P15, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P13 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P15 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P13_tags_27, - sizeof(asn_DEF_ProtocolIE_Container_87P13_tags_27) - /sizeof(asn_DEF_ProtocolIE_Container_87P13_tags_27[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P13_tags_27, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P13_tags_27) - /sizeof(asn_DEF_ProtocolIE_Container_87P13_tags_27[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P13_constr_27, &asn_PER_type_ProtocolIE_Container_87P13_constr_27, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P13_27, + asn_DEF_ProtocolIE_Container_85P15_tags_31, + sizeof(asn_DEF_ProtocolIE_Container_85P15_tags_31) + /sizeof(asn_DEF_ProtocolIE_Container_85P15_tags_31[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P15_tags_31, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P15_tags_31) + /sizeof(asn_DEF_ProtocolIE_Container_85P15_tags_31[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P15_constr_31, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P15_constr_31, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P15_31, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P13_specs_27 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P15_specs_31 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P14_29[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P16_33[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2connectionUpdateAck_IEs, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P16_tags_33[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P16_specs_33 = { + sizeof(struct ProtocolIE_Container_85P16), + offsetof(struct ProtocolIE_Container_85P16, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P16 = { + "ProtocolIE-Container", + "ProtocolIE-Container", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_Container_85P16_tags_33, + sizeof(asn_DEF_ProtocolIE_Container_85P16_tags_33) + /sizeof(asn_DEF_ProtocolIE_Container_85P16_tags_33[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P16_tags_33, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P16_tags_33) + /sizeof(asn_DEF_ProtocolIE_Container_85P16_tags_33[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P16_constr_33, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P16_constr_33, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P16_33, + 1, /* Single element */ + &asn_SPC_ProtocolIE_Container_85P16_specs_33 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P17_35[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2connectionUpdateFailure_IEs, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P17_tags_35[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P17_specs_35 = { + sizeof(struct ProtocolIE_Container_85P17), + offsetof(struct ProtocolIE_Container_85P17, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P17 = { + "ProtocolIE-Container", + "ProtocolIE-Container", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_Container_85P17_tags_35, + sizeof(asn_DEF_ProtocolIE_Container_85P17_tags_35) + /sizeof(asn_DEF_ProtocolIE_Container_85P17_tags_35[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P17_tags_35, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P17_tags_35) + /sizeof(asn_DEF_ProtocolIE_Container_85P17_tags_35[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P17_constr_35, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P17_constr_35, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P17_35, + 1, /* Single element */ + &asn_SPC_ProtocolIE_Container_85P17_specs_35 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P18_37[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeConfigurationUpdate_IEs, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P18_tags_37[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P18_specs_37 = { + sizeof(struct ProtocolIE_Container_85P18), + offsetof(struct ProtocolIE_Container_85P18, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P18 = { + "ProtocolIE-Container", + "ProtocolIE-Container", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_Container_85P18_tags_37, + sizeof(asn_DEF_ProtocolIE_Container_85P18_tags_37) + /sizeof(asn_DEF_ProtocolIE_Container_85P18_tags_37[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P18_tags_37, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P18_tags_37) + /sizeof(asn_DEF_ProtocolIE_Container_85P18_tags_37[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P18_constr_37, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P18_constr_37, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P18_37, + 1, /* Single element */ + &asn_SPC_ProtocolIE_Container_85P18_specs_37 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P19_39[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeConfigurationUpdateAcknowledge_IEs, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P19_tags_39[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P19_specs_39 = { + sizeof(struct ProtocolIE_Container_85P19), + offsetof(struct ProtocolIE_Container_85P19, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P19 = { + "ProtocolIE-Container", + "ProtocolIE-Container", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_Container_85P19_tags_39, + sizeof(asn_DEF_ProtocolIE_Container_85P19_tags_39) + /sizeof(asn_DEF_ProtocolIE_Container_85P19_tags_39[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P19_tags_39, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P19_tags_39) + /sizeof(asn_DEF_ProtocolIE_Container_85P19_tags_39[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P19_constr_39, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P19_constr_39, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P19_39, + 1, /* Single element */ + &asn_SPC_ProtocolIE_Container_85P19_specs_39 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P20_41[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeConfigurationUpdateFailure_IEs, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P20_tags_41[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P20_specs_41 = { + sizeof(struct ProtocolIE_Container_85P20), + offsetof(struct ProtocolIE_Container_85P20, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P20 = { + "ProtocolIE-Container", + "ProtocolIE-Container", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_Container_85P20_tags_41, + sizeof(asn_DEF_ProtocolIE_Container_85P20_tags_41) + /sizeof(asn_DEF_ProtocolIE_Container_85P20_tags_41[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P20_tags_41, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P20_tags_41) + /sizeof(asn_DEF_ProtocolIE_Container_85P20_tags_41[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P20_constr_41, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P20_constr_41, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P20_41, + 1, /* Single element */ + &asn_SPC_ProtocolIE_Container_85P20_specs_41 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P21_43[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_ResetRequestIEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P14_tags_29[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P21_tags_43[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P14_specs_29 = { - sizeof(struct ProtocolIE_Container_87P14), - offsetof(struct ProtocolIE_Container_87P14, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P21_specs_43 = { + sizeof(struct ProtocolIE_Container_85P21), + offsetof(struct ProtocolIE_Container_85P21, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P14 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P21 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P14_tags_29, - sizeof(asn_DEF_ProtocolIE_Container_87P14_tags_29) - /sizeof(asn_DEF_ProtocolIE_Container_87P14_tags_29[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P14_tags_29, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P14_tags_29) - /sizeof(asn_DEF_ProtocolIE_Container_87P14_tags_29[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P14_constr_29, &asn_PER_type_ProtocolIE_Container_87P14_constr_29, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P14_29, + asn_DEF_ProtocolIE_Container_85P21_tags_43, + sizeof(asn_DEF_ProtocolIE_Container_85P21_tags_43) + /sizeof(asn_DEF_ProtocolIE_Container_85P21_tags_43[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P21_tags_43, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P21_tags_43) + /sizeof(asn_DEF_ProtocolIE_Container_85P21_tags_43[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P21_constr_43, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P21_constr_43, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P21_43, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P14_specs_29 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P21_specs_43 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P15_31[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P22_45[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_ResetResponseIEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P15_tags_31[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P22_tags_45[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P15_specs_31 = { - sizeof(struct ProtocolIE_Container_87P15), - offsetof(struct ProtocolIE_Container_87P15, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P22_specs_45 = { + sizeof(struct ProtocolIE_Container_85P22), + offsetof(struct ProtocolIE_Container_85P22, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P15 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P22 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P15_tags_31, - sizeof(asn_DEF_ProtocolIE_Container_87P15_tags_31) - /sizeof(asn_DEF_ProtocolIE_Container_87P15_tags_31[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P15_tags_31, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P15_tags_31) - /sizeof(asn_DEF_ProtocolIE_Container_87P15_tags_31[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P15_constr_31, &asn_PER_type_ProtocolIE_Container_87P15_constr_31, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P15_31, + asn_DEF_ProtocolIE_Container_85P22_tags_45, + sizeof(asn_DEF_ProtocolIE_Container_85P22_tags_45) + /sizeof(asn_DEF_ProtocolIE_Container_85P22_tags_45[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P22_tags_45, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P22_tags_45) + /sizeof(asn_DEF_ProtocolIE_Container_85P22_tags_45[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P22_constr_45, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P22_constr_45, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P22_45, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P15_specs_31 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P22_specs_45 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P16_33[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P23_47[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICserviceUpdate_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P16_tags_33[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P23_tags_47[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P16_specs_33 = { - sizeof(struct ProtocolIE_Container_87P16), - offsetof(struct ProtocolIE_Container_87P16, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P23_specs_47 = { + sizeof(struct ProtocolIE_Container_85P23), + offsetof(struct ProtocolIE_Container_85P23, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P16 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P23 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P16_tags_33, - sizeof(asn_DEF_ProtocolIE_Container_87P16_tags_33) - /sizeof(asn_DEF_ProtocolIE_Container_87P16_tags_33[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P16_tags_33, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P16_tags_33) - /sizeof(asn_DEF_ProtocolIE_Container_87P16_tags_33[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P16_constr_33, &asn_PER_type_ProtocolIE_Container_87P16_constr_33, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P16_33, + asn_DEF_ProtocolIE_Container_85P23_tags_47, + sizeof(asn_DEF_ProtocolIE_Container_85P23_tags_47) + /sizeof(asn_DEF_ProtocolIE_Container_85P23_tags_47[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P23_tags_47, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P23_tags_47) + /sizeof(asn_DEF_ProtocolIE_Container_85P23_tags_47[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P23_constr_47, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P23_constr_47, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P23_47, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P16_specs_33 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P23_specs_47 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P17_35[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P24_49[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICserviceUpdateAcknowledge_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P17_tags_35[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P24_tags_49[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P17_specs_35 = { - sizeof(struct ProtocolIE_Container_87P17), - offsetof(struct ProtocolIE_Container_87P17, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P24_specs_49 = { + sizeof(struct ProtocolIE_Container_85P24), + offsetof(struct ProtocolIE_Container_85P24, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P17 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P24 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P17_tags_35, - sizeof(asn_DEF_ProtocolIE_Container_87P17_tags_35) - /sizeof(asn_DEF_ProtocolIE_Container_87P17_tags_35[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P17_tags_35, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P17_tags_35) - /sizeof(asn_DEF_ProtocolIE_Container_87P17_tags_35[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P17_constr_35, &asn_PER_type_ProtocolIE_Container_87P17_constr_35, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P17_35, + asn_DEF_ProtocolIE_Container_85P24_tags_49, + sizeof(asn_DEF_ProtocolIE_Container_85P24_tags_49) + /sizeof(asn_DEF_ProtocolIE_Container_85P24_tags_49[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P24_tags_49, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P24_tags_49) + /sizeof(asn_DEF_ProtocolIE_Container_85P24_tags_49[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P24_constr_49, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P24_constr_49, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P24_49, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P17_specs_35 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P24_specs_49 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P18_37[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P25_51[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICserviceUpdateFailure_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P18_tags_37[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P25_tags_51[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P18_specs_37 = { - sizeof(struct ProtocolIE_Container_87P18), - offsetof(struct ProtocolIE_Container_87P18, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P25_specs_51 = { + sizeof(struct ProtocolIE_Container_85P25), + offsetof(struct ProtocolIE_Container_85P25, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P18 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P25 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P18_tags_37, - sizeof(asn_DEF_ProtocolIE_Container_87P18_tags_37) - /sizeof(asn_DEF_ProtocolIE_Container_87P18_tags_37[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P18_tags_37, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P18_tags_37) - /sizeof(asn_DEF_ProtocolIE_Container_87P18_tags_37[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P18_constr_37, &asn_PER_type_ProtocolIE_Container_87P18_constr_37, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P18_37, + asn_DEF_ProtocolIE_Container_85P25_tags_51, + sizeof(asn_DEF_ProtocolIE_Container_85P25_tags_51) + /sizeof(asn_DEF_ProtocolIE_Container_85P25_tags_51[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P25_tags_51, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P25_tags_51) + /sizeof(asn_DEF_ProtocolIE_Container_85P25_tags_51[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P25_constr_51, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P25_constr_51, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P25_51, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P18_specs_37 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P25_specs_51 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_Container_87P19_39[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_Container_85P26_53[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICserviceQuery_IEs, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_87P19_tags_39[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_85P26_tags_53[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_87P19_specs_39 = { - sizeof(struct ProtocolIE_Container_87P19), - offsetof(struct ProtocolIE_Container_87P19, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_85P26_specs_53 = { + sizeof(struct ProtocolIE_Container_85P26), + offsetof(struct ProtocolIE_Container_85P26, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_87P19 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_85P26 = { "ProtocolIE-Container", "ProtocolIE-Container", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_Container_87P19_tags_39, - sizeof(asn_DEF_ProtocolIE_Container_87P19_tags_39) - /sizeof(asn_DEF_ProtocolIE_Container_87P19_tags_39[0]), /* 1 */ - asn_DEF_ProtocolIE_Container_87P19_tags_39, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_Container_87P19_tags_39) - /sizeof(asn_DEF_ProtocolIE_Container_87P19_tags_39[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_Container_87P19_constr_39, &asn_PER_type_ProtocolIE_Container_87P19_constr_39, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_Container_87P19_39, + asn_DEF_ProtocolIE_Container_85P26_tags_53, + sizeof(asn_DEF_ProtocolIE_Container_85P26_tags_53) + /sizeof(asn_DEF_ProtocolIE_Container_85P26_tags_53[0]), /* 1 */ + asn_DEF_ProtocolIE_Container_85P26_tags_53, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_Container_85P26_tags_53) + /sizeof(asn_DEF_ProtocolIE_Container_85P26_tags_53[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_Container_85P26_constr_53, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_Container_85P26_constr_53, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_ProtocolIE_Container_85P26_53, 1, /* Single element */ - &asn_SPC_ProtocolIE_Container_87P19_specs_39 /* Additional specs */ + &asn_SPC_ProtocolIE_Container_85P26_specs_53 /* Additional specs */ }; diff --git a/e2ap/lib/ProtocolIE-ContainerList.c b/e2ap/lib/ProtocolIE-ContainerList.c index b43b010..8a589a0 100644 --- a/e2ap/lib/ProtocolIE-ContainerList.c +++ b/e2ap/lib/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-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ProtocolIE-ContainerList.h" diff --git a/e2ap/lib/ProtocolIE-ContainerPair.c b/e2ap/lib/ProtocolIE-ContainerPair.c index 0bf1a47..f5812cf 100644 --- a/e2ap/lib/ProtocolIE-ContainerPair.c +++ b/e2ap/lib/ProtocolIE-ContainerPair.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ProtocolIE-ContainerPair.h" diff --git a/e2ap/lib/ProtocolIE-ContainerPairList.c b/e2ap/lib/ProtocolIE-ContainerPairList.c index dba4ec4..cbffc34 100644 --- a/e2ap/lib/ProtocolIE-ContainerPairList.c +++ b/e2ap/lib/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-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ProtocolIE-ContainerPairList.h" diff --git a/e2ap/lib/ProtocolIE-Field.c b/e2ap/lib/ProtocolIE-Field.c index 80336e8..6b912ac 100644 --- a/e2ap/lib/ProtocolIE-Field.c +++ b/e2ap/lib/ProtocolIE-Field.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ProtocolIE-Field.h" @@ -43,38 +43,170 @@ static const asn_ioc_cell_t asn_IOS_RICaction_NotAdmitted_ItemIEs_1_rows[] = { 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 long asn_VAL_24_id_RICsubscription_withCause_Item = 51; +static const long asn_VAL_24_ignore = 1; +static const long asn_VAL_24_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICsubscription_withCause_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_24_id_RICsubscription_withCause_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_24_ignore }, + { "&Value", aioc__type, &asn_DEF_RICsubscription_withCause_Item }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_24_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICsubscription_withCause_ItemIEs_1[] = { + { 1, 4, asn_IOS_RICsubscription_withCause_ItemIEs_1_rows } +}; +static const long asn_VAL_71_id_E2connectionUpdate_Item = 43; +static const long asn_VAL_71_ignore = 1; +static const long asn_VAL_71_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2connectionUpdate_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_71_id_E2connectionUpdate_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_71_ignore }, + { "&Value", aioc__type, &asn_DEF_E2connectionUpdate_Item }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_71_mandatory } +}; +static const asn_ioc_set_t asn_IOS_E2connectionUpdate_ItemIEs_1[] = { + { 1, 4, asn_IOS_E2connectionUpdate_ItemIEs_1_rows } +}; +static const long asn_VAL_72_id_E2connectionUpdateRemove_Item = 47; +static const long asn_VAL_72_ignore = 1; +static const long asn_VAL_72_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2connectionUpdateRemove_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_72_id_E2connectionUpdateRemove_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_72_ignore }, + { "&Value", aioc__type, &asn_DEF_E2connectionUpdateRemove_Item }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_72_mandatory } +}; +static const asn_ioc_set_t asn_IOS_E2connectionUpdateRemove_ItemIEs_1[] = { + { 1, 4, asn_IOS_E2connectionUpdateRemove_ItemIEs_1_rows } +}; +static const long asn_VAL_76_id_E2connectionSetupFailed_Item = 41; +static const long asn_VAL_76_ignore = 1; +static const long asn_VAL_76_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2connectionSetupFailed_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_76_id_E2connectionSetupFailed_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_76_ignore }, + { "&Value", aioc__type, &asn_DEF_E2connectionSetupFailed_Item }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_76_mandatory } +}; +static const asn_ioc_set_t asn_IOS_E2connectionSetupFailed_ItemIEs_1[] = { + { 1, 4, asn_IOS_E2connectionSetupFailed_ItemIEs_1_rows } +}; +static const long asn_VAL_87_id_E2nodeComponentConfigAddition_Item = 51; +static const long asn_VAL_87_reject = 0; +static const long asn_VAL_87_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2nodeComponentConfigAddition_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_87_id_E2nodeComponentConfigAddition_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_87_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigAddition_Item }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_87_mandatory } +}; +static const asn_ioc_set_t asn_IOS_E2nodeComponentConfigAddition_ItemIEs_1[] = { + { 1, 4, asn_IOS_E2nodeComponentConfigAddition_ItemIEs_1_rows } +}; +static const long asn_VAL_88_id_E2nodeComponentConfigUpdate_Item = 34; +static const long asn_VAL_88_reject = 0; +static const long asn_VAL_88_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2nodeComponentConfigUpdate_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_88_id_E2nodeComponentConfigUpdate_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_88_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigUpdate_Item }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_88_mandatory } +}; +static const asn_ioc_set_t asn_IOS_E2nodeComponentConfigUpdate_ItemIEs_1[] = { + { 1, 4, asn_IOS_E2nodeComponentConfigUpdate_ItemIEs_1_rows } +}; +static const long asn_VAL_89_id_E2nodeComponentConfigRemoval_Item = 55; +static const long asn_VAL_89_reject = 0; +static const long asn_VAL_89_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2nodeComponentConfigRemoval_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_89_id_E2nodeComponentConfigRemoval_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_89_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigRemoval_Item }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_89_mandatory } +}; +static const asn_ioc_set_t asn_IOS_E2nodeComponentConfigRemoval_ItemIEs_1[] = { + { 1, 4, asn_IOS_E2nodeComponentConfigRemoval_ItemIEs_1_rows } +}; +static const long asn_VAL_90_id_E2nodeTNLassociationRemoval_Item = 59; +static const long asn_VAL_90_reject = 0; +static const long asn_VAL_90_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2nodeTNLassociationRemoval_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_90_id_E2nodeTNLassociationRemoval_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_90_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeTNLassociationRemoval_Item }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_90_mandatory } +}; +static const asn_ioc_set_t asn_IOS_E2nodeTNLassociationRemoval_ItemIEs_1[] = { + { 1, 4, asn_IOS_E2nodeTNLassociationRemoval_ItemIEs_1_rows } +}; +static const long asn_VAL_95_id_E2nodeComponentConfigAdditionAck_Item = 53; +static const long asn_VAL_95_reject = 0; +static const long asn_VAL_95_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2nodeComponentConfigAdditionAck_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_95_id_E2nodeComponentConfigAdditionAck_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_95_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigAdditionAck_Item }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_95_mandatory } +}; +static const asn_ioc_set_t asn_IOS_E2nodeComponentConfigAdditionAck_ItemIEs_1[] = { + { 1, 4, asn_IOS_E2nodeComponentConfigAdditionAck_ItemIEs_1_rows } +}; +static const long asn_VAL_96_id_E2nodeComponentConfigUpdateAck_Item = 36; +static const long asn_VAL_96_reject = 0; +static const long asn_VAL_96_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2nodeComponentConfigUpdateAck_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_96_id_E2nodeComponentConfigUpdateAck_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_96_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigUpdateAck_Item }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_96_mandatory } +}; +static const asn_ioc_set_t asn_IOS_E2nodeComponentConfigUpdateAck_ItemIEs_1[] = { + { 1, 4, asn_IOS_E2nodeComponentConfigUpdateAck_ItemIEs_1_rows } +}; +static const long asn_VAL_97_id_E2nodeComponentConfigRemovalAck_Item = 57; +static const long asn_VAL_97_reject = 0; +static const long asn_VAL_97_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2nodeComponentConfigRemovalAck_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_97_id_E2nodeComponentConfigRemovalAck_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_97_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigRemovalAck_Item }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_97_mandatory } +}; +static const asn_ioc_set_t asn_IOS_E2nodeComponentConfigRemovalAck_ItemIEs_1[] = { + { 1, 4, asn_IOS_E2nodeComponentConfigRemovalAck_ItemIEs_1_rows } +}; +static const long asn_VAL_110_id_RANfunction_Item = 8; +static const long asn_VAL_110_ignore = 1; +static const long asn_VAL_110_mandatory = 2; static const asn_ioc_cell_t asn_IOS_RANfunction_ItemIEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_64_id_RANfunction_Item }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_64_ignore }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_110_id_RANfunction_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_110_ignore }, { "&Value", aioc__type, &asn_DEF_RANfunction_Item }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_64_mandatory } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_110_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 long asn_VAL_111_id_RANfunctionID_Item = 6; +static const long asn_VAL_111_ignore = 1; +static const long asn_VAL_111_mandatory = 2; static const asn_ioc_cell_t asn_IOS_RANfunctionID_ItemIEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_65_id_RANfunctionID_Item }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_65_ignore }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_111_id_RANfunctionID_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_111_ignore }, { "&Value", aioc__type, &asn_DEF_RANfunctionID_Item }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_65_mandatory } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_111_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 long asn_VAL_115_id_RANfunctionIEcause_Item = 7; +static const long asn_VAL_115_ignore = 1; +static const long asn_VAL_115_mandatory = 2; static const asn_ioc_cell_t asn_IOS_RANfunctionIDcause_ItemIEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_68_id_RANfunctionIEcause_Item }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_68_ignore }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_115_id_RANfunctionIEcause_Item }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_115_ignore }, { "&Value", aioc__type, &asn_DEF_RANfunctionIDcause_Item }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_68_mandatory } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_115_mandatory } }; static const asn_ioc_set_t asn_IOS_RANfunctionIDcause_ItemIEs_1[] = { { 1, 4, asn_IOS_RANfunctionIDcause_ItemIEs_1_rows } @@ -144,7 +276,7 @@ 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_id_Cause = 1; static const long asn_VAL_13_reject = 0; static const long asn_VAL_13_mandatory = 2; static const long asn_VAL_14_id_CriticalityDiagnostics = 2; @@ -159,9 +291,9 @@ static const asn_ioc_cell_t asn_IOS_RICsubscriptionFailure_IEs_1_rows[] = { { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_12_reject }, { "&Value", aioc__type, &asn_DEF_RANfunctionID }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_12_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_13_id_RICactions_NotAdmitted }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_13_id_Cause }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_13_reject }, - { "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_List }, + { "&Value", aioc__type, &asn_DEF_Cause }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_13_mandatory }, { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_14_id_CriticalityDiagnostics }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_14_ignore }, @@ -242,404 +374,705 @@ static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteFailure_IEs_1_rows[] = 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_id_RICsubscriptionToBeRemoved = 50; +static const long asn_VAL_23_ignore = 1; 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 asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteRequired_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_23_id_RICsubscriptionToBeRemoved }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_23_ignore }, + { "&Value", aioc__type, &asn_DEF_RICsubscription_List_withCause }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_23_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteRequired_IEs_1[] = { + { 1, 4, asn_IOS_RICsubscriptionDeleteRequired_IEs_1_rows } +}; +static const long asn_VAL_25_id_RICrequestID = 29; 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_id_RANfunctionID = 5; 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_26_mandatory = 2; +static const long asn_VAL_27_id_RICactionID = 15; 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_id_RICindicationSN = 27; 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_28_optional = 0; +static const long asn_VAL_29_id_RICindicationType = 28; 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_id_RICindicationHeader = 25; static const long asn_VAL_30_reject = 0; -static const long asn_VAL_30_optional = 0; +static const long asn_VAL_30_mandatory = 2; +static const long asn_VAL_31_id_RICindicationMessage = 26; +static const long asn_VAL_31_reject = 0; +static const long asn_VAL_31_mandatory = 2; +static const long asn_VAL_32_id_RICcallProcessID = 20; +static const long asn_VAL_32_reject = 0; +static const long asn_VAL_32_optional = 0; static const asn_ioc_cell_t asn_IOS_RICindication_IEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_23_id_RICrequestID }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_23_reject }, - { "&Value", aioc__type, &asn_DEF_RICrequestID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_23_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_24_id_RANfunctionID }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_24_reject }, - { "&Value", aioc__type, &asn_DEF_RANfunctionID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_24_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_25_id_RICactionID }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_25_id_RICrequestID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_25_reject }, - { "&Value", aioc__type, &asn_DEF_RICactionID }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_25_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_26_id_RICindicationSN }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_26_id_RANfunctionID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_26_reject }, - { "&Value", aioc__type, &asn_DEF_RICindicationSN }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_26_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_27_id_RICindicationType }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_26_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_27_id_RICactionID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_27_reject }, - { "&Value", aioc__type, &asn_DEF_RICindicationType }, + { "&Value", aioc__type, &asn_DEF_RICactionID }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_27_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_28_id_RICindicationHeader }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_28_id_RICindicationSN }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_28_reject }, - { "&Value", aioc__type, &asn_DEF_RICindicationHeader }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_28_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_29_id_RICindicationMessage }, + { "&Value", aioc__type, &asn_DEF_RICindicationSN }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_28_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_29_id_RICindicationType }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_29_reject }, - { "&Value", aioc__type, &asn_DEF_RICindicationMessage }, + { "&Value", aioc__type, &asn_DEF_RICindicationType }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_29_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_30_id_RICcallProcessID }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_30_id_RICindicationHeader }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_30_reject }, + { "&Value", aioc__type, &asn_DEF_RICindicationHeader }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_30_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_31_id_RICindicationMessage }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_31_reject }, + { "&Value", aioc__type, &asn_DEF_RICindicationMessage }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_31_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_32_id_RICcallProcessID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_32_reject }, { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_30_optional } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_32_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_id_RICrequestID = 29; 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_33_mandatory = 2; +static const long asn_VAL_34_id_RANfunctionID = 5; 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_id_RICcallProcessID = 20; 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_35_optional = 0; +static const long asn_VAL_36_id_RICcontrolHeader = 22; static const long asn_VAL_36_reject = 0; -static const long asn_VAL_36_optional = 0; +static const long asn_VAL_36_mandatory = 2; +static const long asn_VAL_37_id_RICcontrolMessage = 23; +static const long asn_VAL_37_reject = 0; +static const long asn_VAL_37_mandatory = 2; +static const long asn_VAL_38_id_RICcontrolAckRequest = 21; +static const long asn_VAL_38_reject = 0; +static const long asn_VAL_38_optional = 0; static const asn_ioc_cell_t asn_IOS_RICcontrolRequest_IEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_31_id_RICrequestID }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_31_reject }, - { "&Value", aioc__type, &asn_DEF_RICrequestID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_31_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_32_id_RANfunctionID }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_32_reject }, - { "&Value", aioc__type, &asn_DEF_RANfunctionID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_32_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_33_id_RICcallProcessID }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_33_id_RICrequestID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_33_reject }, - { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_33_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_34_id_RICcontrolHeader }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_33_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_34_id_RANfunctionID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_34_reject }, - { "&Value", aioc__type, &asn_DEF_RICcontrolHeader }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_34_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_35_id_RICcontrolMessage }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_35_id_RICcallProcessID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_35_reject }, - { "&Value", aioc__type, &asn_DEF_RICcontrolMessage }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_35_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_36_id_RICcontrolAckRequest }, + { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_35_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_36_id_RICcontrolHeader }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_36_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolHeader }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_36_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_37_id_RICcontrolMessage }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_37_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolMessage }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_37_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_38_id_RICcontrolAckRequest }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_38_reject }, { "&Value", aioc__type, &asn_DEF_RICcontrolAckRequest }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_36_optional } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_38_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_id_RICrequestID = 29; 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_39_mandatory = 2; +static const long asn_VAL_40_id_RANfunctionID = 5; 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_id_RICcallProcessID = 20; static const long asn_VAL_41_reject = 0; static const long asn_VAL_41_optional = 0; +static const long asn_VAL_42_id_RICcontrolOutcome = 32; +static const long asn_VAL_42_reject = 0; +static const long asn_VAL_42_optional = 0; static const asn_ioc_cell_t asn_IOS_RICcontrolAcknowledge_IEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_37_id_RICrequestID }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_37_reject }, - { "&Value", aioc__type, &asn_DEF_RICrequestID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_37_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_38_id_RANfunctionID }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_38_reject }, - { "&Value", aioc__type, &asn_DEF_RANfunctionID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_38_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_39_id_RICcallProcessID }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_39_id_RICrequestID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_39_reject }, - { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_39_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_40_id_RICcontrolStatus }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_39_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_40_id_RANfunctionID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_40_reject }, - { "&Value", aioc__type, &asn_DEF_RICcontrolStatus }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_40_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_41_id_RICcontrolOutcome }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_41_id_RICcallProcessID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_41_reject }, + { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_41_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_42_id_RICcontrolOutcome }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_42_reject }, { "&Value", aioc__type, &asn_DEF_RICcontrolOutcome }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_41_optional } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_42_optional } }; static const asn_ioc_set_t asn_IOS_RICcontrolAcknowledge_IEs_1[] = { - { 5, 4, asn_IOS_RICcontrolAcknowledge_IEs_1_rows } + { 4, 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_id_RICrequestID = 29; 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_id_RANfunctionID = 5; static const long asn_VAL_44_reject = 0; -static const long asn_VAL_44_optional = 0; -static const long asn_VAL_45_id_Cause = 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 long asn_VAL_44_mandatory = 2; +static const long asn_VAL_45_id_RICcallProcessID = 20; +static const long asn_VAL_45_reject = 0; +static const long asn_VAL_45_optional = 0; +static const long asn_VAL_46_id_Cause = 1; +static const long asn_VAL_46_ignore = 1; +static const long asn_VAL_46_mandatory = 2; +static const long asn_VAL_47_id_RICcontrolOutcome = 32; +static const long asn_VAL_47_reject = 0; +static const long asn_VAL_47_optional = 0; static const asn_ioc_cell_t asn_IOS_RICcontrolFailure_IEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_42_id_RICrequestID }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_42_reject }, - { "&Value", aioc__type, &asn_DEF_RICrequestID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_42_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_43_id_RANfunctionID }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_43_id_RICrequestID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_43_reject }, - { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_43_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_44_id_RICcallProcessID }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_44_id_RANfunctionID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_44_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_44_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_45_id_RICcallProcessID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_45_reject }, { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_44_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_45_id_Cause }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_45_ignore }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_45_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_46_id_Cause }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_46_ignore }, { "&Value", aioc__type, &asn_DEF_Cause }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_45_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_46_id_RICcontrolOutcome }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_46_reject }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_46_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_47_id_RICcontrolOutcome }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_47_reject }, { "&Value", aioc__type, &asn_DEF_RICcontrolOutcome }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_46_optional } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_47_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_id_TransactionID = 49; static const long asn_VAL_48_reject = 0; static const long asn_VAL_48_optional = 0; -static const long asn_VAL_49_id_Cause = 1; -static const long asn_VAL_49_ignore = 1; +static const long asn_VAL_49_id_RICrequestID = 29; +static const long asn_VAL_49_reject = 0; static const long asn_VAL_49_optional = 0; -static const long asn_VAL_50_id_CriticalityDiagnostics = 2; -static const long asn_VAL_50_ignore = 1; +static const long asn_VAL_50_id_RANfunctionID = 5; +static const long asn_VAL_50_reject = 0; static const long asn_VAL_50_optional = 0; +static const long asn_VAL_51_id_Cause = 1; +static const long asn_VAL_51_ignore = 1; +static const long asn_VAL_51_optional = 0; +static const long asn_VAL_52_id_CriticalityDiagnostics = 2; +static const long asn_VAL_52_ignore = 1; +static const long asn_VAL_52_optional = 0; static const asn_ioc_cell_t asn_IOS_ErrorIndication_IEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_47_id_RICrequestID }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_47_reject }, - { "&Value", aioc__type, &asn_DEF_RICrequestID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_47_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_48_id_RANfunctionID }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_48_id_TransactionID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_48_reject }, - { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_48_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_49_id_Cause }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_49_ignore }, - { "&Value", aioc__type, &asn_DEF_Cause }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_49_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_49_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_49_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_50_id_CriticalityDiagnostics }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_50_ignore }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_50_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_50_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_50_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_51_id_Cause }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_51_ignore }, + { "&Value", aioc__type, &asn_DEF_Cause }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_51_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_52_id_CriticalityDiagnostics }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_52_ignore }, { "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_50_optional } -}; -static const asn_ioc_set_t asn_IOS_ErrorIndication_IEs_1[] = { - { 4, 4, asn_IOS_ErrorIndication_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_ID, &asn_VAL_51_id_GlobalE2node_ID }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_51_reject }, - { "&Value", aioc__type, &asn_DEF_GlobalE2node_ID }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_51_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_52_id_RANfunctionsAdded }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_52_reject }, - { "&Value", aioc__type, &asn_DEF_RANfunctions_List }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_52_optional } }; -static const asn_ioc_set_t asn_IOS_E2setupRequestIEs_1[] = { - { 2, 4, asn_IOS_E2setupRequestIEs_1_rows } +static const asn_ioc_set_t asn_IOS_ErrorIndication_IEs_1[] = { + { 5, 4, asn_IOS_ErrorIndication_IEs_1_rows } }; -static const long asn_VAL_53_id_GlobalRIC_ID = 4; +static const long asn_VAL_53_id_TransactionID = 49; 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_id_GlobalE2node_ID = 3; 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_54_mandatory = 2; +static const long asn_VAL_55_id_RANfunctionsAdded = 10; 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_ID, &asn_VAL_53_id_GlobalRIC_ID }, +static const long asn_VAL_55_mandatory = 2; +static const long asn_VAL_56_id_E2nodeComponentConfigAddition = 50; +static const long asn_VAL_56_reject = 0; +static const long asn_VAL_56_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2setupRequestIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_53_id_TransactionID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_53_reject }, - { "&Value", aioc__type, &asn_DEF_GlobalRIC_ID }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_53_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_54_id_RANfunctionsAccepted }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_54_id_GlobalE2node_ID }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_54_reject }, - { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_54_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_55_id_RANfunctionsRejected }, + { "&Value", aioc__type, &asn_DEF_GlobalE2node_ID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_54_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_55_id_RANfunctionsAdded }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_55_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctions_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_55_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_56_id_E2nodeComponentConfigAddition }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_56_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigAddition_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_56_mandatory } +}; +static const asn_ioc_set_t asn_IOS_E2setupRequestIEs_1[] = { + { 4, 4, asn_IOS_E2setupRequestIEs_1_rows } +}; +static const long asn_VAL_57_id_TransactionID = 49; +static const long asn_VAL_57_reject = 0; +static const long asn_VAL_57_mandatory = 2; +static const long asn_VAL_58_id_GlobalRIC_ID = 4; +static const long asn_VAL_58_reject = 0; +static const long asn_VAL_58_mandatory = 2; +static const long asn_VAL_59_id_RANfunctionsAccepted = 9; +static const long asn_VAL_59_reject = 0; +static const long asn_VAL_59_optional = 0; +static const long asn_VAL_60_id_RANfunctionsRejected = 13; +static const long asn_VAL_60_reject = 0; +static const long asn_VAL_60_optional = 0; +static const long asn_VAL_61_id_E2nodeComponentConfigAdditionAck = 52; +static const long asn_VAL_61_reject = 0; +static const long asn_VAL_61_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_E2setupResponseIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_57_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_57_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_57_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_58_id_GlobalRIC_ID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_58_reject }, + { "&Value", aioc__type, &asn_DEF_GlobalRIC_ID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_58_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_59_id_RANfunctionsAccepted }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_59_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_59_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_60_id_RANfunctionsRejected }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_60_reject }, { "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_55_optional } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_60_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_61_id_E2nodeComponentConfigAdditionAck }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_61_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigAdditionAck_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_61_mandatory } }; static const asn_ioc_set_t asn_IOS_E2setupResponseIEs_1[] = { - { 3, 4, asn_IOS_E2setupResponseIEs_1_rows } + { 5, 4, asn_IOS_E2setupResponseIEs_1_rows } }; -static const long asn_VAL_56_id_Cause = 1; -static const long asn_VAL_56_ignore = 1; -static const long asn_VAL_56_mandatory = 2; -static const long asn_VAL_57_id_TimeToWait = 31; -static const long asn_VAL_57_ignore = 1; -static const long asn_VAL_57_optional = 0; -static const long asn_VAL_58_id_CriticalityDiagnostics = 2; -static const long asn_VAL_58_ignore = 1; -static const long asn_VAL_58_optional = 0; +static const long asn_VAL_62_id_TransactionID = 49; +static const long asn_VAL_62_reject = 0; +static const long asn_VAL_62_mandatory = 2; +static const long asn_VAL_63_id_Cause = 1; +static const long asn_VAL_63_ignore = 1; +static const long asn_VAL_63_mandatory = 2; +static const long asn_VAL_64_id_TimeToWait = 31; +static const long asn_VAL_64_ignore = 1; +static const long asn_VAL_64_optional = 0; +static const long asn_VAL_65_id_CriticalityDiagnostics = 2; +static const long asn_VAL_65_ignore = 1; +static const long asn_VAL_65_optional = 0; +static const long asn_VAL_66_id_TNLinformation = 48; +static const long asn_VAL_66_ignore = 1; +static const long asn_VAL_66_optional = 0; static const asn_ioc_cell_t asn_IOS_E2setupFailureIEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_56_id_Cause }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_56_ignore }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_62_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_62_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_62_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_63_id_Cause }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_63_ignore }, { "&Value", aioc__type, &asn_DEF_Cause }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_56_mandatory }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_57_id_TimeToWait }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_57_ignore }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_63_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_64_id_TimeToWait }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_64_ignore }, { "&Value", aioc__type, &asn_DEF_TimeToWait }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_57_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_58_id_CriticalityDiagnostics }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_58_ignore }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_64_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_65_id_CriticalityDiagnostics }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_65_ignore }, { "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_58_optional } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_65_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_66_id_TNLinformation }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_66_ignore }, + { "&Value", aioc__type, &asn_DEF_TNLinformation }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_66_optional } }; static const asn_ioc_set_t asn_IOS_E2setupFailureIEs_1[] = { - { 3, 4, asn_IOS_E2setupFailureIEs_1_rows } + { 5, 4, asn_IOS_E2setupFailureIEs_1_rows } +}; +static const long asn_VAL_67_id_TransactionID = 49; +static const long asn_VAL_67_reject = 0; +static const long asn_VAL_67_mandatory = 2; +static const long asn_VAL_68_id_E2connectionUpdateAdd = 44; +static const long asn_VAL_68_reject = 0; +static const long asn_VAL_68_optional = 0; +static const long asn_VAL_69_id_E2connectionUpdateRemove = 46; +static const long asn_VAL_69_reject = 0; +static const long asn_VAL_69_optional = 0; +static const long asn_VAL_70_id_E2connectionUpdateModify = 45; +static const long asn_VAL_70_reject = 0; +static const long asn_VAL_70_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2connectionUpdate_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_67_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_67_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_67_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_68_id_E2connectionUpdateAdd }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_68_reject }, + { "&Value", aioc__type, &asn_DEF_E2connectionUpdate_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_68_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_69_id_E2connectionUpdateRemove }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_69_reject }, + { "&Value", aioc__type, &asn_DEF_E2connectionUpdateRemove_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_69_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_70_id_E2connectionUpdateModify }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_70_reject }, + { "&Value", aioc__type, &asn_DEF_E2connectionUpdate_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_70_optional } +}; +static const asn_ioc_set_t asn_IOS_E2connectionUpdate_IEs_1[] = { + { 4, 4, asn_IOS_E2connectionUpdate_IEs_1_rows } +}; +static const long asn_VAL_73_id_TransactionID = 49; +static const long asn_VAL_73_reject = 0; +static const long asn_VAL_73_mandatory = 2; +static const long asn_VAL_74_id_E2connectionSetup = 39; +static const long asn_VAL_74_reject = 0; +static const long asn_VAL_74_optional = 0; +static const long asn_VAL_75_id_E2connectionSetupFailed = 40; +static const long asn_VAL_75_reject = 0; +static const long asn_VAL_75_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2connectionUpdateAck_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_73_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_73_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_73_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_74_id_E2connectionSetup }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_74_reject }, + { "&Value", aioc__type, &asn_DEF_E2connectionUpdate_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_74_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_75_id_E2connectionSetupFailed }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_75_reject }, + { "&Value", aioc__type, &asn_DEF_E2connectionSetupFailed_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_75_optional } +}; +static const asn_ioc_set_t asn_IOS_E2connectionUpdateAck_IEs_1[] = { + { 3, 4, asn_IOS_E2connectionUpdateAck_IEs_1_rows } +}; +static const long asn_VAL_77_id_TransactionID = 49; +static const long asn_VAL_77_reject = 0; +static const long asn_VAL_77_mandatory = 2; +static const long asn_VAL_78_id_Cause = 1; +static const long asn_VAL_78_reject = 0; +static const long asn_VAL_78_optional = 0; +static const long asn_VAL_79_id_TimeToWait = 31; +static const long asn_VAL_79_ignore = 1; +static const long asn_VAL_79_optional = 0; +static const long asn_VAL_80_id_CriticalityDiagnostics = 2; +static const long asn_VAL_80_ignore = 1; +static const long asn_VAL_80_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2connectionUpdateFailure_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_77_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_77_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_77_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_78_id_Cause }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_78_reject }, + { "&Value", aioc__type, &asn_DEF_Cause }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_78_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_79_id_TimeToWait }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_79_ignore }, + { "&Value", aioc__type, &asn_DEF_TimeToWait }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_79_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_80_id_CriticalityDiagnostics }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_80_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_80_optional } +}; +static const asn_ioc_set_t asn_IOS_E2connectionUpdateFailure_IEs_1[] = { + { 4, 4, asn_IOS_E2connectionUpdateFailure_IEs_1_rows } +}; +static const long asn_VAL_81_id_TransactionID = 49; +static const long asn_VAL_81_reject = 0; +static const long asn_VAL_81_mandatory = 2; +static const long asn_VAL_82_id_GlobalE2node_ID = 3; +static const long asn_VAL_82_reject = 0; +static const long asn_VAL_82_optional = 0; +static const long asn_VAL_83_id_E2nodeComponentConfigAddition = 50; +static const long asn_VAL_83_reject = 0; +static const long asn_VAL_83_optional = 0; +static const long asn_VAL_84_id_E2nodeComponentConfigUpdate = 33; +static const long asn_VAL_84_reject = 0; +static const long asn_VAL_84_optional = 0; +static const long asn_VAL_85_id_E2nodeComponentConfigRemoval = 54; +static const long asn_VAL_85_reject = 0; +static const long asn_VAL_85_optional = 0; +static const long asn_VAL_86_id_E2nodeTNLassociationRemoval = 58; +static const long asn_VAL_86_reject = 0; +static const long asn_VAL_86_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2nodeConfigurationUpdate_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_81_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_81_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_81_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_82_id_GlobalE2node_ID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_82_reject }, + { "&Value", aioc__type, &asn_DEF_GlobalE2node_ID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_82_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_83_id_E2nodeComponentConfigAddition }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_83_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigAddition_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_83_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_84_id_E2nodeComponentConfigUpdate }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_84_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigUpdate_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_84_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_85_id_E2nodeComponentConfigRemoval }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_85_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigRemoval_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_85_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_86_id_E2nodeTNLassociationRemoval }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_86_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeTNLassociationRemoval_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_86_optional } +}; +static const asn_ioc_set_t asn_IOS_E2nodeConfigurationUpdate_IEs_1[] = { + { 6, 4, asn_IOS_E2nodeConfigurationUpdate_IEs_1_rows } +}; +static const long asn_VAL_91_id_TransactionID = 49; +static const long asn_VAL_91_reject = 0; +static const long asn_VAL_91_mandatory = 2; +static const long asn_VAL_92_id_E2nodeComponentConfigAdditionAck = 52; +static const long asn_VAL_92_reject = 0; +static const long asn_VAL_92_optional = 0; +static const long asn_VAL_93_id_E2nodeComponentConfigUpdateAck = 35; +static const long asn_VAL_93_reject = 0; +static const long asn_VAL_93_optional = 0; +static const long asn_VAL_94_id_E2nodeComponentConfigRemovalAck = 56; +static const long asn_VAL_94_reject = 0; +static const long asn_VAL_94_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2nodeConfigurationUpdateAcknowledge_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_91_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_91_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_91_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_92_id_E2nodeComponentConfigAdditionAck }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_92_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigAdditionAck_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_92_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_93_id_E2nodeComponentConfigUpdateAck }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_93_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigUpdateAck_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_93_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_94_id_E2nodeComponentConfigRemovalAck }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_94_reject }, + { "&Value", aioc__type, &asn_DEF_E2nodeComponentConfigRemovalAck_List }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_94_optional } +}; +static const asn_ioc_set_t asn_IOS_E2nodeConfigurationUpdateAcknowledge_IEs_1[] = { + { 4, 4, asn_IOS_E2nodeConfigurationUpdateAcknowledge_IEs_1_rows } +}; +static const long asn_VAL_98_id_TransactionID = 49; +static const long asn_VAL_98_reject = 0; +static const long asn_VAL_98_mandatory = 2; +static const long asn_VAL_99_id_Cause = 1; +static const long asn_VAL_99_ignore = 1; +static const long asn_VAL_99_mandatory = 2; +static const long asn_VAL_100_id_TimeToWait = 31; +static const long asn_VAL_100_ignore = 1; +static const long asn_VAL_100_optional = 0; +static const long asn_VAL_101_id_CriticalityDiagnostics = 2; +static const long asn_VAL_101_ignore = 1; +static const long asn_VAL_101_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2nodeConfigurationUpdateFailure_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_98_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_98_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_98_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_99_id_Cause }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_99_ignore }, + { "&Value", aioc__type, &asn_DEF_Cause }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_99_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_100_id_TimeToWait }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_100_ignore }, + { "&Value", aioc__type, &asn_DEF_TimeToWait }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_100_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_101_id_CriticalityDiagnostics }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_101_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_101_optional } }; -static const long asn_VAL_59_id_Cause = 1; -static const long asn_VAL_59_ignore = 1; -static const long asn_VAL_59_mandatory = 2; +static const asn_ioc_set_t asn_IOS_E2nodeConfigurationUpdateFailure_IEs_1[] = { + { 4, 4, asn_IOS_E2nodeConfigurationUpdateFailure_IEs_1_rows } +}; +static const long asn_VAL_102_id_TransactionID = 49; +static const long asn_VAL_102_reject = 0; +static const long asn_VAL_102_mandatory = 2; +static const long asn_VAL_103_id_Cause = 1; +static const long asn_VAL_103_ignore = 1; +static const long asn_VAL_103_mandatory = 2; static const asn_ioc_cell_t asn_IOS_ResetRequestIEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_59_id_Cause }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_59_ignore }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_102_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_102_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_102_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_103_id_Cause }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_103_ignore }, { "&Value", aioc__type, &asn_DEF_Cause }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_59_mandatory } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_103_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_CriticalityDiagnostics = 2; -static const long asn_VAL_60_ignore = 1; -static const long asn_VAL_60_optional = 0; + { 2, 4, asn_IOS_ResetRequestIEs_1_rows } +}; +static const long asn_VAL_104_id_TransactionID = 49; +static const long asn_VAL_104_reject = 0; +static const long asn_VAL_104_mandatory = 2; +static const long asn_VAL_105_id_CriticalityDiagnostics = 2; +static const long asn_VAL_105_ignore = 1; +static const long asn_VAL_105_optional = 0; static const asn_ioc_cell_t asn_IOS_ResetResponseIEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_60_id_CriticalityDiagnostics }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_60_ignore }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_104_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_104_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_104_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_105_id_CriticalityDiagnostics }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_105_ignore }, { "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_60_optional } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_105_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; + { 2, 4, asn_IOS_ResetResponseIEs_1_rows } +}; +static const long asn_VAL_106_id_TransactionID = 49; +static const long asn_VAL_106_reject = 0; +static const long asn_VAL_106_mandatory = 2; +static const long asn_VAL_107_id_RANfunctionsAdded = 10; +static const long asn_VAL_107_reject = 0; +static const long asn_VAL_107_optional = 0; +static const long asn_VAL_108_id_RANfunctionsModified = 12; +static const long asn_VAL_108_reject = 0; +static const long asn_VAL_108_optional = 0; +static const long asn_VAL_109_id_RANfunctionsDeleted = 11; +static const long asn_VAL_109_reject = 0; +static const long asn_VAL_109_optional = 0; static const asn_ioc_cell_t asn_IOS_RICserviceUpdate_IEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_61_id_RANfunctionsAdded }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_61_reject }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_106_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_106_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_106_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_107_id_RANfunctionsAdded }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_107_reject }, { "&Value", aioc__type, &asn_DEF_RANfunctions_List }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_61_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_62_id_RANfunctionsModified }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_62_reject }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_107_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_108_id_RANfunctionsModified }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_108_reject }, { "&Value", aioc__type, &asn_DEF_RANfunctions_List }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_62_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_63_id_RANfunctionsDeleted }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_63_reject }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_108_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_109_id_RANfunctionsDeleted }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_109_reject }, { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_63_optional } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_109_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; + { 4, 4, asn_IOS_RICserviceUpdate_IEs_1_rows } +}; +static const long asn_VAL_112_id_TransactionID = 49; +static const long asn_VAL_112_reject = 0; +static const long asn_VAL_112_mandatory = 2; +static const long asn_VAL_113_id_RANfunctionsAccepted = 9; +static const long asn_VAL_113_reject = 0; +static const long asn_VAL_113_mandatory = 2; +static const long asn_VAL_114_id_RANfunctionsRejected = 13; +static const long asn_VAL_114_reject = 0; +static const long asn_VAL_114_optional = 0; static const asn_ioc_cell_t asn_IOS_RICserviceUpdateAcknowledge_IEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_66_id_RANfunctionsAccepted }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_66_reject }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_112_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_112_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_112_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_113_id_RANfunctionsAccepted }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_113_reject }, { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_66_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_67_id_RANfunctionsRejected }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_67_reject }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_113_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_114_id_RANfunctionsRejected }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_114_reject }, { "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_67_optional } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_114_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_TimeToWait = 31; -static const long asn_VAL_70_ignore = 1; -static const long asn_VAL_70_optional = 0; -static const long asn_VAL_71_id_CriticalityDiagnostics = 2; -static const long asn_VAL_71_ignore = 1; -static const long asn_VAL_71_optional = 0; + { 3, 4, asn_IOS_RICserviceUpdateAcknowledge_IEs_1_rows } +}; +static const long asn_VAL_116_id_TransactionID = 49; +static const long asn_VAL_116_reject = 0; +static const long asn_VAL_116_mandatory = 2; +static const long asn_VAL_117_id_Cause = 1; +static const long asn_VAL_117_reject = 0; +static const long asn_VAL_117_mandatory = 2; +static const long asn_VAL_118_id_TimeToWait = 31; +static const long asn_VAL_118_ignore = 1; +static const long asn_VAL_118_optional = 0; +static const long asn_VAL_119_id_CriticalityDiagnostics = 2; +static const long asn_VAL_119_ignore = 1; +static const long asn_VAL_119_optional = 0; static const asn_ioc_cell_t asn_IOS_RICserviceUpdateFailure_IEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_69_id_RANfunctionsRejected }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_69_ignore }, - { "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_69_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_70_id_TimeToWait }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_70_ignore }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_116_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_116_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_116_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_117_id_Cause }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_117_reject }, + { "&Value", aioc__type, &asn_DEF_Cause }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_117_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_118_id_TimeToWait }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_118_ignore }, { "&Value", aioc__type, &asn_DEF_TimeToWait }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_70_optional }, - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_71_id_CriticalityDiagnostics }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_71_ignore }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_118_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_119_id_CriticalityDiagnostics }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_119_ignore }, { "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_71_optional } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_119_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; + { 4, 4, asn_IOS_RICserviceUpdateFailure_IEs_1_rows } +}; +static const long asn_VAL_120_id_TransactionID = 49; +static const long asn_VAL_120_reject = 0; +static const long asn_VAL_120_mandatory = 2; +static const long asn_VAL_121_id_RANfunctionsAccepted = 9; +static const long asn_VAL_121_reject = 0; +static const long asn_VAL_121_optional = 0; static const asn_ioc_cell_t asn_IOS_RICserviceQuery_IEs_1_rows[] = { - { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_72_id_RANfunctionsAccepted }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_72_reject }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_120_id_TransactionID }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_120_reject }, + { "&Value", aioc__type, &asn_DEF_TransactionID }, + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_120_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_121_id_RANfunctionsAccepted }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_121_reject }, { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, - { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_72_optional } + { "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_121_optional } }; static const asn_ioc_set_t asn_IOS_RICserviceQuery_IEs_1[] = { - { 1, 4, asn_IOS_RICserviceQuery_IEs_1_rows } + { 2, 4, asn_IOS_RICserviceQuery_IEs_1_rows } }; static int memb_id_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, @@ -655,7 +1088,7 @@ memb_id_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -772,7 +1205,7 @@ memb_id_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -889,7 +1322,7 @@ memb_id_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -1006,7 +1439,7 @@ memb_id_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -1018,13 +1451,13 @@ memb_id_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RANfunction_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_RICsubscription_withCause_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; + const asn_ioc_set_t *itable = asn_IOS_RICsubscription_withCause_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)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscription_withCause_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]; @@ -1064,13 +1497,13 @@ memb_criticality_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RANfunction_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_RICsubscription_withCause_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; + const asn_ioc_set_t *itable = asn_IOS_RICsubscription_withCause_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)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscription_withCause_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]; @@ -1123,7 +1556,7 @@ memb_id_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -1135,13 +1568,13 @@ memb_id_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RANfunctionID_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2connectionUpdate_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; + const asn_ioc_set_t *itable = asn_IOS_E2connectionUpdate_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)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2connectionUpdate_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]; @@ -1181,13 +1614,13 @@ memb_criticality_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RANfunctionID_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2connectionUpdate_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; + const asn_ioc_set_t *itable = asn_IOS_E2connectionUpdate_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)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2connectionUpdate_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]; @@ -1240,7 +1673,7 @@ memb_id_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -1252,13 +1685,13 @@ memb_id_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RANfunctionIDcause_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2connectionUpdateRemove_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; + const asn_ioc_set_t *itable = asn_IOS_E2connectionUpdateRemove_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)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2connectionUpdateRemove_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]; @@ -1298,13 +1731,13 @@ memb_criticality_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RANfunctionIDcause_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2connectionUpdateRemove_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; + const asn_ioc_set_t *itable = asn_IOS_E2connectionUpdateRemove_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)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2connectionUpdateRemove_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]; @@ -1357,7 +1790,7 @@ memb_id_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -1369,13 +1802,13 @@ memb_id_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICsubscriptionRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2connectionSetupFailed_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_RICsubscriptionRequest_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2connectionSetupFailed_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 RICsubscriptionRequest_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2connectionSetupFailed_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]; @@ -1415,13 +1848,13 @@ memb_criticality_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICsubscriptionRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2connectionSetupFailed_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_RICsubscriptionRequest_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2connectionSetupFailed_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 RICsubscriptionRequest_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2connectionSetupFailed_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]; @@ -1474,7 +1907,7 @@ memb_id_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -1486,13 +1919,13 @@ memb_id_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICsubscriptionResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigAddition_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_RICsubscriptionResponse_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigAddition_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 RICsubscriptionResponse_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigAddition_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]; @@ -1532,13 +1965,13 @@ memb_criticality_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICsubscriptionResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigAddition_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_RICsubscriptionResponse_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigAddition_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 RICsubscriptionResponse_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigAddition_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]; @@ -1591,7 +2024,7 @@ memb_id_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -1603,13 +2036,13 @@ memb_id_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICsubscriptionFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigUpdate_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_RICsubscriptionFailure_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigUpdate_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 RICsubscriptionFailure_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigUpdate_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]; @@ -1649,13 +2082,13 @@ memb_criticality_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICsubscriptionFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigUpdate_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_RICsubscriptionFailure_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigUpdate_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 RICsubscriptionFailure_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigUpdate_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]; @@ -1708,7 +2141,7 @@ memb_id_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -1720,13 +2153,13 @@ memb_id_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICsubscriptionDeleteRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigRemoval_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_RICsubscriptionDeleteRequest_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigRemoval_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 RICsubscriptionDeleteRequest_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigRemoval_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]; @@ -1766,13 +2199,13 @@ memb_criticality_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICsubscriptionDeleteRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigRemoval_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_RICsubscriptionDeleteRequest_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigRemoval_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 RICsubscriptionDeleteRequest_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigRemoval_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]; @@ -1825,7 +2258,7 @@ memb_id_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -1837,13 +2270,13 @@ memb_id_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICsubscriptionDeleteResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeTNLassociationRemoval_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_RICsubscriptionDeleteResponse_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeTNLassociationRemoval_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 RICsubscriptionDeleteResponse_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeTNLassociationRemoval_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]; @@ -1883,13 +2316,13 @@ memb_criticality_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICsubscriptionDeleteResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeTNLassociationRemoval_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_RICsubscriptionDeleteResponse_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeTNLassociationRemoval_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 RICsubscriptionDeleteResponse_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeTNLassociationRemoval_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]; @@ -1942,7 +2375,7 @@ memb_id_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -1954,13 +2387,13 @@ memb_id_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICsubscriptionDeleteFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigAdditionAck_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_RICsubscriptionDeleteFailure_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigAdditionAck_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 RICsubscriptionDeleteFailure_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigAdditionAck_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]; @@ -2000,13 +2433,13 @@ memb_criticality_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICsubscriptionDeleteFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigAdditionAck_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_RICsubscriptionDeleteFailure_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigAdditionAck_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 RICsubscriptionDeleteFailure_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigAdditionAck_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]; @@ -2059,7 +2492,7 @@ memb_id_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -2071,13 +2504,13 @@ memb_id_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICindication_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigUpdateAck_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_RICindication_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigUpdateAck_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 RICindication_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigUpdateAck_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]; @@ -2117,13 +2550,13 @@ memb_criticality_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICindication_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigUpdateAck_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_RICindication_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigUpdateAck_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 RICindication_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigUpdateAck_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]; @@ -2176,7 +2609,7 @@ memb_id_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -2188,13 +2621,13 @@ memb_id_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICcontrolRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigRemovalAck_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_RICcontrolRequest_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigRemovalAck_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 RICcontrolRequest_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigRemovalAck_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]; @@ -2234,13 +2667,13 @@ memb_criticality_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICcontrolRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_E2nodeComponentConfigRemovalAck_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_RICcontrolRequest_IEs_1; + const asn_ioc_set_t *itable = asn_IOS_E2nodeComponentConfigRemovalAck_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 RICcontrolRequest_IEs, id)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2nodeComponentConfigRemovalAck_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]; @@ -2293,7 +2726,7 @@ memb_id_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -2305,13 +2738,13 @@ memb_id_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICcontrolAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_RICcontrolAcknowledge_IEs_1; + 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 RICcontrolAcknowledge_IEs, id)); + 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]; @@ -2351,13 +2784,13 @@ memb_criticality_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICcontrolAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_RICcontrolAcknowledge_IEs_1; + 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 RICcontrolAcknowledge_IEs, id)); + 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]; @@ -2410,7 +2843,7 @@ memb_id_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -2422,13 +2855,13 @@ memb_id_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICcontrolFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_RICcontrolFailure_IEs_1; + 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 RICcontrolFailure_IEs, id)); + 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]; @@ -2468,13 +2901,13 @@ memb_criticality_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICcontrolFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_RICcontrolFailure_IEs_1; + 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 RICcontrolFailure_IEs, id)); + 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]; @@ -2527,7 +2960,7 @@ memb_id_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -2539,13 +2972,13 @@ memb_id_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_ErrorIndication_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_ErrorIndication_IEs_1; + 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 ErrorIndication_IEs, id)); + 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]; @@ -2585,13 +3018,13 @@ memb_criticality_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_ErrorIndication_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_ErrorIndication_IEs_1; + 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 ErrorIndication_IEs, id)); + 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]; @@ -2644,7 +3077,7 @@ memb_id_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -2656,13 +3089,13 @@ memb_id_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_E2setupRequestIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_E2setupRequestIEs_1; + 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 E2setupRequestIEs, id)); + 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]; @@ -2702,13 +3135,13 @@ memb_criticality_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_E2setupRequestIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_E2setupRequestIEs_1; + 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 E2setupRequestIEs, id)); + 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]; @@ -2761,7 +3194,7 @@ memb_id_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -2773,13 +3206,13 @@ memb_id_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_E2setupResponseIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_E2setupResponseIEs_1; + 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 E2setupResponseIEs, id)); + 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]; @@ -2819,13 +3252,13 @@ memb_criticality_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_E2setupResponseIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_E2setupResponseIEs_1; + 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 E2setupResponseIEs, id)); + 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]; @@ -2878,7 +3311,7 @@ memb_id_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -2890,13 +3323,13 @@ memb_id_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_E2setupFailureIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_E2setupFailureIEs_1; + 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 E2setupFailureIEs, id)); + 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]; @@ -2936,13 +3369,13 @@ memb_criticality_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_E2setupFailureIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_E2setupFailureIEs_1; + 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 E2setupFailureIEs, id)); + 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]; @@ -2995,7 +3428,7 @@ memb_id_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -3007,13 +3440,13 @@ memb_id_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_ResetRequestIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_ResetRequestIEs_1; + 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 ResetRequestIEs, id)); + 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]; @@ -3053,13 +3486,13 @@ memb_criticality_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_ResetRequestIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_ResetRequestIEs_1; + 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 ResetRequestIEs, id)); + 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]; @@ -3112,7 +3545,7 @@ memb_id_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -3124,13 +3557,13 @@ memb_id_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_ResetResponseIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_ResetResponseIEs_1; + 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 ResetResponseIEs, id)); + 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]; @@ -3170,13 +3603,13 @@ memb_criticality_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_ResetResponseIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_ResetResponseIEs_1; + 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 ResetResponseIEs, id)); + 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]; @@ -3229,7 +3662,7 @@ memb_id_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -3241,13 +3674,13 @@ memb_id_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICserviceUpdate_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_RICserviceUpdate_IEs_1; + 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 RICserviceUpdate_IEs, id)); + 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]; @@ -3287,13 +3720,13 @@ memb_criticality_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICserviceUpdate_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_RICserviceUpdate_IEs_1; + 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 RICserviceUpdate_IEs, id)); + 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]; @@ -3346,7 +3779,7 @@ memb_id_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -3358,13 +3791,13 @@ memb_id_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICserviceUpdateAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_RICsubscriptionDeleteRequired_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; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteRequired_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)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteRequired_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]; @@ -3404,13 +3837,13 @@ memb_criticality_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICserviceUpdateAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +select_RICsubscriptionDeleteRequired_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; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteRequired_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)); + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteRequired_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]; @@ -3463,7 +3896,7 @@ memb_id_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -3475,13 +3908,13 @@ memb_id_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICserviceUpdateFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_RICserviceUpdateFailure_IEs_1; + 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 RICserviceUpdateFailure_IEs, id)); + 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]; @@ -3521,13 +3954,13 @@ memb_criticality_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr } static asn_type_selector_result_t -select_RICserviceUpdateFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_RICserviceUpdateFailure_IEs_1; + 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 RICserviceUpdateFailure_IEs, id)); + 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]; @@ -3580,7 +4013,7 @@ memb_id_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -3592,13 +4025,13 @@ memb_id_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr, } static asn_type_selector_result_t -select_RICserviceQuery_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_RICserviceQuery_IEs_1; + 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 RICserviceQuery_IEs, id)); + 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]; @@ -3638,13 +4071,13 @@ memb_criticality_constraint_101(const asn_TYPE_descriptor_t *td, const void *spt } static asn_type_selector_result_t -select_RICserviceQuery_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { +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_RICserviceQuery_IEs_1; + 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 RICserviceQuery_IEs, id)); + 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]; @@ -3683,656 +4116,6472 @@ memb_value_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr, 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 = { +static int +memb_id_constraint_105(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 >= 0L && value <= 65535L)) { + /* 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_105(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_105(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_109(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 >= 0L && value <= 65535L)) { + /* 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_109(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_109(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_113(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 >= 0L && value <= 65535L)) { + /* 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_ErrorIndication_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_ErrorIndication_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 ErrorIndication_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_113(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_ErrorIndication_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_ErrorIndication_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 ErrorIndication_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_113(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_117(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 >= 0L && value <= 65535L)) { + /* 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_117(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_117(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_121(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 >= 0L && value <= 65535L)) { + /* 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_121(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_121(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_125(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 >= 0L && value <= 65535L)) { + /* 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_125(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_125(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_129(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 >= 0L && value <= 65535L)) { + /* 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_E2connectionUpdate_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_E2connectionUpdate_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 E2connectionUpdate_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_129(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_E2connectionUpdate_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_E2connectionUpdate_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 E2connectionUpdate_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_129(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_133(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 >= 0L && value <= 65535L)) { + /* 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_E2connectionUpdateAck_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_E2connectionUpdateAck_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 E2connectionUpdateAck_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_133(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_E2connectionUpdateAck_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_E2connectionUpdateAck_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 E2connectionUpdateAck_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_133(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_137(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 >= 0L && value <= 65535L)) { + /* 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_E2connectionUpdateFailure_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_E2connectionUpdateFailure_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 E2connectionUpdateFailure_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_137(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_E2connectionUpdateFailure_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_E2connectionUpdateFailure_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 E2connectionUpdateFailure_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_137(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_141(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 >= 0L && value <= 65535L)) { + /* 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_E2nodeConfigurationUpdate_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_E2nodeConfigurationUpdate_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 E2nodeConfigurationUpdate_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_141(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_E2nodeConfigurationUpdate_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_E2nodeConfigurationUpdate_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 E2nodeConfigurationUpdate_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_141(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_145(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 >= 0L && value <= 65535L)) { + /* 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_E2nodeConfigurationUpdateAcknowledge_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_E2nodeConfigurationUpdateAcknowledge_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 E2nodeConfigurationUpdateAcknowledge_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_145(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_E2nodeConfigurationUpdateAcknowledge_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_E2nodeConfigurationUpdateAcknowledge_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 E2nodeConfigurationUpdateAcknowledge_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_145(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_149(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 >= 0L && value <= 65535L)) { + /* 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_E2nodeConfigurationUpdateFailure_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_E2nodeConfigurationUpdateFailure_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 E2nodeConfigurationUpdateFailure_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_149(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_E2nodeConfigurationUpdateFailure_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_E2nodeConfigurationUpdateFailure_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 E2nodeConfigurationUpdateFailure_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_149(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_153(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 >= 0L && value <= 65535L)) { + /* 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_153(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_153(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_157(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 >= 0L && value <= 65535L)) { + /* 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_157(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_157(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_161(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 >= 0L && value <= 65535L)) { + /* 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_161(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_161(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_165(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 >= 0L && value <= 65535L)) { + /* 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_165(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_165(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_169(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 >= 0L && value <= 65535L)) { + /* 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_169(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_169(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_173(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 >= 0L && value <= 65535L)) { + /* 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_173(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_173(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); +} + +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_2 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_6 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_7 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_8 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_10 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_11 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_12 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_14 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_15 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_16 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_18 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_19 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_20 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_22 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_23 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_24 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_26 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_27 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_28 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_30 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_31 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_32 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_34 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_35 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_36 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_38 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_39 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_40 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_42 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_43 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_44 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_46 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_47 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_48 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_50 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_51 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_52 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_54 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_55 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_56 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_58 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_59 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_60 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_62 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_63 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_64 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_66 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_67 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_68 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_70 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_71 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_72 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_74 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_75 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_76 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_78 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_79 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_80 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_82 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_83 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_84 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_86 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_87 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_88 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_90 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_91 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_92 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_94 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_95 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_96 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_98 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_99 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_100 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_102 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_103 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_104 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_106 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_106 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_107 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_107 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_108 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_108 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_110 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_110 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_111 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_111 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_112 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_112 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_114 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_114 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_115 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_115 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_116 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_116 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_118 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_118 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_119 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_119 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_120 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_120 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_122 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_122 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_123 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_123 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_124 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_124 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_126 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_126 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_127 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_127 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_128 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_128 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_130 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_130 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_131 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_131 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_132 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_132 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_134 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_134 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_135 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_135 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_136 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_136 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_138 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_138 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_139 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_139 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_140 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_140 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_142 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_142 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_143 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_143 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_144 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_144 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_146 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_146 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_147 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_147 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_148 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_148 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_150 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_150 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_151 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_151 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_152 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_152 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_154 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_154 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_155 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_155 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_156 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_156 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_158 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_158 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_159 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_159 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_160 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_160 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_162 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_162 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_163 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_163 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_164 CC_NOTUSED = { { 0, 0 }, -1}; -static asn_per_constraints_t asn_PER_memb_criticality_constr_27 CC_NOTUSED = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_164 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_166 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_166 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_167 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_167 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_168 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_168 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_170 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_170 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_171 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_171 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_172 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_172 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_id_constr_174 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_id_constr_174 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_criticality_constr_175 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_criticality_constr_175 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 */ +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_value_constr_176 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_value_constr_176 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_1 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_RICaction_ToBeSetup_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_1 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_4, + select_RICaction_ToBeSetup_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_4, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_4, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ +}; +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, + 2, /* 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_6, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_6, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_5 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_RICaction_Admitted_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_7, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_7, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_5 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_8, + select_RICaction_Admitted_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_8, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_8, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ +}; +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, + 2, /* 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_10, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_10, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_9 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_RICaction_NotAdmitted_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_11, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_11, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_9 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_12, + select_RICaction_NotAdmitted_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_12, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_12, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ +}; +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, + 2, /* 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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 RICsubscription_withCause_ItemIEs__value, choice.RICsubscription_withCause_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscription_withCause_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RICsubscription-withCause-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_16[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICsubscription-withCause-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_16 = { + sizeof(struct RICsubscription_withCause_ItemIEs__value), + offsetof(struct RICsubscription_withCause_ItemIEs__value, _asn_ctx), + offsetof(struct RICsubscription_withCause_ItemIEs__value, present), + sizeof(((struct RICsubscription_withCause_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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_16, + 1, /* Elements count */ + &asn_SPC_value_specs_16 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscription_withCause_ItemIEs_13[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscription_withCause_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_14, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_14, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_13 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscription_withCause_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_RICsubscription_withCause_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_15, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_15, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_13 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscription_withCause_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_16, + select_RICsubscription_withCause_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_16, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_16, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_13 + }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscription_withCause_ItemIEs_tags_13[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscription_withCause_ItemIEs_tag2el_13[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscription_withCause_ItemIEs_specs_13 = { + sizeof(struct RICsubscription_withCause_ItemIEs), + offsetof(struct RICsubscription_withCause_ItemIEs, _asn_ctx), + asn_MAP_RICsubscription_withCause_ItemIEs_tag2el_13, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscription_withCause_ItemIEs = { + "RICsubscription-withCause-ItemIEs", + "RICsubscription-withCause-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscription_withCause_ItemIEs_tags_13, + sizeof(asn_DEF_RICsubscription_withCause_ItemIEs_tags_13) + /sizeof(asn_DEF_RICsubscription_withCause_ItemIEs_tags_13[0]), /* 1 */ + asn_DEF_RICsubscription_withCause_ItemIEs_tags_13, /* Same as above */ + sizeof(asn_DEF_RICsubscription_withCause_ItemIEs_tags_13) + /sizeof(asn_DEF_RICsubscription_withCause_ItemIEs_tags_13[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICsubscription_withCause_ItemIEs_13, + 3, /* Elements count */ + &asn_SPC_RICsubscription_withCause_ItemIEs_specs_13 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_20[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_ItemIEs__value, choice.E2connectionUpdate_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2connectionUpdate_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2connectionUpdate-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_20[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* E2connectionUpdate-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_20 = { + sizeof(struct E2connectionUpdate_ItemIEs__value), + offsetof(struct E2connectionUpdate_ItemIEs__value, _asn_ctx), + offsetof(struct E2connectionUpdate_ItemIEs__value, present), + sizeof(((struct E2connectionUpdate_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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_20, + 1, /* Elements count */ + &asn_SPC_value_specs_20 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2connectionUpdate_ItemIEs_17[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_18, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_18, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_17 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_E2connectionUpdate_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_19, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_19, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_17 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_20, + select_E2connectionUpdate_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_20, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_20, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_17 + }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionUpdate_ItemIEs_tags_17[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2connectionUpdate_ItemIEs_tag2el_17[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdate_ItemIEs_specs_17 = { + sizeof(struct E2connectionUpdate_ItemIEs), + offsetof(struct E2connectionUpdate_ItemIEs, _asn_ctx), + asn_MAP_E2connectionUpdate_ItemIEs_tag2el_17, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2connectionUpdate_ItemIEs = { + "E2connectionUpdate-ItemIEs", + "E2connectionUpdate-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2connectionUpdate_ItemIEs_tags_17, + sizeof(asn_DEF_E2connectionUpdate_ItemIEs_tags_17) + /sizeof(asn_DEF_E2connectionUpdate_ItemIEs_tags_17[0]), /* 1 */ + asn_DEF_E2connectionUpdate_ItemIEs_tags_17, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdate_ItemIEs_tags_17) + /sizeof(asn_DEF_E2connectionUpdate_ItemIEs_tags_17[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdate_ItemIEs_17, + 3, /* Elements count */ + &asn_SPC_E2connectionUpdate_ItemIEs_specs_17 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_24[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateRemove_ItemIEs__value, choice.E2connectionUpdateRemove_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2connectionUpdateRemove_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2connectionUpdateRemove-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_24[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* E2connectionUpdateRemove-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_24 = { + sizeof(struct E2connectionUpdateRemove_ItemIEs__value), + offsetof(struct E2connectionUpdateRemove_ItemIEs__value, _asn_ctx), + offsetof(struct E2connectionUpdateRemove_ItemIEs__value, present), + sizeof(((struct E2connectionUpdateRemove_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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_24, + 1, /* Elements count */ + &asn_SPC_value_specs_24 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2connectionUpdateRemove_ItemIEs_21[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateRemove_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_22, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_22, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_21 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateRemove_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_E2connectionUpdateRemove_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_23, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_23, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_21 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateRemove_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_24, + select_E2connectionUpdateRemove_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_24, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_24, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_21 + }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionUpdateRemove_ItemIEs_tags_21[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2connectionUpdateRemove_ItemIEs_tag2el_21[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateRemove_ItemIEs_specs_21 = { + sizeof(struct E2connectionUpdateRemove_ItemIEs), + offsetof(struct E2connectionUpdateRemove_ItemIEs, _asn_ctx), + asn_MAP_E2connectionUpdateRemove_ItemIEs_tag2el_21, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2connectionUpdateRemove_ItemIEs = { + "E2connectionUpdateRemove-ItemIEs", + "E2connectionUpdateRemove-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2connectionUpdateRemove_ItemIEs_tags_21, + sizeof(asn_DEF_E2connectionUpdateRemove_ItemIEs_tags_21) + /sizeof(asn_DEF_E2connectionUpdateRemove_ItemIEs_tags_21[0]), /* 1 */ + asn_DEF_E2connectionUpdateRemove_ItemIEs_tags_21, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdateRemove_ItemIEs_tags_21) + /sizeof(asn_DEF_E2connectionUpdateRemove_ItemIEs_tags_21[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdateRemove_ItemIEs_21, + 3, /* Elements count */ + &asn_SPC_E2connectionUpdateRemove_ItemIEs_specs_21 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_28[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionSetupFailed_ItemIEs__value, choice.E2connectionSetupFailed_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2connectionSetupFailed_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2connectionSetupFailed-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_28[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* E2connectionSetupFailed-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_28 = { + sizeof(struct E2connectionSetupFailed_ItemIEs__value), + offsetof(struct E2connectionSetupFailed_ItemIEs__value, _asn_ctx), + offsetof(struct E2connectionSetupFailed_ItemIEs__value, present), + sizeof(((struct E2connectionSetupFailed_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_28, + 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_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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_28, + 1, /* Elements count */ + &asn_SPC_value_specs_28 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2connectionSetupFailed_ItemIEs_25[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionSetupFailed_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_26, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_26, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_25 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2connectionSetupFailed_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_E2connectionSetupFailed_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_27, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_27, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_25 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2connectionSetupFailed_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_28, + select_E2connectionSetupFailed_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_28, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_28, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_25 + }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2connectionSetupFailed_ItemIEs_tags_25[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2connectionSetupFailed_ItemIEs_tag2el_25[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2connectionSetupFailed_ItemIEs_specs_25 = { + sizeof(struct E2connectionSetupFailed_ItemIEs), + offsetof(struct E2connectionSetupFailed_ItemIEs, _asn_ctx), + asn_MAP_E2connectionSetupFailed_ItemIEs_tag2el_25, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2connectionSetupFailed_ItemIEs = { + "E2connectionSetupFailed-ItemIEs", + "E2connectionSetupFailed-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2connectionSetupFailed_ItemIEs_tags_25, + sizeof(asn_DEF_E2connectionSetupFailed_ItemIEs_tags_25) + /sizeof(asn_DEF_E2connectionSetupFailed_ItemIEs_tags_25[0]), /* 1 */ + asn_DEF_E2connectionSetupFailed_ItemIEs_tags_25, /* Same as above */ + sizeof(asn_DEF_E2connectionSetupFailed_ItemIEs_tags_25) + /sizeof(asn_DEF_E2connectionSetupFailed_ItemIEs_tags_25[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionSetupFailed_ItemIEs_25, + 3, /* Elements count */ + &asn_SPC_E2connectionSetupFailed_ItemIEs_specs_25 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_32[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAddition_ItemIEs__value, choice.E2nodeComponentConfigAddition_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeComponentConfigAddition_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeComponentConfigAddition-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_32[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* E2nodeComponentConfigAddition-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_32 = { + sizeof(struct E2nodeComponentConfigAddition_ItemIEs__value), + offsetof(struct E2nodeComponentConfigAddition_ItemIEs__value, _asn_ctx), + offsetof(struct E2nodeComponentConfigAddition_ItemIEs__value, present), + sizeof(((struct E2nodeComponentConfigAddition_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_32, + 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_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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_32, + 1, /* Elements count */ + &asn_SPC_value_specs_32 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAddition_ItemIEs_29[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAddition_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_30, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_30, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_29 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAddition_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_E2nodeComponentConfigAddition_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_31, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_31, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_29 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAddition_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_32, + select_E2nodeComponentConfigAddition_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_32, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_32, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_29 + }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigAddition_ItemIEs_tags_29[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigAddition_ItemIEs_tag2el_29[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigAddition_ItemIEs_specs_29 = { + sizeof(struct E2nodeComponentConfigAddition_ItemIEs), + offsetof(struct E2nodeComponentConfigAddition_ItemIEs, _asn_ctx), + asn_MAP_E2nodeComponentConfigAddition_ItemIEs_tag2el_29, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigAddition_ItemIEs = { + "E2nodeComponentConfigAddition-ItemIEs", + "E2nodeComponentConfigAddition-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigAddition_ItemIEs_tags_29, + sizeof(asn_DEF_E2nodeComponentConfigAddition_ItemIEs_tags_29) + /sizeof(asn_DEF_E2nodeComponentConfigAddition_ItemIEs_tags_29[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigAddition_ItemIEs_tags_29, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigAddition_ItemIEs_tags_29) + /sizeof(asn_DEF_E2nodeComponentConfigAddition_ItemIEs_tags_29[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigAddition_ItemIEs_29, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigAddition_ItemIEs_specs_29 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_36[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdate_ItemIEs__value, choice.E2nodeComponentConfigUpdate_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeComponentConfigUpdate_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeComponentConfigUpdate-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_36[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* E2nodeComponentConfigUpdate-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_36 = { + sizeof(struct E2nodeComponentConfigUpdate_ItemIEs__value), + offsetof(struct E2nodeComponentConfigUpdate_ItemIEs__value, _asn_ctx), + offsetof(struct E2nodeComponentConfigUpdate_ItemIEs__value, present), + sizeof(((struct E2nodeComponentConfigUpdate_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_36, + 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_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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_36, + 1, /* Elements count */ + &asn_SPC_value_specs_36 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdate_ItemIEs_33[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdate_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_34, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_34, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_33 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdate_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_E2nodeComponentConfigUpdate_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_35, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_35, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_33 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdate_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_36, + select_E2nodeComponentConfigUpdate_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_36, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_36, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_33 + }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigUpdate_ItemIEs_tags_33[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigUpdate_ItemIEs_tag2el_33[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigUpdate_ItemIEs_specs_33 = { + sizeof(struct E2nodeComponentConfigUpdate_ItemIEs), + offsetof(struct E2nodeComponentConfigUpdate_ItemIEs, _asn_ctx), + asn_MAP_E2nodeComponentConfigUpdate_ItemIEs_tag2el_33, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigUpdate_ItemIEs = { + "E2nodeComponentConfigUpdate-ItemIEs", + "E2nodeComponentConfigUpdate-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigUpdate_ItemIEs_tags_33, + sizeof(asn_DEF_E2nodeComponentConfigUpdate_ItemIEs_tags_33) + /sizeof(asn_DEF_E2nodeComponentConfigUpdate_ItemIEs_tags_33[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigUpdate_ItemIEs_tags_33, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigUpdate_ItemIEs_tags_33) + /sizeof(asn_DEF_E2nodeComponentConfigUpdate_ItemIEs_tags_33[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigUpdate_ItemIEs_33, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigUpdate_ItemIEs_specs_33 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_40[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemoval_ItemIEs__value, choice.E2nodeComponentConfigRemoval_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeComponentConfigRemoval_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeComponentConfigRemoval-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_40[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* E2nodeComponentConfigRemoval-Item */ }; -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_CHOICE_specifics_t asn_SPC_value_specs_40 = { + sizeof(struct E2nodeComponentConfigRemoval_ItemIEs__value), + offsetof(struct E2nodeComponentConfigRemoval_ItemIEs__value, _asn_ctx), + offsetof(struct E2nodeComponentConfigRemoval_ItemIEs__value, present), + sizeof(((struct E2nodeComponentConfigRemoval_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_40, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ }; -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 /* 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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_40, + 1, /* Elements count */ + &asn_SPC_value_specs_40 /* Additional specs */ }; -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 */ + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemoval_ItemIEs_37[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemoval_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_38, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_38, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_37 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemoval_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_E2nodeComponentConfigRemoval_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_39, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_39, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_37 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemoval_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_40, + select_E2nodeComponentConfigRemoval_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_40, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_40, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_37 + }, + 0, 0, /* No default value */ + "value" + }, }; -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 const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigRemoval_ItemIEs_tags_37[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -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 const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigRemoval_ItemIEs_tag2el_37[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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 */ +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigRemoval_ItemIEs_specs_37 = { + sizeof(struct E2nodeComponentConfigRemoval_ItemIEs), + offsetof(struct E2nodeComponentConfigRemoval_ItemIEs, _asn_ctx), + asn_MAP_E2nodeComponentConfigRemoval_ItemIEs_tag2el_37, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigRemoval_ItemIEs = { + "E2nodeComponentConfigRemoval-ItemIEs", + "E2nodeComponentConfigRemoval-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigRemoval_ItemIEs_tags_37, + sizeof(asn_DEF_E2nodeComponentConfigRemoval_ItemIEs_tags_37) + /sizeof(asn_DEF_E2nodeComponentConfigRemoval_ItemIEs_tags_37[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigRemoval_ItemIEs_tags_37, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigRemoval_ItemIEs_tags_37) + /sizeof(asn_DEF_E2nodeComponentConfigRemoval_ItemIEs_tags_37[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigRemoval_ItemIEs_37, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigRemoval_ItemIEs_specs_37 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_44[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeTNLassociationRemoval_ItemIEs__value, choice.E2nodeTNLassociationRemoval_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeTNLassociationRemoval_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeTNLassociationRemoval-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_44[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* E2nodeTNLassociationRemoval-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_44 = { + sizeof(struct E2nodeTNLassociationRemoval_ItemIEs__value), + offsetof(struct E2nodeTNLassociationRemoval_ItemIEs__value, _asn_ctx), + offsetof(struct E2nodeTNLassociationRemoval_ItemIEs__value, present), + sizeof(((struct E2nodeTNLassociationRemoval_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_44, + 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_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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_44, + 1, /* Elements count */ + &asn_SPC_value_specs_44 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2nodeTNLassociationRemoval_ItemIEs_41[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeTNLassociationRemoval_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_42, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_42, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_41 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeTNLassociationRemoval_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_E2nodeTNLassociationRemoval_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_43, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_43, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_41 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2nodeTNLassociationRemoval_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_44, + select_E2nodeTNLassociationRemoval_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_44, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_44, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_41 + }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeTNLassociationRemoval_ItemIEs_tags_41[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeTNLassociationRemoval_ItemIEs_tag2el_41[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeTNLassociationRemoval_ItemIEs_specs_41 = { + sizeof(struct E2nodeTNLassociationRemoval_ItemIEs), + offsetof(struct E2nodeTNLassociationRemoval_ItemIEs, _asn_ctx), + asn_MAP_E2nodeTNLassociationRemoval_ItemIEs_tag2el_41, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeTNLassociationRemoval_ItemIEs = { + "E2nodeTNLassociationRemoval-ItemIEs", + "E2nodeTNLassociationRemoval-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeTNLassociationRemoval_ItemIEs_tags_41, + sizeof(asn_DEF_E2nodeTNLassociationRemoval_ItemIEs_tags_41) + /sizeof(asn_DEF_E2nodeTNLassociationRemoval_ItemIEs_tags_41[0]), /* 1 */ + asn_DEF_E2nodeTNLassociationRemoval_ItemIEs_tags_41, /* Same as above */ + sizeof(asn_DEF_E2nodeTNLassociationRemoval_ItemIEs_tags_41) + /sizeof(asn_DEF_E2nodeTNLassociationRemoval_ItemIEs_tags_41[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeTNLassociationRemoval_ItemIEs_41, + 3, /* Elements count */ + &asn_SPC_E2nodeTNLassociationRemoval_ItemIEs_specs_41 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_48[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAdditionAck_ItemIEs__value, choice.E2nodeComponentConfigAdditionAck_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeComponentConfigAdditionAck_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeComponentConfigAdditionAck-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_48[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* E2nodeComponentConfigAdditionAck-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_48 = { + sizeof(struct E2nodeComponentConfigAdditionAck_ItemIEs__value), + offsetof(struct E2nodeComponentConfigAdditionAck_ItemIEs__value, _asn_ctx), + offsetof(struct E2nodeComponentConfigAdditionAck_ItemIEs__value, present), + sizeof(((struct E2nodeComponentConfigAdditionAck_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_48, + 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_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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_48, + 1, /* Elements count */ + &asn_SPC_value_specs_48 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigAdditionAck_ItemIEs_45[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAdditionAck_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_46, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_46, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_45 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAdditionAck_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_E2nodeComponentConfigAdditionAck_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_47, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_47, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_45 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigAdditionAck_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_48, + select_E2nodeComponentConfigAdditionAck_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_48, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_48, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_45 + }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigAdditionAck_ItemIEs_tags_45[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigAdditionAck_ItemIEs_tag2el_45[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigAdditionAck_ItemIEs_specs_45 = { + sizeof(struct E2nodeComponentConfigAdditionAck_ItemIEs), + offsetof(struct E2nodeComponentConfigAdditionAck_ItemIEs, _asn_ctx), + asn_MAP_E2nodeComponentConfigAdditionAck_ItemIEs_tag2el_45, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigAdditionAck_ItemIEs = { + "E2nodeComponentConfigAdditionAck-ItemIEs", + "E2nodeComponentConfigAdditionAck-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigAdditionAck_ItemIEs_tags_45, + sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_ItemIEs_tags_45) + /sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_ItemIEs_tags_45[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigAdditionAck_ItemIEs_tags_45, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_ItemIEs_tags_45) + /sizeof(asn_DEF_E2nodeComponentConfigAdditionAck_ItemIEs_tags_45[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigAdditionAck_ItemIEs_45, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigAdditionAck_ItemIEs_specs_45 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_52[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdateAck_ItemIEs__value, choice.E2nodeComponentConfigUpdateAck_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeComponentConfigUpdateAck_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeComponentConfigUpdateAck-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_52[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* E2nodeComponentConfigUpdateAck-Item */ }; -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_CHOICE_specifics_t asn_SPC_value_specs_52 = { + sizeof(struct E2nodeComponentConfigUpdateAck_ItemIEs__value), + offsetof(struct E2nodeComponentConfigUpdateAck_ItemIEs__value, _asn_ctx), + offsetof(struct E2nodeComponentConfigUpdateAck_ItemIEs__value, present), + sizeof(((struct E2nodeComponentConfigUpdateAck_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_52, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ }; -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 /* 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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_52, + 1, /* Elements count */ + &asn_SPC_value_specs_52 /* Additional specs */ }; -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 */ + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigUpdateAck_ItemIEs_49[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdateAck_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_50, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_50, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_49 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdateAck_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_E2nodeComponentConfigUpdateAck_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_51, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_51, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_49 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigUpdateAck_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_52, + select_E2nodeComponentConfigUpdateAck_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_52, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_52, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_49 + }, + 0, 0, /* No default value */ + "value" + }, }; -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 const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigUpdateAck_ItemIEs_tags_49[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -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 const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigUpdateAck_ItemIEs_tag2el_49[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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 */ +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigUpdateAck_ItemIEs_specs_49 = { + sizeof(struct E2nodeComponentConfigUpdateAck_ItemIEs), + offsetof(struct E2nodeComponentConfigUpdateAck_ItemIEs, _asn_ctx), + asn_MAP_E2nodeComponentConfigUpdateAck_ItemIEs_tag2el_49, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ }; -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 */ +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigUpdateAck_ItemIEs = { + "E2nodeComponentConfigUpdateAck-ItemIEs", + "E2nodeComponentConfigUpdateAck-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigUpdateAck_ItemIEs_tags_49, + sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_ItemIEs_tags_49) + /sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_ItemIEs_tags_49[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigUpdateAck_ItemIEs_tags_49, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_ItemIEs_tags_49) + /sizeof(asn_DEF_E2nodeComponentConfigUpdateAck_ItemIEs_tags_49[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigUpdateAck_ItemIEs_49, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigUpdateAck_ItemIEs_specs_49 /* Additional specs */ }; -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_TYPE_member_t asn_MBR_value_56[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemovalAck_ItemIEs__value, choice.E2nodeComponentConfigRemovalAck_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeComponentConfigRemovalAck_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeComponentConfigRemovalAck-Item" + }, }; -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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_56[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* E2nodeComponentConfigRemovalAck-Item */ }; -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_CHOICE_specifics_t asn_SPC_value_specs_56 = { + sizeof(struct E2nodeComponentConfigRemovalAck_ItemIEs__value), + offsetof(struct E2nodeComponentConfigRemovalAck_ItemIEs__value, _asn_ctx), + offsetof(struct E2nodeComponentConfigRemovalAck_ItemIEs__value, present), + sizeof(((struct E2nodeComponentConfigRemovalAck_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_56, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ }; -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 /* 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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_56, + 1, /* Elements count */ + &asn_SPC_value_specs_56 /* Additional specs */ }; -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 */ + +asn_TYPE_member_t asn_MBR_E2nodeComponentConfigRemovalAck_ItemIEs_53[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemovalAck_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_54, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_54, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_53 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemovalAck_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_E2nodeComponentConfigRemovalAck_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_55, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_55, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_53 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2nodeComponentConfigRemovalAck_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_56, + select_E2nodeComponentConfigRemovalAck_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_56, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_56, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_53 + }, + 0, 0, /* No default value */ + "value" + }, }; -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 const ber_tlv_tag_t asn_DEF_E2nodeComponentConfigRemovalAck_ItemIEs_tags_53[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -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 const asn_TYPE_tag2member_t asn_MAP_E2nodeComponentConfigRemovalAck_ItemIEs_tag2el_53[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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 */ +asn_SEQUENCE_specifics_t asn_SPC_E2nodeComponentConfigRemovalAck_ItemIEs_specs_53 = { + sizeof(struct E2nodeComponentConfigRemovalAck_ItemIEs), + offsetof(struct E2nodeComponentConfigRemovalAck_ItemIEs, _asn_ctx), + asn_MAP_E2nodeComponentConfigRemovalAck_ItemIEs_tag2el_53, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ }; -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 */ +asn_TYPE_descriptor_t asn_DEF_E2nodeComponentConfigRemovalAck_ItemIEs = { + "E2nodeComponentConfigRemovalAck-ItemIEs", + "E2nodeComponentConfigRemovalAck-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2nodeComponentConfigRemovalAck_ItemIEs_tags_53, + sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_ItemIEs_tags_53) + /sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_ItemIEs_tags_53[0]), /* 1 */ + asn_DEF_E2nodeComponentConfigRemovalAck_ItemIEs_tags_53, /* Same as above */ + sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_ItemIEs_tags_53) + /sizeof(asn_DEF_E2nodeComponentConfigRemovalAck_ItemIEs_tags_53[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigRemovalAck_ItemIEs_53, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigRemovalAck_ItemIEs_specs_53 /* Additional specs */ }; -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_TYPE_member_t asn_MBR_value_60[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs__value, choice.RANfunction_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunction_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RANfunction-Item" + }, }; -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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_60[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunction-Item */ }; -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_CHOICE_specifics_t asn_SPC_value_specs_60 = { + 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_60, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ }; -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 /* 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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_60, + 1, /* Elements count */ + &asn_SPC_value_specs_60 /* Additional specs */ }; -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 */ + +asn_TYPE_member_t asn_MBR_RANfunction_ItemIEs_57[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_58, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_58, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_57 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_RANfunction_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_59, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_59, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_57 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_60, + select_RANfunction_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_60, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_60, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_57 + }, + 0, 0, /* No default value */ + "value" + }, }; -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 const ber_tlv_tag_t asn_DEF_RANfunction_ItemIEs_tags_57[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -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 const asn_TYPE_tag2member_t asn_MAP_RANfunction_ItemIEs_tag2el_57[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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 */ +asn_SEQUENCE_specifics_t asn_SPC_RANfunction_ItemIEs_specs_57 = { + sizeof(struct RANfunction_ItemIEs), + offsetof(struct RANfunction_ItemIEs, _asn_ctx), + asn_MAP_RANfunction_ItemIEs_tag2el_57, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ }; -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 */ +asn_TYPE_descriptor_t asn_DEF_RANfunction_ItemIEs = { + "RANfunction-ItemIEs", + "RANfunction-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RANfunction_ItemIEs_tags_57, + sizeof(asn_DEF_RANfunction_ItemIEs_tags_57) + /sizeof(asn_DEF_RANfunction_ItemIEs_tags_57[0]), /* 1 */ + asn_DEF_RANfunction_ItemIEs_tags_57, /* Same as above */ + sizeof(asn_DEF_RANfunction_ItemIEs_tags_57) + /sizeof(asn_DEF_RANfunction_ItemIEs_tags_57[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RANfunction_ItemIEs_57, + 3, /* Elements count */ + &asn_SPC_RANfunction_ItemIEs_specs_57 /* Additional specs */ }; -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_TYPE_member_t asn_MBR_value_64[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs__value, choice.RANfunctionID_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionID_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RANfunctionID-Item" + }, }; -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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_64[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionID-Item */ }; -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_CHOICE_specifics_t asn_SPC_value_specs_64 = { + 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_64, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ }; -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 /* 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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_64, + 1, /* Elements count */ + &asn_SPC_value_specs_64 /* Additional specs */ }; -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 */ + +asn_TYPE_member_t asn_MBR_RANfunctionID_ItemIEs_61[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_62, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_62, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_61 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_RANfunctionID_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_63, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_63, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_61 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_64, + select_RANfunctionID_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_64, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_64, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_61 + }, + 0, 0, /* No default value */ + "value" + }, }; -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 const ber_tlv_tag_t asn_DEF_RANfunctionID_ItemIEs_tags_61[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -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 const asn_TYPE_tag2member_t asn_MAP_RANfunctionID_ItemIEs_tag2el_61[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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 */ +asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_ItemIEs_specs_61 = { + sizeof(struct RANfunctionID_ItemIEs), + offsetof(struct RANfunctionID_ItemIEs, _asn_ctx), + asn_MAP_RANfunctionID_ItemIEs_tag2el_61, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ }; -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 */ +asn_TYPE_descriptor_t asn_DEF_RANfunctionID_ItemIEs = { + "RANfunctionID-ItemIEs", + "RANfunctionID-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RANfunctionID_ItemIEs_tags_61, + sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_61) + /sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_61[0]), /* 1 */ + asn_DEF_RANfunctionID_ItemIEs_tags_61, /* Same as above */ + sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_61) + /sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_61[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RANfunctionID_ItemIEs_61, + 3, /* Elements count */ + &asn_SPC_RANfunctionID_ItemIEs_specs_61 /* Additional specs */ }; -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_TYPE_member_t asn_MBR_value_68[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs__value, choice.RANfunctionIDcause_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionIDcause_Item, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RANfunctionIDcause-Item" + }, }; -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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_68[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionIDcause-Item */ }; -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_CHOICE_specifics_t asn_SPC_value_specs_68 = { + 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_68, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ }; -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 /* 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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_68, + 1, /* Elements count */ + &asn_SPC_value_specs_68 /* Additional specs */ }; -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 */ + +asn_TYPE_member_t asn_MBR_RANfunctionIDcause_ItemIEs_65[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_66, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_66, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_65 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_RANfunctionIDcause_ItemIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_67, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_67, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_65 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_68, + select_RANfunctionIDcause_ItemIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_68, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_68, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_65 + }, + 0, 0, /* No default value */ + "value" + }, }; -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 const ber_tlv_tag_t asn_DEF_RANfunctionIDcause_ItemIEs_tags_65[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -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 const asn_TYPE_tag2member_t asn_MAP_RANfunctionIDcause_ItemIEs_tag2el_65[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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 */ +asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_ItemIEs_specs_65 = { + sizeof(struct RANfunctionIDcause_ItemIEs), + offsetof(struct RANfunctionIDcause_ItemIEs, _asn_ctx), + asn_MAP_RANfunctionIDcause_ItemIEs_tag2el_65, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ }; -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 */ +asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_ItemIEs = { + "RANfunctionIDcause-ItemIEs", + "RANfunctionIDcause-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RANfunctionIDcause_ItemIEs_tags_65, + sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_65) + /sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_65[0]), /* 1 */ + asn_DEF_RANfunctionIDcause_ItemIEs_tags_65, /* Same as above */ + sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_65) + /sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_65[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RANfunctionIDcause_ItemIEs_65, + 3, /* Elements count */ + &asn_SPC_RANfunctionIDcause_ItemIEs_specs_65 /* Additional specs */ }; -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_TYPE_member_t asn_MBR_value_72[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RICsubscriptionDetails" + }, }; -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 const unsigned asn_MAP_value_to_canonical_72[] = { 1, 0, 2 }; +static const unsigned asn_MAP_value_from_canonical_72[] = { 1, 0, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_72[] = { + { (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_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_CHOICE_specifics_t asn_SPC_value_specs_72 = { + 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_72, + 3, /* Count of tags in the map */ + asn_MAP_value_to_canonical_72, + asn_MAP_value_from_canonical_72, + -1 /* Extensions start */ }; -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 /* 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) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_72, + 3, /* Elements count */ + &asn_SPC_value_specs_72 /* Additional specs */ }; -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 */ + +asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_IEs_69[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, id), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_ProtocolIE_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_70, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_70, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_69 + }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, criticality), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_Criticality, + select_RICsubscriptionRequest_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_71, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_71, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_69 + }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, value), + -1 /* Ambiguous tag (ANY?) */, + 0, + &asn_DEF_value_72, + select_RICsubscriptionRequest_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_72, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_72, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_69 + }, + 0, 0, /* No default value */ + "value" + }, }; -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 const ber_tlv_tag_t asn_DEF_RICsubscriptionRequest_IEs_tags_69[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -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 const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionRequest_IEs_tag2el_69[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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 */ +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_IEs_specs_69 = { + sizeof(struct RICsubscriptionRequest_IEs), + offsetof(struct RICsubscriptionRequest_IEs, _asn_ctx), + asn_MAP_RICsubscriptionRequest_IEs_tag2el_69, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ }; -static asn_TYPE_member_t asn_MBR_value_4[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs__value, choice.RICaction_ToBeSetup_Item), +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest_IEs = { + "RICsubscriptionRequest-IEs", + "RICsubscriptionRequest-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionRequest_IEs_tags_69, + sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_69) + /sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_69[0]), /* 1 */ + asn_DEF_RICsubscriptionRequest_IEs_tags_69, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_69) + /sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_69[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICsubscriptionRequest_IEs_69, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionRequest_IEs_specs_69 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_76[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICrequestID), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICaction_ToBeSetup_Item, + &asn_DEF_RICrequestID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICaction-ToBeSetup-Item" + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RICaction-NotAdmitted-List" }, }; -static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-ToBeSetup-Item */ +static const unsigned asn_MAP_value_to_canonical_76[] = { 1, 0, 2, 3 }; +static const unsigned asn_MAP_value_from_canonical_76[] = { 1, 0, 2, 3 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_76[] = { + { (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_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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_76 = { + 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_76, + 4, /* Count of tags in the map */ + asn_MAP_value_to_canonical_76, + asn_MAP_value_from_canonical_76, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_4 = { +asn_TYPE_descriptor_t asn_DEF_value_76 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -4340,98 +10589,208 @@ asn_TYPE_descriptor_t asn_DEF_value_4 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_76, + 4, /* Elements count */ + &asn_SPC_value_specs_76 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_ItemIEs_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, id), +asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_IEs_73[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_2, &asn_PER_memb_id_constr_2, memb_id_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_74, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_74, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_73 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICaction_ToBeSetup_ItemIEs_criticality_type, - { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + select_RICsubscriptionResponse_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_75, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_75, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_73 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_76, + select_RICsubscriptionResponse_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_76, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_76, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_73 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[] = { +static const ber_tlv_tag_t asn_DEF_RICsubscriptionResponse_IEs_tags_73[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICaction_ToBeSetup_ItemIEs_tag2el_1[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionResponse_IEs_tag2el_73[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_IEs_specs_73 = { + sizeof(struct RICsubscriptionResponse_IEs), + offsetof(struct RICsubscriptionResponse_IEs, _asn_ctx), + asn_MAP_RICsubscriptionResponse_IEs_tag2el_73, 2, /* 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_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse_IEs = { + "RICsubscriptionResponse-IEs", + "RICsubscriptionResponse-IEs", &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, + asn_DEF_RICsubscriptionResponse_IEs_tags_73, + sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_73) + /sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_73[0]), /* 1 */ + asn_DEF_RICsubscriptionResponse_IEs_tags_73, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_73) + /sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_73[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICsubscriptionResponse_IEs_73, 3, /* Elements count */ - &asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1 /* Additional specs */ + &asn_SPC_RICsubscriptionResponse_IEs_specs_73 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_8[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs__value, choice.RICaction_Admitted_Item), +static asn_TYPE_member_t asn_MBR_value_80[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RICrequestID), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICaction_Admitted_Item, + &asn_DEF_RICrequestID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICaction-Admitted-Item" + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.Cause), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_Cause, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "Cause" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.CriticalityDiagnostics), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnostics, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "CriticalityDiagnostics" }, }; -static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_8[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-Admitted-Item */ +static const unsigned asn_MAP_value_to_canonical_80[] = { 1, 0, 3, 2 }; +static const unsigned asn_MAP_value_from_canonical_80[] = { 1, 0, 3, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_80[] = { + { (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 }, /* CriticalityDiagnostics */ + { (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 }, /* e2Node */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 2, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 2, 0, 0 } /* misc */ }; -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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_80 = { + 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_80, + 9, /* 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_8 = { +asn_TYPE_descriptor_t asn_DEF_value_80 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -4439,98 +10798,167 @@ asn_TYPE_descriptor_t asn_DEF_value_8 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_80, + 4, /* Elements count */ + &asn_SPC_value_specs_80 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICaction_Admitted_ItemIEs_5[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, id), +asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_IEs_77[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_6, &asn_PER_memb_id_constr_6, memb_id_constraint_5 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_78, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_78, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_77 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICaction_Admitted_ItemIEs_criticality_type, - { &asn_OER_memb_criticality_constr_7, &asn_PER_memb_criticality_constr_7, memb_criticality_constraint_5 }, + select_RICsubscriptionFailure_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_79, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_79, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_77 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_80, + select_RICsubscriptionFailure_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_80, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_80, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_77 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_ItemIEs_tags_5[] = { +static const ber_tlv_tag_t asn_DEF_RICsubscriptionFailure_IEs_tags_77[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICaction_Admitted_ItemIEs_tag2el_5[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionFailure_IEs_tag2el_77[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_IEs_specs_77 = { + sizeof(struct RICsubscriptionFailure_IEs), + offsetof(struct RICsubscriptionFailure_IEs, _asn_ctx), + asn_MAP_RICsubscriptionFailure_IEs_tag2el_77, 2, /* 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_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure_IEs = { + "RICsubscriptionFailure-IEs", + "RICsubscriptionFailure-IEs", &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, + asn_DEF_RICsubscriptionFailure_IEs_tags_77, + sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_77) + /sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_77[0]), /* 1 */ + asn_DEF_RICsubscriptionFailure_IEs_tags_77, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_77) + /sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_77[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICsubscriptionFailure_IEs_77, 3, /* Elements count */ - &asn_SPC_RICaction_Admitted_ItemIEs_specs_5 /* Additional specs */ + &asn_SPC_RICsubscriptionFailure_IEs_specs_77 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_12[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs__value, choice.RICaction_NotAdmitted_Item), +static asn_TYPE_member_t asn_MBR_value_84[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs__value, choice.RICrequestID), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICaction_NotAdmitted_Item, + &asn_DEF_RICrequestID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICaction-NotAdmitted-Item" + "RANfunctionID" }, }; -static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_12[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-NotAdmitted-Item */ +static const unsigned asn_MAP_value_to_canonical_84[] = { 1, 0 }; +static const unsigned asn_MAP_value_from_canonical_84[] = { 1, 0 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_84[] = { + { (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_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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_84 = { + 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_84, + 2, /* Count of tags in the map */ + asn_MAP_value_to_canonical_84, + asn_MAP_value_from_canonical_84, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_12 = { +asn_TYPE_descriptor_t asn_DEF_value_84 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -4538,98 +10966,167 @@ asn_TYPE_descriptor_t asn_DEF_value_12 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_84, + 2, /* Elements count */ + &asn_SPC_value_specs_84 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_ItemIEs_9[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, id), +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_IEs_81[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_10, &asn_PER_memb_id_constr_10, memb_id_constraint_9 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_82, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_82, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_81 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICaction_NotAdmitted_ItemIEs_criticality_type, - { &asn_OER_memb_criticality_constr_11, &asn_PER_memb_criticality_constr_11, memb_criticality_constraint_9 }, + select_RICsubscriptionDeleteRequest_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_83, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_83, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_81 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_84, + select_RICsubscriptionDeleteRequest_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_84, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_84, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_81 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[] = { +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_81[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICaction_NotAdmitted_ItemIEs_tag2el_9[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequest_IEs_tag2el_81[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_81 = { + sizeof(struct RICsubscriptionDeleteRequest_IEs), + offsetof(struct RICsubscriptionDeleteRequest_IEs, _asn_ctx), + asn_MAP_RICsubscriptionDeleteRequest_IEs_tag2el_81, 2, /* 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_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest_IEs = { + "RICsubscriptionDeleteRequest-IEs", + "RICsubscriptionDeleteRequest-IEs", &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, + asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_81, + sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_81) + /sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_81[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_81, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_81) + /sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_81[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICsubscriptionDeleteRequest_IEs_81, 3, /* Elements count */ - &asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9 /* Additional specs */ + &asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_81 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_16[] = { - { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs__value, choice.RANfunction_Item), +static asn_TYPE_member_t asn_MBR_value_88[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs__value, choice.RICrequestID), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RANfunction_Item, + &asn_DEF_RICrequestID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RANfunction-Item" + "RANfunctionID" }, }; -static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_16[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunction-Item */ +static const unsigned asn_MAP_value_to_canonical_88[] = { 1, 0 }; +static const unsigned asn_MAP_value_from_canonical_88[] = { 1, 0 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_88[] = { + { (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_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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_88 = { + 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_88, + 2, /* Count of tags in the map */ + asn_MAP_value_to_canonical_88, + asn_MAP_value_from_canonical_88, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_16 = { +asn_TYPE_descriptor_t asn_DEF_value_88 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -4637,98 +11134,208 @@ asn_TYPE_descriptor_t asn_DEF_value_16 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_88, + 2, /* Elements count */ + &asn_SPC_value_specs_88 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RANfunction_ItemIEs_13[] = { - { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, id), +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_IEs_85[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_14, &asn_PER_memb_id_constr_14, memb_id_constraint_13 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_86, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_86, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_85 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RANfunction_ItemIEs_criticality_type, - { &asn_OER_memb_criticality_constr_15, &asn_PER_memb_criticality_constr_15, memb_criticality_constraint_13 }, + select_RICsubscriptionDeleteResponse_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_87, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_87, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_85 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_88, + select_RICsubscriptionDeleteResponse_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_88, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_88, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_85 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RANfunction_ItemIEs_tags_13[] = { +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_85[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RANfunction_ItemIEs_tag2el_13[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteResponse_IEs_tag2el_85[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_85 = { + sizeof(struct RICsubscriptionDeleteResponse_IEs), + offsetof(struct RICsubscriptionDeleteResponse_IEs, _asn_ctx), + asn_MAP_RICsubscriptionDeleteResponse_IEs_tag2el_85, 2, /* 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_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse_IEs = { + "RICsubscriptionDeleteResponse-IEs", + "RICsubscriptionDeleteResponse-IEs", &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, + asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_85, + sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_85) + /sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_85[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_85, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_85) + /sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_85[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICsubscriptionDeleteResponse_IEs_85, 3, /* Elements count */ - &asn_SPC_RANfunction_ItemIEs_specs_13 /* Additional specs */ + &asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_85 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_20[] = { - { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs__value, choice.RANfunctionID_Item), +static asn_TYPE_member_t asn_MBR_value_92[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RICrequestID), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RANfunctionID_Item, + &asn_DEF_RICrequestID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RANfunctionID-Item" + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.Cause), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_Cause, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "Cause" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.CriticalityDiagnostics), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnostics, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "CriticalityDiagnostics" }, }; -static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_20[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionID-Item */ +static const unsigned asn_MAP_value_to_canonical_92[] = { 1, 0, 3, 2 }; +static const unsigned asn_MAP_value_from_canonical_92[] = { 1, 0, 3, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_92[] = { + { (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 }, /* CriticalityDiagnostics */ + { (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 }, /* e2Node */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 2, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 2, 0, 0 } /* misc */ }; -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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_92 = { + 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_92, + 9, /* Count of tags in the map */ + asn_MAP_value_to_canonical_92, + asn_MAP_value_from_canonical_92, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_20 = { +asn_TYPE_descriptor_t asn_DEF_value_92 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -4736,98 +11343,146 @@ asn_TYPE_descriptor_t asn_DEF_value_20 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_92, + 4, /* Elements count */ + &asn_SPC_value_specs_92 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RANfunctionID_ItemIEs_17[] = { - { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, id), +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_IEs_89[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_18, &asn_PER_memb_id_constr_18, memb_id_constraint_17 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_90, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_90, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_89 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RANfunctionID_ItemIEs_criticality_type, - { &asn_OER_memb_criticality_constr_19, &asn_PER_memb_criticality_constr_19, memb_criticality_constraint_17 }, + select_RICsubscriptionDeleteFailure_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_91, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_91, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_89 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_92, + select_RICsubscriptionDeleteFailure_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_92, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_92, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_89 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RANfunctionID_ItemIEs_tags_17[] = { +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_89[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RANfunctionID_ItemIEs_tag2el_17[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteFailure_IEs_tag2el_89[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_89 = { + sizeof(struct RICsubscriptionDeleteFailure_IEs), + offsetof(struct RICsubscriptionDeleteFailure_IEs, _asn_ctx), + asn_MAP_RICsubscriptionDeleteFailure_IEs_tag2el_89, 2, /* 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_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure_IEs = { + "RICsubscriptionDeleteFailure-IEs", + "RICsubscriptionDeleteFailure-IEs", &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, + asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_89, + sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_89) + /sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_89[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_89, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_89) + /sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_89[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICsubscriptionDeleteFailure_IEs_89, 3, /* Elements count */ - &asn_SPC_RANfunctionID_ItemIEs_specs_17 /* Additional specs */ + &asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_89 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_24[] = { - { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs__value, choice.RANfunctionIDcause_Item), +static asn_TYPE_member_t asn_MBR_value_96[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequired_IEs__value, choice.RICsubscription_List_withCause), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RANfunctionIDcause_Item, + &asn_DEF_RICsubscription_List_withCause, 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "RANfunctionIDcause-Item" + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 }, -}; -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, + 0, 0, /* No default value */ + "RICsubscription-List-withCause" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_96[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICsubscription-List-withCause */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_96 = { + sizeof(struct RICsubscriptionDeleteRequired_IEs__value), + offsetof(struct RICsubscriptionDeleteRequired_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionDeleteRequired_IEs__value, present), + sizeof(((struct RICsubscriptionDeleteRequired_IEs__value *)0)->present), + asn_MAP_value_tag2el_96, 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 = { +asn_TYPE_descriptor_t asn_DEF_value_96 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -4835,121 +11490,275 @@ asn_TYPE_descriptor_t asn_DEF_value_24 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, 0, OPEN_TYPE_constraint }, - asn_MBR_value_24, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_96, 1, /* Elements count */ - &asn_SPC_value_specs_24 /* Additional specs */ + &asn_SPC_value_specs_96 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RANfunctionIDcause_ItemIEs_21[] = { - { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, id), +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequired_IEs_93[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequired_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_22, &asn_PER_memb_id_constr_22, memb_id_constraint_21 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_94, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_94, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_93 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequired_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RANfunctionIDcause_ItemIEs_criticality_type, - { &asn_OER_memb_criticality_constr_23, &asn_PER_memb_criticality_constr_23, memb_criticality_constraint_21 }, + select_RICsubscriptionDeleteRequired_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_95, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_95, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_93 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequired_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_96, + select_RICsubscriptionDeleteRequired_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_96, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_96, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_93 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[] = { +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequired_IEs_tags_93[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RANfunctionIDcause_ItemIEs_tag2el_21[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequired_IEs_tag2el_93[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequired_IEs_specs_93 = { + sizeof(struct RICsubscriptionDeleteRequired_IEs), + offsetof(struct RICsubscriptionDeleteRequired_IEs, _asn_ctx), + asn_MAP_RICsubscriptionDeleteRequired_IEs_tag2el_93, 2, /* 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_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequired_IEs = { + "RICsubscriptionDeleteRequired-IEs", + "RICsubscriptionDeleteRequired-IEs", &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, + asn_DEF_RICsubscriptionDeleteRequired_IEs_tags_93, + sizeof(asn_DEF_RICsubscriptionDeleteRequired_IEs_tags_93) + /sizeof(asn_DEF_RICsubscriptionDeleteRequired_IEs_tags_93[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteRequired_IEs_tags_93, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteRequired_IEs_tags_93) + /sizeof(asn_DEF_RICsubscriptionDeleteRequired_IEs_tags_93[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICsubscriptionDeleteRequired_IEs_93, 3, /* Elements count */ - &asn_SPC_RANfunctionIDcause_ItemIEs_specs_21 /* Additional specs */ + &asn_SPC_RICsubscriptionDeleteRequired_IEs_specs_93 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_28[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RICrequestID), +static asn_TYPE_member_t asn_MBR_value_100[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICrequestID), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICrequestID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICrequestID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RANfunctionID), + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RANfunctionID), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_RANfunctionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RANfunctionID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RICsubscriptionDetails), - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, - &asn_DEF_RICsubscriptionDetails, + &asn_DEF_RICactionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICsubscriptionDetails" + "RICactionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationSN), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RICindicationSN, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RICcallProcessID" }, }; -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 const unsigned asn_MAP_value_to_canonical_100[] = { 1, 2, 3, 5, 6, 7, 4, 0 }; +static const unsigned asn_MAP_value_from_canonical_100[] = { 7, 0, 1, 2, 6, 3, 4, 5 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_100[] = { + { (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_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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_100 = { + 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_100, + 8, /* 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_28 = { +asn_TYPE_descriptor_t asn_DEF_value_100 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -4957,131 +11766,239 @@ asn_TYPE_descriptor_t asn_DEF_value_28 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_100, + 8, /* Elements count */ + &asn_SPC_value_specs_100 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_IEs_25[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, id), +asn_TYPE_member_t asn_MBR_RICindication_IEs_97[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_26, &asn_PER_memb_id_constr_26, memb_id_constraint_25 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_98, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_98, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_97 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICsubscriptionRequest_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_27, &asn_PER_memb_criticality_constr_27, memb_criticality_constraint_25 }, + select_RICindication_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_99, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_99, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_97 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_100, + select_RICindication_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_100, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_100, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_97 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICsubscriptionRequest_IEs_tags_25[] = { +static const ber_tlv_tag_t asn_DEF_RICindication_IEs_tags_97[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionRequest_IEs_tag2el_25[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICindication_IEs_tag2el_97[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_RICindication_IEs_specs_97 = { + sizeof(struct RICindication_IEs), + offsetof(struct RICindication_IEs, _asn_ctx), + asn_MAP_RICindication_IEs_tag2el_97, 2, /* 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_TYPE_descriptor_t asn_DEF_RICindication_IEs = { + "RICindication-IEs", + "RICindication-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, + asn_DEF_RICindication_IEs_tags_97, + sizeof(asn_DEF_RICindication_IEs_tags_97) + /sizeof(asn_DEF_RICindication_IEs_tags_97[0]), /* 1 */ + asn_DEF_RICindication_IEs_tags_97, /* Same as above */ + sizeof(asn_DEF_RICindication_IEs_tags_97) + /sizeof(asn_DEF_RICindication_IEs_tags_97[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICindication_IEs_97, 3, /* Elements count */ - &asn_SPC_RICsubscriptionRequest_IEs_specs_25 /* Additional specs */ + &asn_SPC_RICindication_IEs_specs_97 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_32[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICrequestID), +static asn_TYPE_member_t asn_MBR_value_104[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICrequestID), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICrequestID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICrequestID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RANfunctionID), + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RANfunctionID), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_RANfunctionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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)), + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcallProcessID), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 0, - &asn_DEF_RICaction_Admitted_List, + &asn_DEF_RICcallProcessID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICaction-Admitted-List" + "RICcallProcessID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICaction_NotAdmitted_List), - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolHeader), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 0, - &asn_DEF_RICaction_NotAdmitted_List, + &asn_DEF_RICcontrolHeader, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICaction-NotAdmitted-List" + "RICcontrolHeader" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolMessage), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcontrolMessage, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RICcontrolAckRequest" }, }; -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[] = { +static const unsigned asn_MAP_value_to_canonical_104[] = { 1, 2, 3, 4, 5, 0 }; +static const unsigned asn_MAP_value_from_canonical_104[] = { 5, 0, 1, 2, 3, 4 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_104[] = { { (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 */ + { (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_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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_104 = { + 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_104, + 6, /* Count of tags in the map */ + asn_MAP_value_to_canonical_104, + asn_MAP_value_from_canonical_104, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_32 = { +asn_TYPE_descriptor_t asn_DEF_value_104 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -5089,131 +12006,203 @@ asn_TYPE_descriptor_t asn_DEF_value_32 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_104, + 6, /* Elements count */ + &asn_SPC_value_specs_104 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_IEs_29[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, id), +asn_TYPE_member_t asn_MBR_RICcontrolRequest_IEs_101[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_30, &asn_PER_memb_id_constr_30, memb_id_constraint_29 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_102, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_102, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_101 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICsubscriptionResponse_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_31, &asn_PER_memb_criticality_constr_31, memb_criticality_constraint_29 }, + select_RICcontrolRequest_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_103, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_103, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_101 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_104, + select_RICcontrolRequest_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_104, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_104, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_101 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICsubscriptionResponse_IEs_tags_29[] = { +static const ber_tlv_tag_t asn_DEF_RICcontrolRequest_IEs_tags_101[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionResponse_IEs_tag2el_29[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolRequest_IEs_tag2el_101[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_IEs_specs_101 = { + sizeof(struct RICcontrolRequest_IEs), + offsetof(struct RICcontrolRequest_IEs, _asn_ctx), + asn_MAP_RICcontrolRequest_IEs_tag2el_101, 2, /* 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_TYPE_descriptor_t asn_DEF_RICcontrolRequest_IEs = { + "RICcontrolRequest-IEs", + "RICcontrolRequest-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, + asn_DEF_RICcontrolRequest_IEs_tags_101, + sizeof(asn_DEF_RICcontrolRequest_IEs_tags_101) + /sizeof(asn_DEF_RICcontrolRequest_IEs_tags_101[0]), /* 1 */ + asn_DEF_RICcontrolRequest_IEs_tags_101, /* Same as above */ + sizeof(asn_DEF_RICcontrolRequest_IEs_tags_101) + /sizeof(asn_DEF_RICcontrolRequest_IEs_tags_101[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICcontrolRequest_IEs_101, 3, /* Elements count */ - &asn_SPC_RICsubscriptionResponse_IEs_specs_29 /* Additional specs */ + &asn_SPC_RICcontrolRequest_IEs_specs_101 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_36[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RICrequestID), +static asn_TYPE_member_t asn_MBR_value_108[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICrequestID), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICrequestID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICrequestID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RANfunctionID), + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RANfunctionID), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_RANfunctionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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)), + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcallProcessID), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 0, - &asn_DEF_RICaction_NotAdmitted_List, + &asn_DEF_RICcallProcessID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICaction-NotAdmitted-List" + "RICcallProcessID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.CriticalityDiagnostics), - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcontrolOutcome), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 0, - &asn_DEF_CriticalityDiagnostics, + &asn_DEF_RICcontrolOutcome, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "CriticalityDiagnostics" + "RICcontrolOutcome" }, }; -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[] = { +static const unsigned asn_MAP_value_to_canonical_108[] = { 1, 2, 3, 0 }; +static const unsigned asn_MAP_value_from_canonical_108[] = { 3, 0, 1, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_108[] = { { (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 } /* CriticalityDiagnostics */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 1 }, /* RICcallProcessID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 3, -1, 0 }, /* RICcontrolOutcome */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ }; -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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_108 = { + 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_108, 4, /* Count of tags in the map */ - asn_MAP_value_to_canonical_36, - asn_MAP_value_from_canonical_36, + asn_MAP_value_to_canonical_108, + asn_MAP_value_from_canonical_108, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_36 = { +asn_TYPE_descriptor_t asn_DEF_value_108 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -5221,111 +12210,226 @@ asn_TYPE_descriptor_t asn_DEF_value_36 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, 0, OPEN_TYPE_constraint }, - asn_MBR_value_36, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_108, 4, /* Elements count */ - &asn_SPC_value_specs_36 /* Additional specs */ + &asn_SPC_value_specs_108 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_IEs_33[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, id), +asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_IEs_105[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_34, &asn_PER_memb_id_constr_34, memb_id_constraint_33 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_106, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_106, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_105 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICsubscriptionFailure_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_35, &asn_PER_memb_criticality_constr_35, memb_criticality_constraint_33 }, + select_RICcontrolAcknowledge_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_107, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_107, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_105 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_108, + select_RICcontrolAcknowledge_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_108, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_108, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_105 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICsubscriptionFailure_IEs_tags_33[] = { +static const ber_tlv_tag_t asn_DEF_RICcontrolAcknowledge_IEs_tags_105[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionFailure_IEs_tag2el_33[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolAcknowledge_IEs_tag2el_105[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_IEs_specs_105 = { + sizeof(struct RICcontrolAcknowledge_IEs), + offsetof(struct RICcontrolAcknowledge_IEs, _asn_ctx), + asn_MAP_RICcontrolAcknowledge_IEs_tag2el_105, 2, /* 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_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge_IEs = { + "RICcontrolAcknowledge-IEs", + "RICcontrolAcknowledge-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, + asn_DEF_RICcontrolAcknowledge_IEs_tags_105, + sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_105) + /sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_105[0]), /* 1 */ + asn_DEF_RICcontrolAcknowledge_IEs_tags_105, /* Same as above */ + sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_105) + /sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_105[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICcontrolAcknowledge_IEs_105, 3, /* Elements count */ - &asn_SPC_RICsubscriptionFailure_IEs_specs_33 /* Additional specs */ + &asn_SPC_RICcontrolAcknowledge_IEs_specs_105 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_40[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs__value, choice.RICrequestID), +static asn_TYPE_member_t asn_MBR_value_112[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICrequestID), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICrequestID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICrequestID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs__value, choice.RANfunctionID), + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RANfunctionID), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_RANfunctionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RICcallProcessID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.Cause), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_Cause, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "Cause" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICcontrolOutcome), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcontrolOutcome, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RICcontrolOutcome" + }, }; -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[] = { +static const unsigned asn_MAP_value_to_canonical_112[] = { 1, 2, 4, 0, 3 }; +static const unsigned asn_MAP_value_from_canonical_112[] = { 3, 0, 1, 4, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_112[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ + { (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 }, /* e2Node */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 3, 0, 0 } /* misc */ }; -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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_112 = { + 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_112, + 10, /* Count of tags in the map */ + asn_MAP_value_to_canonical_112, + asn_MAP_value_from_canonical_112, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_40 = { +asn_TYPE_descriptor_t asn_DEF_value_112 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -5333,111 +12437,226 @@ asn_TYPE_descriptor_t asn_DEF_value_40 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_112, + 5, /* Elements count */ + &asn_SPC_value_specs_112 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_IEs_37[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, id), +asn_TYPE_member_t asn_MBR_RICcontrolFailure_IEs_109[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_38, &asn_PER_memb_id_constr_38, memb_id_constraint_37 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_110, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_110, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_109 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICsubscriptionDeleteRequest_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_39, &asn_PER_memb_criticality_constr_39, memb_criticality_constraint_37 }, + select_RICcontrolFailure_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_111, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_111, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_109 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_112, + select_RICcontrolFailure_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_112, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_112, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_109 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37[] = { +static const ber_tlv_tag_t asn_DEF_RICcontrolFailure_IEs_tags_109[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequest_IEs_tag2el_37[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolFailure_IEs_tag2el_109[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_IEs_specs_109 = { + sizeof(struct RICcontrolFailure_IEs), + offsetof(struct RICcontrolFailure_IEs, _asn_ctx), + asn_MAP_RICcontrolFailure_IEs_tag2el_109, 2, /* 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_TYPE_descriptor_t asn_DEF_RICcontrolFailure_IEs = { + "RICcontrolFailure-IEs", + "RICcontrolFailure-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, + asn_DEF_RICcontrolFailure_IEs_tags_109, + sizeof(asn_DEF_RICcontrolFailure_IEs_tags_109) + /sizeof(asn_DEF_RICcontrolFailure_IEs_tags_109[0]), /* 1 */ + asn_DEF_RICcontrolFailure_IEs_tags_109, /* Same as above */ + sizeof(asn_DEF_RICcontrolFailure_IEs_tags_109) + /sizeof(asn_DEF_RICcontrolFailure_IEs_tags_109[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICcontrolFailure_IEs_109, 3, /* Elements count */ - &asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_37 /* Additional specs */ + &asn_SPC_RICcontrolFailure_IEs_specs_109 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_44[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs__value, choice.RICrequestID), +static asn_TYPE_member_t asn_MBR_value_116[] = { + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.TransactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_TransactionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "TransactionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.RICrequestID), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICrequestID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICrequestID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs__value, choice.RANfunctionID), + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.RANfunctionID), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_RANfunctionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RANfunctionID" }, + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.Cause), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_Cause, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "Cause" + }, + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.CriticalityDiagnostics), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnostics, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "CriticalityDiagnostics" + }, }; -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 const unsigned asn_MAP_value_to_canonical_116[] = { 0, 2, 1, 4, 3 }; +static const unsigned asn_MAP_value_from_canonical_116[] = { 0, 2, 1, 4, 3 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_116[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 2, -1, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 1 }, /* RICrequestID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -1, 0 }, /* CriticalityDiagnostics */ + { (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 }, /* e2Node */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 3, 0, 0 } /* misc */ }; -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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_116 = { + sizeof(struct ErrorIndication_IEs__value), + offsetof(struct ErrorIndication_IEs__value, _asn_ctx), + offsetof(struct ErrorIndication_IEs__value, present), + sizeof(((struct ErrorIndication_IEs__value *)0)->present), + asn_MAP_value_tag2el_116, + 10, /* Count of tags in the map */ + asn_MAP_value_to_canonical_116, + asn_MAP_value_from_canonical_116, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_44 = { +asn_TYPE_descriptor_t asn_DEF_value_116 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -5445,135 +12664,206 @@ asn_TYPE_descriptor_t asn_DEF_value_44 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_116, + 5, /* Elements count */ + &asn_SPC_value_specs_116 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_IEs_41[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, id), +asn_TYPE_member_t asn_MBR_ErrorIndication_IEs_113[] = { + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_42, &asn_PER_memb_id_constr_42, memb_id_constraint_41 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_114, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_114, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_113 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICsubscriptionDeleteResponse_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_43, &asn_PER_memb_criticality_constr_43, memb_criticality_constraint_41 }, + select_ErrorIndication_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_115, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_115, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_113 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_116, + select_ErrorIndication_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_116, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_116, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_113 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41[] = { +static const ber_tlv_tag_t asn_DEF_ErrorIndication_IEs_tags_113[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteResponse_IEs_tag2el_41[] = { +static const asn_TYPE_tag2member_t asn_MAP_ErrorIndication_IEs_tag2el_113[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_IEs_specs_113 = { + sizeof(struct ErrorIndication_IEs), + offsetof(struct ErrorIndication_IEs, _asn_ctx), + asn_MAP_ErrorIndication_IEs_tag2el_113, 2, /* 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_TYPE_descriptor_t asn_DEF_ErrorIndication_IEs = { + "ErrorIndication-IEs", + "ErrorIndication-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, + asn_DEF_ErrorIndication_IEs_tags_113, + sizeof(asn_DEF_ErrorIndication_IEs_tags_113) + /sizeof(asn_DEF_ErrorIndication_IEs_tags_113[0]), /* 1 */ + asn_DEF_ErrorIndication_IEs_tags_113, /* Same as above */ + sizeof(asn_DEF_ErrorIndication_IEs_tags_113) + /sizeof(asn_DEF_ErrorIndication_IEs_tags_113[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_ErrorIndication_IEs_113, 3, /* Elements count */ - &asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_41 /* Additional specs */ + &asn_SPC_ErrorIndication_IEs_specs_113 /* 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)), +static asn_TYPE_member_t asn_MBR_value_120[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.TransactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, - &asn_DEF_RICrequestID, + &asn_DEF_TransactionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICrequestID" + "TransactionID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RANfunctionID), - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.GlobalE2node_ID), + -1 /* Ambiguous tag (CHOICE?) */, 0, - &asn_DEF_RANfunctionID, + &asn_DEF_GlobalE2node_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RANfunctionID" + "GlobalE2node-ID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.Cause), - -1 /* Ambiguous tag (CHOICE?) */, + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.RANfunctions_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_Cause, + &asn_DEF_RANfunctions_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "Cause" + "RANfunctions-List" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.CriticalityDiagnostics), + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.E2nodeComponentConfigAddition_List), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_CriticalityDiagnostics, + &asn_DEF_E2nodeComponentConfigAddition_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "CriticalityDiagnostics" + "E2nodeComponentConfigAddition-List" }, }; -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 }, /* CriticalityDiagnostics */ - { (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 const unsigned asn_MAP_value_to_canonical_120[] = { 0, 2, 3, 1 }; +static const unsigned asn_MAP_value_from_canonical_120[] = { 0, 3, 1, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_120[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 1 }, /* RANfunctions-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -1, 0 }, /* E2nodeComponentConfigAddition-List */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* gNB */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* en-gNB */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* ng-eNB */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 } /* eNB */ }; -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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_120 = { + 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_120, + 7, /* Count of tags in the map */ + asn_MAP_value_to_canonical_120, + asn_MAP_value_from_canonical_120, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_48 = { +asn_TYPE_descriptor_t asn_DEF_value_120 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -5581,171 +12871,218 @@ asn_TYPE_descriptor_t asn_DEF_value_48 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, 0, OPEN_TYPE_constraint }, - asn_MBR_value_48, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_120, 4, /* Elements count */ - &asn_SPC_value_specs_48 /* Additional specs */ + &asn_SPC_value_specs_120 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_IEs_45[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, id), +asn_TYPE_member_t asn_MBR_E2setupRequestIEs_117[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_46, &asn_PER_memb_id_constr_46, memb_id_constraint_45 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_118, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_118, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_117 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICsubscriptionDeleteFailure_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_47, &asn_PER_memb_criticality_constr_47, memb_criticality_constraint_45 }, + select_E2setupRequestIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_119, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_119, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_117 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_120, + select_E2setupRequestIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_120, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_120, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_117 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45[] = { +static const ber_tlv_tag_t asn_DEF_E2setupRequestIEs_tags_117[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteFailure_IEs_tag2el_45[] = { +static const asn_TYPE_tag2member_t asn_MAP_E2setupRequestIEs_tag2el_117[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_E2setupRequestIEs_specs_117 = { + sizeof(struct E2setupRequestIEs), + offsetof(struct E2setupRequestIEs, _asn_ctx), + asn_MAP_E2setupRequestIEs_tag2el_117, 2, /* 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_TYPE_descriptor_t asn_DEF_E2setupRequestIEs = { + "E2setupRequestIEs", + "E2setupRequestIEs", &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, + asn_DEF_E2setupRequestIEs_tags_117, + sizeof(asn_DEF_E2setupRequestIEs_tags_117) + /sizeof(asn_DEF_E2setupRequestIEs_tags_117[0]), /* 1 */ + asn_DEF_E2setupRequestIEs_tags_117, /* Same as above */ + sizeof(asn_DEF_E2setupRequestIEs_tags_117) + /sizeof(asn_DEF_E2setupRequestIEs_tags_117[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2setupRequestIEs_117, 3, /* Elements count */ - &asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_45 /* Additional specs */ + &asn_SPC_E2setupRequestIEs_specs_117 /* 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), +static asn_TYPE_member_t asn_MBR_value_124[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.TransactionID), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, - &asn_DEF_RANfunctionID, + &asn_DEF_TransactionID, 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "RANfunctionID" + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 }, - { 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" + "TransactionID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationSN), - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.GlobalRIC_ID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICindicationSN, + &asn_DEF_GlobalRIC_ID, 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "RICindicationSN" + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 }, - { 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" + "GlobalRIC-ID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationHeader), - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.RANfunctionsID_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICindicationHeader, + &asn_DEF_RANfunctionsID_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICindicationHeader" + "RANfunctionsID-List" }, - { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationMessage), - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.RANfunctionsIDcause_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICindicationMessage, + &asn_DEF_RANfunctionsIDcause_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICindicationMessage" + "RANfunctionsIDcause-List" }, - { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICcallProcessID), - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.E2nodeComponentConfigAdditionAck_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICcallProcessID, + &asn_DEF_E2nodeComponentConfigAdditionAck_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICcallProcessID" + "E2nodeComponentConfigAdditionAck-List" }, }; -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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_124[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 3 }, /* GlobalRIC-ID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 2 }, /* RANfunctionsID-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 1 }, /* RANfunctionsIDcause-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -3, 0 } /* E2nodeComponentConfigAdditionAck-List */ }; -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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_124 = { + 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_124, + 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_52 = { +asn_TYPE_descriptor_t asn_DEF_value_124 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -5753,151 +13090,226 @@ asn_TYPE_descriptor_t asn_DEF_value_52 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_124, + 5, /* Elements count */ + &asn_SPC_value_specs_124 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICindication_IEs_49[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, id), +asn_TYPE_member_t asn_MBR_E2setupResponseIEs_121[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_50, &asn_PER_memb_id_constr_50, memb_id_constraint_49 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_122, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_122, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_121 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICindication_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_51, &asn_PER_memb_criticality_constr_51, memb_criticality_constraint_49 }, + select_E2setupResponseIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_123, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_123, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_121 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_124, + select_E2setupResponseIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_124, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_124, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_121 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICindication_IEs_tags_49[] = { +static const ber_tlv_tag_t asn_DEF_E2setupResponseIEs_tags_121[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICindication_IEs_tag2el_49[] = { +static const asn_TYPE_tag2member_t asn_MAP_E2setupResponseIEs_tag2el_121[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_E2setupResponseIEs_specs_121 = { + sizeof(struct E2setupResponseIEs), + offsetof(struct E2setupResponseIEs, _asn_ctx), + asn_MAP_E2setupResponseIEs_tag2el_121, 2, /* 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_TYPE_descriptor_t asn_DEF_E2setupResponseIEs = { + "E2setupResponseIEs", + "E2setupResponseIEs", &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, + asn_DEF_E2setupResponseIEs_tags_121, + sizeof(asn_DEF_E2setupResponseIEs_tags_121) + /sizeof(asn_DEF_E2setupResponseIEs_tags_121[0]), /* 1 */ + asn_DEF_E2setupResponseIEs_tags_121, /* Same as above */ + sizeof(asn_DEF_E2setupResponseIEs_tags_121) + /sizeof(asn_DEF_E2setupResponseIEs_tags_121[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2setupResponseIEs_121, 3, /* Elements count */ - &asn_SPC_RICindication_IEs_specs_49 /* Additional specs */ + &asn_SPC_E2setupResponseIEs_specs_121 /* 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), +static asn_TYPE_member_t asn_MBR_value_128[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.TransactionID), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, - &asn_DEF_RANfunctionID, + &asn_DEF_TransactionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RANfunctionID" + "TransactionID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcallProcessID), - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.Cause), + -1 /* Ambiguous tag (CHOICE?) */, 0, - &asn_DEF_RICcallProcessID, + &asn_DEF_Cause, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICcallProcessID" + "Cause" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolHeader), - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.TimeToWait), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, - &asn_DEF_RICcontrolHeader, + &asn_DEF_TimeToWait, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICcontrolHeader" + "TimeToWait" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolMessage), - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.CriticalityDiagnostics), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICcontrolMessage, + &asn_DEF_CriticalityDiagnostics, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICcontrolMessage" + "CriticalityDiagnostics" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolAckRequest), - (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.TNLinformation), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICcontrolAckRequest, + &asn_DEF_TNLinformation, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICcontrolAckRequest" + "TNLinformation" }, }; -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 const unsigned asn_MAP_value_to_canonical_128[] = { 0, 2, 3, 4, 1 }; +static const unsigned asn_MAP_value_from_canonical_128[] = { 0, 4, 1, 2, 3 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_128[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 2, 0, 0 }, /* TimeToWait */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, 0, 1 }, /* CriticalityDiagnostics */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -1, 0 }, /* TNLinformation */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* e2Node */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 1, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 1, 0, 0 } /* misc */ }; -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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_128 = { + 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_128, + 10, /* Count of tags in the map */ + asn_MAP_value_to_canonical_128, + asn_MAP_value_from_canonical_128, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_56 = { +asn_TYPE_descriptor_t asn_DEF_value_128 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -5905,141 +13317,200 @@ asn_TYPE_descriptor_t asn_DEF_value_56 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_128, + 5, /* Elements count */ + &asn_SPC_value_specs_128 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICcontrolRequest_IEs_53[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, id), +asn_TYPE_member_t asn_MBR_E2setupFailureIEs_125[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_54, &asn_PER_memb_id_constr_54, memb_id_constraint_53 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_126, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_126, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_125 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICcontrolRequest_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_55, &asn_PER_memb_criticality_constr_55, memb_criticality_constraint_53 }, + select_E2setupFailureIEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_127, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_127, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_125 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_128, + select_E2setupFailureIEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_128, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_128, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_125 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICcontrolRequest_IEs_tags_53[] = { +static const ber_tlv_tag_t asn_DEF_E2setupFailureIEs_tags_125[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICcontrolRequest_IEs_tag2el_53[] = { +static const asn_TYPE_tag2member_t asn_MAP_E2setupFailureIEs_tag2el_125[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_E2setupFailureIEs_specs_125 = { + sizeof(struct E2setupFailureIEs), + offsetof(struct E2setupFailureIEs, _asn_ctx), + asn_MAP_E2setupFailureIEs_tag2el_125, 2, /* 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_TYPE_descriptor_t asn_DEF_E2setupFailureIEs = { + "E2setupFailureIEs", + "E2setupFailureIEs", &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, + asn_DEF_E2setupFailureIEs_tags_125, + sizeof(asn_DEF_E2setupFailureIEs_tags_125) + /sizeof(asn_DEF_E2setupFailureIEs_tags_125[0]), /* 1 */ + asn_DEF_E2setupFailureIEs_tags_125, /* Same as above */ + sizeof(asn_DEF_E2setupFailureIEs_tags_125) + /sizeof(asn_DEF_E2setupFailureIEs_tags_125[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2setupFailureIEs_125, 3, /* Elements count */ - &asn_SPC_RICcontrolRequest_IEs_specs_53 /* Additional specs */ + &asn_SPC_E2setupFailureIEs_specs_125 /* 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), +static asn_TYPE_member_t asn_MBR_value_132[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_IEs__value, choice.TransactionID), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, - &asn_DEF_RANfunctionID, + &asn_DEF_TransactionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RANfunctionID" + "TransactionID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcallProcessID), - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_IEs__value, choice.E2connectionUpdate_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICcallProcessID, + &asn_DEF_E2connectionUpdate_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICcallProcessID" + "E2connectionUpdate-List" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcontrolStatus), - (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_IEs__value, choice.E2connectionUpdateRemove_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICcontrolStatus, + &asn_DEF_E2connectionUpdateRemove_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICcontrolStatus" + "E2connectionUpdateRemove-List" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcontrolOutcome), - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_IEs__value, choice.E2connectionUpdate_List_1), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICcontrolOutcome, + &asn_DEF_E2connectionUpdate_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICcontrolOutcome" + "E2connectionUpdate-List" }, }; -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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_132[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 2 }, /* E2connectionUpdate-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* E2connectionUpdateRemove-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 } /* E2connectionUpdate-List */ }; -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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_132 = { + sizeof(struct E2connectionUpdate_IEs__value), + offsetof(struct E2connectionUpdate_IEs__value, _asn_ctx), + offsetof(struct E2connectionUpdate_IEs__value, present), + sizeof(((struct E2connectionUpdate_IEs__value *)0)->present), + asn_MAP_value_tag2el_132, + 4, /* 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_60 = { +asn_TYPE_descriptor_t asn_DEF_value_132 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -6047,145 +13518,182 @@ asn_TYPE_descriptor_t asn_DEF_value_60 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_132, + 4, /* Elements count */ + &asn_SPC_value_specs_132 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_IEs_57[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, id), +asn_TYPE_member_t asn_MBR_E2connectionUpdate_IEs_129[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_58, &asn_PER_memb_id_constr_58, memb_id_constraint_57 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_130, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_130, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_129 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICcontrolAcknowledge_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_59, &asn_PER_memb_criticality_constr_59, memb_criticality_constraint_57 }, + select_E2connectionUpdate_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_131, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_131, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_129 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdate_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_132, + select_E2connectionUpdate_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_132, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_132, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_129 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICcontrolAcknowledge_IEs_tags_57[] = { +static const ber_tlv_tag_t asn_DEF_E2connectionUpdate_IEs_tags_129[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICcontrolAcknowledge_IEs_tag2el_57[] = { +static const asn_TYPE_tag2member_t asn_MAP_E2connectionUpdate_IEs_tag2el_129[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdate_IEs_specs_129 = { + sizeof(struct E2connectionUpdate_IEs), + offsetof(struct E2connectionUpdate_IEs, _asn_ctx), + asn_MAP_E2connectionUpdate_IEs_tag2el_129, 2, /* 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_TYPE_descriptor_t asn_DEF_E2connectionUpdate_IEs = { + "E2connectionUpdate-IEs", + "E2connectionUpdate-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, + asn_DEF_E2connectionUpdate_IEs_tags_129, + sizeof(asn_DEF_E2connectionUpdate_IEs_tags_129) + /sizeof(asn_DEF_E2connectionUpdate_IEs_tags_129[0]), /* 1 */ + asn_DEF_E2connectionUpdate_IEs_tags_129, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdate_IEs_tags_129) + /sizeof(asn_DEF_E2connectionUpdate_IEs_tags_129[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdate_IEs_129, 3, /* Elements count */ - &asn_SPC_RICcontrolAcknowledge_IEs_specs_57 /* Additional specs */ + &asn_SPC_E2connectionUpdate_IEs_specs_129 /* 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), +static asn_TYPE_member_t asn_MBR_value_136[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateAck_IEs__value, choice.TransactionID), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, - &asn_DEF_RANfunctionID, + &asn_DEF_TransactionID, 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "RANfunctionID" + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 }, - { 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" + "TransactionID" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.Cause), - -1 /* Ambiguous tag (CHOICE?) */, + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateAck_IEs__value, choice.E2connectionUpdate_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_Cause, + &asn_DEF_E2connectionUpdate_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "Cause" + "E2connectionUpdate-List" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICcontrolOutcome), - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateAck_IEs__value, choice.E2connectionSetupFailed_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RICcontrolOutcome, + &asn_DEF_E2connectionSetupFailed_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RICcontrolOutcome" + "E2connectionSetupFailed-List" }, }; -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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_136[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 1 }, /* E2connectionUpdate-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* E2connectionSetupFailed-List */ }; -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, +static asn_CHOICE_specifics_t asn_SPC_value_specs_136 = { + sizeof(struct E2connectionUpdateAck_IEs__value), + offsetof(struct E2connectionUpdateAck_IEs__value, _asn_ctx), + offsetof(struct E2connectionUpdateAck_IEs__value, present), + sizeof(((struct E2connectionUpdateAck_IEs__value *)0)->present), + asn_MAP_value_tag2el_136, + 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_64 = { +asn_TYPE_descriptor_t asn_DEF_value_136 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -6193,135 +13701,208 @@ asn_TYPE_descriptor_t asn_DEF_value_64 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_136, + 3, /* Elements count */ + &asn_SPC_value_specs_136 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICcontrolFailure_IEs_61[] = { - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, id), +asn_TYPE_member_t asn_MBR_E2connectionUpdateAck_IEs_133[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateAck_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_62, &asn_PER_memb_id_constr_62, memb_id_constraint_61 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_134, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_134, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_133 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateAck_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_RICcontrolFailure_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_63, &asn_PER_memb_criticality_constr_63, memb_criticality_constraint_61 }, + select_E2connectionUpdateAck_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_135, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_135, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_133 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateAck_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &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 }, + &asn_DEF_value_136, + select_E2connectionUpdateAck_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_136, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_136, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_133 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICcontrolFailure_IEs_tags_61[] = { +static const ber_tlv_tag_t asn_DEF_E2connectionUpdateAck_IEs_tags_133[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICcontrolFailure_IEs_tag2el_61[] = { +static const asn_TYPE_tag2member_t asn_MAP_E2connectionUpdateAck_IEs_tag2el_133[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -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, +asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateAck_IEs_specs_133 = { + sizeof(struct E2connectionUpdateAck_IEs), + offsetof(struct E2connectionUpdateAck_IEs, _asn_ctx), + asn_MAP_E2connectionUpdateAck_IEs_tag2el_133, 2, /* 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_TYPE_descriptor_t asn_DEF_E2connectionUpdateAck_IEs = { + "E2connectionUpdateAck-IEs", + "E2connectionUpdateAck-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, + asn_DEF_E2connectionUpdateAck_IEs_tags_133, + sizeof(asn_DEF_E2connectionUpdateAck_IEs_tags_133) + /sizeof(asn_DEF_E2connectionUpdateAck_IEs_tags_133[0]), /* 1 */ + asn_DEF_E2connectionUpdateAck_IEs_tags_133, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdateAck_IEs_tags_133) + /sizeof(asn_DEF_E2connectionUpdateAck_IEs_tags_133[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdateAck_IEs_133, 3, /* Elements count */ - &asn_SPC_RICcontrolFailure_IEs_specs_61 /* Additional specs */ + &asn_SPC_E2connectionUpdateAck_IEs_specs_133 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_68[] = { - { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_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 ErrorIndication_IEs__value, choice.RANfunctionID), +static asn_TYPE_member_t asn_MBR_value_140[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateFailure_IEs__value, choice.TransactionID), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, - &asn_DEF_RANfunctionID, + &asn_DEF_TransactionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RANfunctionID" + "TransactionID" }, - { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.Cause), + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateFailure_IEs__value, choice.Cause), -1 /* Ambiguous tag (CHOICE?) */, 0, &asn_DEF_Cause, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "Cause" }, - { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.CriticalityDiagnostics), + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateFailure_IEs__value, choice.TimeToWait), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_TimeToWait, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "TimeToWait" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateFailure_IEs__value, choice.CriticalityDiagnostics), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_CriticalityDiagnostics, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "CriticalityDiagnostics" }, }; -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 }, /* CriticalityDiagnostics */ - { (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 ErrorIndication_IEs__value), - offsetof(struct ErrorIndication_IEs__value, _asn_ctx), - offsetof(struct ErrorIndication_IEs__value, present), - sizeof(((struct ErrorIndication_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, +static const unsigned asn_MAP_value_to_canonical_140[] = { 0, 2, 3, 1 }; +static const unsigned asn_MAP_value_from_canonical_140[] = { 0, 3, 1, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_140[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 2, 0, 0 }, /* TimeToWait */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, 0, 0 }, /* CriticalityDiagnostics */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* e2Node */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 1, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 1, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_140 = { + sizeof(struct E2connectionUpdateFailure_IEs__value), + offsetof(struct E2connectionUpdateFailure_IEs__value, _asn_ctx), + offsetof(struct E2connectionUpdateFailure_IEs__value, present), + sizeof(((struct E2connectionUpdateFailure_IEs__value *)0)->present), + asn_MAP_value_tag2el_140, + 9, /* Count of tags in the map */ + asn_MAP_value_to_canonical_140, + asn_MAP_value_from_canonical_140, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_68 = { +asn_TYPE_descriptor_t asn_DEF_value_140 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -6329,114 +13910,242 @@ asn_TYPE_descriptor_t asn_DEF_value_68 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, 0, OPEN_TYPE_constraint }, - asn_MBR_value_68, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_140, 4, /* Elements count */ - &asn_SPC_value_specs_68 /* Additional specs */ + &asn_SPC_value_specs_140 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ErrorIndication_IEs_65[] = { - { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, id), +asn_TYPE_member_t asn_MBR_E2connectionUpdateFailure_IEs_137[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateFailure_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_66, &asn_PER_memb_id_constr_66, memb_id_constraint_65 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_138, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_138, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_137 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateFailure_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_ErrorIndication_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_67, &asn_PER_memb_criticality_constr_67, memb_criticality_constraint_65 }, + select_E2connectionUpdateFailure_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_139, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_139, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_137 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2connectionUpdateFailure_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &asn_DEF_value_68, - select_ErrorIndication_IEs_value_type, - { &asn_OER_memb_value_constr_68, &asn_PER_memb_value_constr_68, memb_value_constraint_65 }, + &asn_DEF_value_140, + select_E2connectionUpdateFailure_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_140, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_140, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_137 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_ErrorIndication_IEs_tags_65[] = { +static const ber_tlv_tag_t asn_DEF_E2connectionUpdateFailure_IEs_tags_137[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_ErrorIndication_IEs_tag2el_65[] = { +static const asn_TYPE_tag2member_t asn_MAP_E2connectionUpdateFailure_IEs_tag2el_137[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_IEs_specs_65 = { - sizeof(struct ErrorIndication_IEs), - offsetof(struct ErrorIndication_IEs, _asn_ctx), - asn_MAP_ErrorIndication_IEs_tag2el_65, +asn_SEQUENCE_specifics_t asn_SPC_E2connectionUpdateFailure_IEs_specs_137 = { + sizeof(struct E2connectionUpdateFailure_IEs), + offsetof(struct E2connectionUpdateFailure_IEs, _asn_ctx), + asn_MAP_E2connectionUpdateFailure_IEs_tag2el_137, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* First extension addition */ }; -asn_TYPE_descriptor_t asn_DEF_ErrorIndication_IEs = { - "ErrorIndication-IEs", - "ErrorIndication-IEs", +asn_TYPE_descriptor_t asn_DEF_E2connectionUpdateFailure_IEs = { + "E2connectionUpdateFailure-IEs", + "E2connectionUpdateFailure-IEs", &asn_OP_SEQUENCE, - asn_DEF_ErrorIndication_IEs_tags_65, - sizeof(asn_DEF_ErrorIndication_IEs_tags_65) - /sizeof(asn_DEF_ErrorIndication_IEs_tags_65[0]), /* 1 */ - asn_DEF_ErrorIndication_IEs_tags_65, /* Same as above */ - sizeof(asn_DEF_ErrorIndication_IEs_tags_65) - /sizeof(asn_DEF_ErrorIndication_IEs_tags_65[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_ErrorIndication_IEs_65, + asn_DEF_E2connectionUpdateFailure_IEs_tags_137, + sizeof(asn_DEF_E2connectionUpdateFailure_IEs_tags_137) + /sizeof(asn_DEF_E2connectionUpdateFailure_IEs_tags_137[0]), /* 1 */ + asn_DEF_E2connectionUpdateFailure_IEs_tags_137, /* Same as above */ + sizeof(asn_DEF_E2connectionUpdateFailure_IEs_tags_137) + /sizeof(asn_DEF_E2connectionUpdateFailure_IEs_tags_137[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdateFailure_IEs_137, 3, /* Elements count */ - &asn_SPC_ErrorIndication_IEs_specs_65 /* Additional specs */ + &asn_SPC_E2connectionUpdateFailure_IEs_specs_137 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_72[] = { - { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.GlobalE2node_ID), +static asn_TYPE_member_t asn_MBR_value_144[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdate_IEs__value, choice.TransactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_TransactionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "TransactionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdate_IEs__value, choice.GlobalE2node_ID), -1 /* Ambiguous tag (CHOICE?) */, 0, &asn_DEF_GlobalE2node_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "GlobalE2node-ID" }, - { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.RANfunctions_List), + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdate_IEs__value, choice.E2nodeComponentConfigAddition_List), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RANfunctions_List, + &asn_DEF_E2nodeComponentConfigAddition_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RANfunctions-List" + "E2nodeComponentConfigAddition-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, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdate_IEs__value, choice.E2nodeComponentConfigUpdate_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeComponentConfigUpdate_List, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeComponentConfigUpdate-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdate_IEs__value, choice.E2nodeComponentConfigRemoval_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeComponentConfigRemoval_List, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeComponentConfigRemoval-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdate_IEs__value, choice.E2nodeTNLassociationRemoval_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeTNLassociationRemoval_List, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeTNLassociationRemoval-List" + }, +}; +static const unsigned asn_MAP_value_to_canonical_144[] = { 0, 2, 3, 4, 5, 1 }; +static const unsigned asn_MAP_value_from_canonical_144[] = { 0, 5, 1, 2, 3, 4 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_144[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 3 }, /* E2nodeComponentConfigAddition-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -1, 2 }, /* E2nodeComponentConfigUpdate-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -2, 1 }, /* E2nodeComponentConfigRemoval-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -3, 0 }, /* E2nodeTNLassociationRemoval-List */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* gNB */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* en-gNB */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* ng-eNB */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 } /* eNB */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_144 = { + sizeof(struct E2nodeConfigurationUpdate_IEs__value), + offsetof(struct E2nodeConfigurationUpdate_IEs__value, _asn_ctx), + offsetof(struct E2nodeConfigurationUpdate_IEs__value, present), + sizeof(((struct E2nodeConfigurationUpdate_IEs__value *)0)->present), + asn_MAP_value_tag2el_144, + 9, /* Count of tags in the map */ + asn_MAP_value_to_canonical_144, + asn_MAP_value_from_canonical_144, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_72 = { +asn_TYPE_descriptor_t asn_DEF_value_144 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -6444,118 +14153,200 @@ asn_TYPE_descriptor_t asn_DEF_value_72 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_144, + 6, /* Elements count */ + &asn_SPC_value_specs_144 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_E2setupRequestIEs_69[] = { - { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, id), +asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdate_IEs_141[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdate_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_70, &asn_PER_memb_id_constr_70, memb_id_constraint_69 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_142, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_142, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_141 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdate_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_E2setupRequestIEs_criticality_type, - { &asn_OER_memb_criticality_constr_71, &asn_PER_memb_criticality_constr_71, memb_criticality_constraint_69 }, + select_E2nodeConfigurationUpdate_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_143, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_143, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_141 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdate_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &asn_DEF_value_72, - select_E2setupRequestIEs_value_type, - { &asn_OER_memb_value_constr_72, &asn_PER_memb_value_constr_72, memb_value_constraint_69 }, + &asn_DEF_value_144, + select_E2nodeConfigurationUpdate_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_144, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_144, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_141 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_E2setupRequestIEs_tags_69[] = { +static const ber_tlv_tag_t asn_DEF_E2nodeConfigurationUpdate_IEs_tags_141[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_E2setupRequestIEs_tag2el_69[] = { +static const asn_TYPE_tag2member_t asn_MAP_E2nodeConfigurationUpdate_IEs_tag2el_141[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -asn_SEQUENCE_specifics_t asn_SPC_E2setupRequestIEs_specs_69 = { - sizeof(struct E2setupRequestIEs), - offsetof(struct E2setupRequestIEs, _asn_ctx), - asn_MAP_E2setupRequestIEs_tag2el_69, +asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdate_IEs_specs_141 = { + sizeof(struct E2nodeConfigurationUpdate_IEs), + offsetof(struct E2nodeConfigurationUpdate_IEs, _asn_ctx), + asn_MAP_E2nodeConfigurationUpdate_IEs_tag2el_141, 2, /* 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_TYPE_descriptor_t asn_DEF_E2nodeConfigurationUpdate_IEs = { + "E2nodeConfigurationUpdate-IEs", + "E2nodeConfigurationUpdate-IEs", &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, + asn_DEF_E2nodeConfigurationUpdate_IEs_tags_141, + sizeof(asn_DEF_E2nodeConfigurationUpdate_IEs_tags_141) + /sizeof(asn_DEF_E2nodeConfigurationUpdate_IEs_tags_141[0]), /* 1 */ + asn_DEF_E2nodeConfigurationUpdate_IEs_tags_141, /* Same as above */ + sizeof(asn_DEF_E2nodeConfigurationUpdate_IEs_tags_141) + /sizeof(asn_DEF_E2nodeConfigurationUpdate_IEs_tags_141[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeConfigurationUpdate_IEs_141, 3, /* Elements count */ - &asn_SPC_E2setupRequestIEs_specs_69 /* Additional specs */ + &asn_SPC_E2nodeConfigurationUpdate_IEs_specs_141 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_76[] = { - { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.GlobalRIC_ID), +static asn_TYPE_member_t asn_MBR_value_148[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateAcknowledge_IEs__value, choice.TransactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_TransactionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "TransactionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateAcknowledge_IEs__value, choice.E2nodeComponentConfigAdditionAck_List), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_GlobalRIC_ID, + &asn_DEF_E2nodeComponentConfigAdditionAck_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "GlobalRIC-ID" + "E2nodeComponentConfigAdditionAck-List" }, - { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.RANfunctionsID_List), + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateAcknowledge_IEs__value, choice.E2nodeComponentConfigUpdateAck_List), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RANfunctionsID_List, + &asn_DEF_E2nodeComponentConfigUpdateAck_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RANfunctionsID-List" + "E2nodeComponentConfigUpdateAck-List" }, - { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.RANfunctionsIDcause_List), + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateAcknowledge_IEs__value, choice.E2nodeComponentConfigRemovalAck_List), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_RANfunctionsIDcause_List, + &asn_DEF_E2nodeComponentConfigRemovalAck_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RANfunctionsIDcause-List" + "E2nodeComponentConfigRemovalAck-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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_148[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 2 }, /* E2nodeComponentConfigAdditionAck-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* E2nodeComponentConfigUpdateAck-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 } /* E2nodeComponentConfigRemovalAck-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 */ +static asn_CHOICE_specifics_t asn_SPC_value_specs_148 = { + sizeof(struct E2nodeConfigurationUpdateAcknowledge_IEs__value), + offsetof(struct E2nodeConfigurationUpdateAcknowledge_IEs__value, _asn_ctx), + offsetof(struct E2nodeConfigurationUpdateAcknowledge_IEs__value, present), + sizeof(((struct E2nodeConfigurationUpdateAcknowledge_IEs__value *)0)->present), + asn_MAP_value_tag2el_148, + 4, /* 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 = { +asn_TYPE_descriptor_t asn_DEF_value_148 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -6563,125 +14354,208 @@ asn_TYPE_descriptor_t asn_DEF_value_76 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_148, + 4, /* Elements count */ + &asn_SPC_value_specs_148 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_E2setupResponseIEs_73[] = { - { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, id), +asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdateAcknowledge_IEs_145[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateAcknowledge_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_74, &asn_PER_memb_id_constr_74, memb_id_constraint_73 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_146, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_146, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_145 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateAcknowledge_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_E2setupResponseIEs_criticality_type, - { &asn_OER_memb_criticality_constr_75, &asn_PER_memb_criticality_constr_75, memb_criticality_constraint_73 }, + select_E2nodeConfigurationUpdateAcknowledge_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_147, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_147, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_145 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateAcknowledge_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &asn_DEF_value_76, - select_E2setupResponseIEs_value_type, - { &asn_OER_memb_value_constr_76, &asn_PER_memb_value_constr_76, memb_value_constraint_73 }, + &asn_DEF_value_148, + select_E2nodeConfigurationUpdateAcknowledge_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_148, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_148, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_145 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_E2setupResponseIEs_tags_73[] = { +static const ber_tlv_tag_t asn_DEF_E2nodeConfigurationUpdateAcknowledge_IEs_tags_145[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_E2setupResponseIEs_tag2el_73[] = { +static const asn_TYPE_tag2member_t asn_MAP_E2nodeConfigurationUpdateAcknowledge_IEs_tag2el_145[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -asn_SEQUENCE_specifics_t asn_SPC_E2setupResponseIEs_specs_73 = { - sizeof(struct E2setupResponseIEs), - offsetof(struct E2setupResponseIEs, _asn_ctx), - asn_MAP_E2setupResponseIEs_tag2el_73, +asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdateAcknowledge_IEs_specs_145 = { + sizeof(struct E2nodeConfigurationUpdateAcknowledge_IEs), + offsetof(struct E2nodeConfigurationUpdateAcknowledge_IEs, _asn_ctx), + asn_MAP_E2nodeConfigurationUpdateAcknowledge_IEs_tag2el_145, 2, /* 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_TYPE_descriptor_t asn_DEF_E2nodeConfigurationUpdateAcknowledge_IEs = { + "E2nodeConfigurationUpdateAcknowledge-IEs", + "E2nodeConfigurationUpdateAcknowledge-IEs", &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, + asn_DEF_E2nodeConfigurationUpdateAcknowledge_IEs_tags_145, + sizeof(asn_DEF_E2nodeConfigurationUpdateAcknowledge_IEs_tags_145) + /sizeof(asn_DEF_E2nodeConfigurationUpdateAcknowledge_IEs_tags_145[0]), /* 1 */ + asn_DEF_E2nodeConfigurationUpdateAcknowledge_IEs_tags_145, /* Same as above */ + sizeof(asn_DEF_E2nodeConfigurationUpdateAcknowledge_IEs_tags_145) + /sizeof(asn_DEF_E2nodeConfigurationUpdateAcknowledge_IEs_tags_145[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeConfigurationUpdateAcknowledge_IEs_145, 3, /* Elements count */ - &asn_SPC_E2setupResponseIEs_specs_73 /* Additional specs */ + &asn_SPC_E2nodeConfigurationUpdateAcknowledge_IEs_specs_145 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_80[] = { - { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.Cause), +static asn_TYPE_member_t asn_MBR_value_152[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateFailure_IEs__value, choice.TransactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_TransactionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "TransactionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateFailure_IEs__value, choice.Cause), -1 /* Ambiguous tag (CHOICE?) */, 0, &asn_DEF_Cause, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "Cause" }, - { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.TimeToWait), + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateFailure_IEs__value, choice.TimeToWait), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_TimeToWait, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "TimeToWait" }, - { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.CriticalityDiagnostics), + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateFailure_IEs__value, choice.CriticalityDiagnostics), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_CriticalityDiagnostics, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "CriticalityDiagnostics" }, }; -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 }, /* TimeToWait */ - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 0 }, /* CriticalityDiagnostics */ - { (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, +static const unsigned asn_MAP_value_to_canonical_152[] = { 0, 2, 3, 1 }; +static const unsigned asn_MAP_value_from_canonical_152[] = { 0, 3, 1, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_152[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 2, 0, 0 }, /* TimeToWait */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, 0, 0 }, /* CriticalityDiagnostics */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* e2Node */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 1, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 1, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_152 = { + sizeof(struct E2nodeConfigurationUpdateFailure_IEs__value), + offsetof(struct E2nodeConfigurationUpdateFailure_IEs__value, _asn_ctx), + offsetof(struct E2nodeConfigurationUpdateFailure_IEs__value, present), + sizeof(((struct E2nodeConfigurationUpdateFailure_IEs__value *)0)->present), + asn_MAP_value_tag2el_152, + 9, /* Count of tags in the map */ + asn_MAP_value_to_canonical_152, + asn_MAP_value_from_canonical_152, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_80 = { +asn_TYPE_descriptor_t asn_DEF_value_152 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -6689,102 +14563,169 @@ asn_TYPE_descriptor_t asn_DEF_value_80 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_152, + 4, /* Elements count */ + &asn_SPC_value_specs_152 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_E2setupFailureIEs_77[] = { - { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, id), +asn_TYPE_member_t asn_MBR_E2nodeConfigurationUpdateFailure_IEs_149[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateFailure_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_78, &asn_PER_memb_id_constr_78, memb_id_constraint_77 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_150, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_150, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_149 + }, 0, 0, /* No default value */ "id" }, - { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, criticality), + { ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateFailure_IEs, criticality), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_Criticality, - select_E2setupFailureIEs_criticality_type, - { &asn_OER_memb_criticality_constr_79, &asn_PER_memb_criticality_constr_79, memb_criticality_constraint_77 }, + select_E2nodeConfigurationUpdateFailure_IEs_criticality_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_151, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_151, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_149 + }, 0, 0, /* No default value */ "criticality" }, - { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, value), + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2nodeConfigurationUpdateFailure_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &asn_DEF_value_80, - select_E2setupFailureIEs_value_type, - { &asn_OER_memb_value_constr_80, &asn_PER_memb_value_constr_80, memb_value_constraint_77 }, + &asn_DEF_value_152, + select_E2nodeConfigurationUpdateFailure_IEs_value_type, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_152, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_152, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_149 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_E2setupFailureIEs_tags_77[] = { +static const ber_tlv_tag_t asn_DEF_E2nodeConfigurationUpdateFailure_IEs_tags_149[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_E2setupFailureIEs_tag2el_77[] = { +static const asn_TYPE_tag2member_t asn_MAP_E2nodeConfigurationUpdateFailure_IEs_tag2el_149[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -asn_SEQUENCE_specifics_t asn_SPC_E2setupFailureIEs_specs_77 = { - sizeof(struct E2setupFailureIEs), - offsetof(struct E2setupFailureIEs, _asn_ctx), - asn_MAP_E2setupFailureIEs_tag2el_77, +asn_SEQUENCE_specifics_t asn_SPC_E2nodeConfigurationUpdateFailure_IEs_specs_149 = { + sizeof(struct E2nodeConfigurationUpdateFailure_IEs), + offsetof(struct E2nodeConfigurationUpdateFailure_IEs, _asn_ctx), + asn_MAP_E2nodeConfigurationUpdateFailure_IEs_tag2el_149, 2, /* 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_TYPE_descriptor_t asn_DEF_E2nodeConfigurationUpdateFailure_IEs = { + "E2nodeConfigurationUpdateFailure-IEs", + "E2nodeConfigurationUpdateFailure-IEs", &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, + asn_DEF_E2nodeConfigurationUpdateFailure_IEs_tags_149, + sizeof(asn_DEF_E2nodeConfigurationUpdateFailure_IEs_tags_149) + /sizeof(asn_DEF_E2nodeConfigurationUpdateFailure_IEs_tags_149[0]), /* 1 */ + asn_DEF_E2nodeConfigurationUpdateFailure_IEs_tags_149, /* Same as above */ + sizeof(asn_DEF_E2nodeConfigurationUpdateFailure_IEs_tags_149) + /sizeof(asn_DEF_E2nodeConfigurationUpdateFailure_IEs_tags_149[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeConfigurationUpdateFailure_IEs_149, 3, /* Elements count */ - &asn_SPC_E2setupFailureIEs_specs_77 /* Additional specs */ + &asn_SPC_E2nodeConfigurationUpdateFailure_IEs_specs_149 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_84[] = { +static asn_TYPE_member_t asn_MBR_value_156[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs__value, choice.TransactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_TransactionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "TransactionID" + }, { ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs__value, choice.Cause), -1 /* Ambiguous tag (CHOICE?) */, 0, &asn_DEF_Cause, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "Cause" }, }; -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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_156[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* e2Node */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 1, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 1, 0, 0 } /* misc */ }; -static asn_CHOICE_specifics_t asn_SPC_value_specs_84 = { +static asn_CHOICE_specifics_t asn_SPC_value_specs_156 = { 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 */ + asn_MAP_value_tag2el_156, + 7, /* 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 = { +asn_TYPE_descriptor_t asn_DEF_value_156 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -6792,19 +14733,35 @@ asn_TYPE_descriptor_t asn_DEF_value_84 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_156, + 2, /* Elements count */ + &asn_SPC_value_specs_156 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ResetRequestIEs_81[] = { +asn_TYPE_member_t asn_MBR_ResetRequestIEs_153[] = { { ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_82, &asn_PER_memb_id_constr_82, memb_id_constraint_81 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_154, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_154, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_153 + }, 0, 0, /* No default value */ "id" }, @@ -6813,31 +14770,47 @@ asn_TYPE_member_t asn_MBR_ResetRequestIEs_81[] = { 0, &asn_DEF_Criticality, select_ResetRequestIEs_criticality_type, - { &asn_OER_memb_criticality_constr_83, &asn_PER_memb_criticality_constr_83, memb_criticality_constraint_81 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_155, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_155, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_153 + }, 0, 0, /* No default value */ "criticality" }, { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &asn_DEF_value_84, + &asn_DEF_value_156, select_ResetRequestIEs_value_type, - { &asn_OER_memb_value_constr_84, &asn_PER_memb_value_constr_84, memb_value_constraint_81 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_156, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_156, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_153 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_ResetRequestIEs_tags_81[] = { +static const ber_tlv_tag_t asn_DEF_ResetRequestIEs_tags_153[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_ResetRequestIEs_tag2el_81[] = { +static const asn_TYPE_tag2member_t asn_MAP_ResetRequestIEs_tag2el_153[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -asn_SEQUENCE_specifics_t asn_SPC_ResetRequestIEs_specs_81 = { +asn_SEQUENCE_specifics_t asn_SPC_ResetRequestIEs_specs_153 = { sizeof(struct ResetRequestIEs), offsetof(struct ResetRequestIEs, _asn_ctx), - asn_MAP_ResetRequestIEs_tag2el_81, + asn_MAP_ResetRequestIEs_tag2el_153, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* First extension addition */ @@ -6846,44 +14819,78 @@ 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, + asn_DEF_ResetRequestIEs_tags_153, + sizeof(asn_DEF_ResetRequestIEs_tags_153) + /sizeof(asn_DEF_ResetRequestIEs_tags_153[0]), /* 1 */ + asn_DEF_ResetRequestIEs_tags_153, /* Same as above */ + sizeof(asn_DEF_ResetRequestIEs_tags_153) + /sizeof(asn_DEF_ResetRequestIEs_tags_153[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_ResetRequestIEs_153, 3, /* Elements count */ - &asn_SPC_ResetRequestIEs_specs_81 /* Additional specs */ + &asn_SPC_ResetRequestIEs_specs_153 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_88[] = { +static asn_TYPE_member_t asn_MBR_value_160[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs__value, choice.TransactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_TransactionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "TransactionID" + }, { ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs__value, choice.CriticalityDiagnostics), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_CriticalityDiagnostics, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "CriticalityDiagnostics" }, }; -static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_88[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* CriticalityDiagnostics */ +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_160[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 } /* CriticalityDiagnostics */ }; -static asn_CHOICE_specifics_t asn_SPC_value_specs_88 = { +static asn_CHOICE_specifics_t asn_SPC_value_specs_160 = { 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 */ + asn_MAP_value_tag2el_160, + 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_88 = { +asn_TYPE_descriptor_t asn_DEF_value_160 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -6891,19 +14898,35 @@ asn_TYPE_descriptor_t asn_DEF_value_88 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_160, + 2, /* Elements count */ + &asn_SPC_value_specs_160 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ResetResponseIEs_85[] = { +asn_TYPE_member_t asn_MBR_ResetResponseIEs_157[] = { { ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_86, &asn_PER_memb_id_constr_86, memb_id_constraint_85 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_158, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_158, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_157 + }, 0, 0, /* No default value */ "id" }, @@ -6912,31 +14935,47 @@ asn_TYPE_member_t asn_MBR_ResetResponseIEs_85[] = { 0, &asn_DEF_Criticality, select_ResetResponseIEs_criticality_type, - { &asn_OER_memb_criticality_constr_87, &asn_PER_memb_criticality_constr_87, memb_criticality_constraint_85 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_159, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_159, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_157 + }, 0, 0, /* No default value */ "criticality" }, { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &asn_DEF_value_88, + &asn_DEF_value_160, select_ResetResponseIEs_value_type, - { &asn_OER_memb_value_constr_88, &asn_PER_memb_value_constr_88, memb_value_constraint_85 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_160, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_160, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_157 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_ResetResponseIEs_tags_85[] = { +static const ber_tlv_tag_t asn_DEF_ResetResponseIEs_tags_157[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_ResetResponseIEs_tag2el_85[] = { +static const asn_TYPE_tag2member_t asn_MAP_ResetResponseIEs_tag2el_157[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -asn_SEQUENCE_specifics_t asn_SPC_ResetResponseIEs_specs_85 = { +asn_SEQUENCE_specifics_t asn_SPC_ResetResponseIEs_specs_157 = { sizeof(struct ResetResponseIEs), offsetof(struct ResetResponseIEs, _asn_ctx), - asn_MAP_ResetResponseIEs_tag2el_85, + asn_MAP_ResetResponseIEs_tag2el_157, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* First extension addition */ @@ -6945,25 +14984,75 @@ 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, + asn_DEF_ResetResponseIEs_tags_157, + sizeof(asn_DEF_ResetResponseIEs_tags_157) + /sizeof(asn_DEF_ResetResponseIEs_tags_157[0]), /* 1 */ + asn_DEF_ResetResponseIEs_tags_157, /* Same as above */ + sizeof(asn_DEF_ResetResponseIEs_tags_157) + /sizeof(asn_DEF_ResetResponseIEs_tags_157[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_ResetResponseIEs_157, 3, /* Elements count */ - &asn_SPC_ResetResponseIEs_specs_85 /* Additional specs */ + &asn_SPC_ResetResponseIEs_specs_157 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_92[] = { +static asn_TYPE_member_t asn_MBR_value_164[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs__value, choice.TransactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_TransactionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "TransactionID" + }, { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "RANfunctions-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs__value, choice.RANfunctions_List_1), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctions_List, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RANfunctions-List" }, @@ -6972,27 +15061,37 @@ static asn_TYPE_member_t asn_MBR_value_92[] = { 0, &asn_DEF_RANfunctionsID_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_164[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 2 }, /* RANfunctions-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* RANfunctions-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 } /* RANfunctionsID-List */ }; -static asn_CHOICE_specifics_t asn_SPC_value_specs_92 = { +static asn_CHOICE_specifics_t asn_SPC_value_specs_164 = { 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 */ + asn_MAP_value_tag2el_164, + 4, /* 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 = { +asn_TYPE_descriptor_t asn_DEF_value_164 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -7000,19 +15099,35 @@ asn_TYPE_descriptor_t asn_DEF_value_92 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_164, + 4, /* Elements count */ + &asn_SPC_value_specs_164 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_89[] = { +asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_161[] = { { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_90, &asn_PER_memb_id_constr_90, memb_id_constraint_89 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_162, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_162, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_161 + }, 0, 0, /* No default value */ "id" }, @@ -7021,31 +15136,47 @@ asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_89[] = { 0, &asn_DEF_Criticality, select_RICserviceUpdate_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_91, &asn_PER_memb_criticality_constr_91, memb_criticality_constraint_89 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_163, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_163, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_161 + }, 0, 0, /* No default value */ "criticality" }, { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &asn_DEF_value_92, + &asn_DEF_value_164, select_RICserviceUpdate_IEs_value_type, - { &asn_OER_memb_value_constr_92, &asn_PER_memb_value_constr_92, memb_value_constraint_89 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_164, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_164, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_161 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICserviceUpdate_IEs_tags_89[] = { +static const ber_tlv_tag_t asn_DEF_RICserviceUpdate_IEs_tags_161[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdate_IEs_tag2el_89[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdate_IEs_tag2el_161[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_IEs_specs_89 = { +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_IEs_specs_161 = { sizeof(struct RICserviceUpdate_IEs), offsetof(struct RICserviceUpdate_IEs, _asn_ctx), - asn_MAP_RICserviceUpdate_IEs_tag2el_89, + asn_MAP_RICserviceUpdate_IEs_tag2el_161, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* First extension addition */ @@ -7054,25 +15185,58 @@ 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, + asn_DEF_RICserviceUpdate_IEs_tags_161, + sizeof(asn_DEF_RICserviceUpdate_IEs_tags_161) + /sizeof(asn_DEF_RICserviceUpdate_IEs_tags_161[0]), /* 1 */ + asn_DEF_RICserviceUpdate_IEs_tags_161, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdate_IEs_tags_161) + /sizeof(asn_DEF_RICserviceUpdate_IEs_tags_161[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICserviceUpdate_IEs_161, 3, /* Elements count */ - &asn_SPC_RICserviceUpdate_IEs_specs_89 /* Additional specs */ + &asn_SPC_RICserviceUpdate_IEs_specs_161 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_96[] = { +static asn_TYPE_member_t asn_MBR_value_168[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs__value, choice.TransactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_TransactionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "TransactionID" + }, { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RANfunctionsID-List" }, @@ -7081,27 +15245,36 @@ static asn_TYPE_member_t asn_MBR_value_96[] = { 0, &asn_DEF_RANfunctionsIDcause_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_168[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 1 }, /* RANfunctionsID-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* RANfunctionsIDcause-List */ }; -static asn_CHOICE_specifics_t asn_SPC_value_specs_96 = { +static asn_CHOICE_specifics_t asn_SPC_value_specs_168 = { 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 */ + asn_MAP_value_tag2el_168, + 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_96 = { +asn_TYPE_descriptor_t asn_DEF_value_168 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -7109,19 +15282,35 @@ asn_TYPE_descriptor_t asn_DEF_value_96 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_168, + 3, /* Elements count */ + &asn_SPC_value_specs_168 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_93[] = { +asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_165[] = { { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_94, &asn_PER_memb_id_constr_94, memb_id_constraint_93 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_166, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_166, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_165 + }, 0, 0, /* No default value */ "id" }, @@ -7130,31 +15319,47 @@ asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_93[] = { 0, &asn_DEF_Criticality, select_RICserviceUpdateAcknowledge_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_95, &asn_PER_memb_criticality_constr_95, memb_criticality_constraint_93 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_167, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_167, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_165 + }, 0, 0, /* No default value */ "criticality" }, { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &asn_DEF_value_96, + &asn_DEF_value_168, select_RICserviceUpdateAcknowledge_IEs_value_type, - { &asn_OER_memb_value_constr_96, &asn_PER_memb_value_constr_96, memb_value_constraint_93 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_168, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_168, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_165 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[] = { +static const ber_tlv_tag_t asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_165[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_93[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_165[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93 = { +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_165 = { sizeof(struct RICserviceUpdateAcknowledge_IEs), offsetof(struct RICserviceUpdateAcknowledge_IEs, _asn_ctx), - asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_93, + asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_165, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* First extension addition */ @@ -7163,34 +15368,75 @@ 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, + asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_165, + sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_165) + /sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_165[0]), /* 1 */ + asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_165, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_165) + /sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_165[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICserviceUpdateAcknowledge_IEs_165, 3, /* Elements count */ - &asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93 /* Additional specs */ + &asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_165 /* 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)), +static asn_TYPE_member_t asn_MBR_value_172[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.TransactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, - &asn_DEF_RANfunctionsIDcause_List, + &asn_DEF_TransactionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "RANfunctionsIDcause-List" + "TransactionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.Cause), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_Cause, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "Cause" }, { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.TimeToWait), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, &asn_DEF_TimeToWait, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "TimeToWait" }, @@ -7199,31 +15445,45 @@ static asn_TYPE_member_t asn_MBR_value_100[] = { 0, &asn_DEF_CriticalityDiagnostics, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "CriticalityDiagnostics" }, }; -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 }, /* TimeToWait */ - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctionsIDcause-List */ - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* CriticalityDiagnostics */ -}; -static asn_CHOICE_specifics_t asn_SPC_value_specs_100 = { +static const unsigned asn_MAP_value_to_canonical_172[] = { 0, 2, 3, 1 }; +static const unsigned asn_MAP_value_from_canonical_172[] = { 0, 3, 1, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_172[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 2, 0, 0 }, /* TimeToWait */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, 0, 0 }, /* CriticalityDiagnostics */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* e2Node */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 1, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 1, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_172 = { 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, + asn_MAP_value_tag2el_172, + 9, /* Count of tags in the map */ + asn_MAP_value_to_canonical_172, + asn_MAP_value_from_canonical_172, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_value_100 = { +asn_TYPE_descriptor_t asn_DEF_value_172 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -7231,19 +15491,35 @@ asn_TYPE_descriptor_t asn_DEF_value_100 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_172, + 4, /* Elements count */ + &asn_SPC_value_specs_172 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_97[] = { +asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_169[] = { { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_98, &asn_PER_memb_id_constr_98, memb_id_constraint_97 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_170, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_170, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_169 + }, 0, 0, /* No default value */ "id" }, @@ -7252,31 +15528,47 @@ asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_97[] = { 0, &asn_DEF_Criticality, select_RICserviceUpdateFailure_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_99, &asn_PER_memb_criticality_constr_99, memb_criticality_constraint_97 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_171, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_171, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_169 + }, 0, 0, /* No default value */ "criticality" }, { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &asn_DEF_value_100, + &asn_DEF_value_172, select_RICserviceUpdateFailure_IEs_value_type, - { &asn_OER_memb_value_constr_100, &asn_PER_memb_value_constr_100, memb_value_constraint_97 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_172, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_172, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_169 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICserviceUpdateFailure_IEs_tags_97[] = { +static const ber_tlv_tag_t asn_DEF_RICserviceUpdateFailure_IEs_tags_169[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateFailure_IEs_tag2el_97[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateFailure_IEs_tag2el_169[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_IEs_specs_97 = { +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_IEs_specs_169 = { sizeof(struct RICserviceUpdateFailure_IEs), offsetof(struct RICserviceUpdateFailure_IEs, _asn_ctx), - asn_MAP_RICserviceUpdateFailure_IEs_tag2el_97, + asn_MAP_RICserviceUpdateFailure_IEs_tag2el_169, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* First extension addition */ @@ -7285,44 +15577,78 @@ 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, + asn_DEF_RICserviceUpdateFailure_IEs_tags_169, + sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_169) + /sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_169[0]), /* 1 */ + asn_DEF_RICserviceUpdateFailure_IEs_tags_169, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_169) + /sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_169[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICserviceUpdateFailure_IEs_169, 3, /* Elements count */ - &asn_SPC_RICserviceUpdateFailure_IEs_specs_97 /* Additional specs */ + &asn_SPC_RICserviceUpdateFailure_IEs_specs_169 /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_value_104[] = { +static asn_TYPE_member_t asn_MBR_value_176[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs__value, choice.TransactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_TransactionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "TransactionID" + }, { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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 const asn_TYPE_tag2member_t asn_MAP_value_tag2el_176[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* TransactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 } /* RANfunctionsID-List */ }; -static asn_CHOICE_specifics_t asn_SPC_value_specs_104 = { +static asn_CHOICE_specifics_t asn_SPC_value_specs_176 = { 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 */ + asn_MAP_value_tag2el_176, + 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_104 = { +asn_TYPE_descriptor_t asn_DEF_value_176 = { "value", "value", &asn_OP_OPEN_TYPE, @@ -7330,19 +15656,35 @@ asn_TYPE_descriptor_t asn_DEF_value_104 = { 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 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, + asn_MBR_value_176, + 2, /* Elements count */ + &asn_SPC_value_specs_176 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_101[] = { +asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_173[] = { { ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, id), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_ProtocolIE_ID, 0, - { &asn_OER_memb_id_constr_102, &asn_PER_memb_id_constr_102, memb_id_constraint_101 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_id_constr_174, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_id_constr_174, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_id_constraint_173 + }, 0, 0, /* No default value */ "id" }, @@ -7351,31 +15693,47 @@ asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_101[] = { 0, &asn_DEF_Criticality, select_RICserviceQuery_IEs_criticality_type, - { &asn_OER_memb_criticality_constr_103, &asn_PER_memb_criticality_constr_103, memb_criticality_constraint_101 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_175, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_175, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_173 + }, 0, 0, /* No default value */ "criticality" }, { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, value), -1 /* Ambiguous tag (ANY?) */, 0, - &asn_DEF_value_104, + &asn_DEF_value_176, select_RICserviceQuery_IEs_value_type, - { &asn_OER_memb_value_constr_104, &asn_PER_memb_value_constr_104, memb_value_constraint_101 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_176, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_176, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_173 + }, 0, 0, /* No default value */ "value" }, }; -static const ber_tlv_tag_t asn_DEF_RICserviceQuery_IEs_tags_101[] = { +static const ber_tlv_tag_t asn_DEF_RICserviceQuery_IEs_tags_173[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static const asn_TYPE_tag2member_t asn_MAP_RICserviceQuery_IEs_tag2el_101[] = { +static const asn_TYPE_tag2member_t asn_MAP_RICserviceQuery_IEs_tag2el_173[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* id */ { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 } /* criticality */ }; -asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_IEs_specs_101 = { +asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_IEs_specs_173 = { sizeof(struct RICserviceQuery_IEs), offsetof(struct RICserviceQuery_IEs, _asn_ctx), - asn_MAP_RICserviceQuery_IEs_tag2el_101, + asn_MAP_RICserviceQuery_IEs_tag2el_173, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* First extension addition */ @@ -7384,15 +15742,23 @@ 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, + asn_DEF_RICserviceQuery_IEs_tags_173, + sizeof(asn_DEF_RICserviceQuery_IEs_tags_173) + /sizeof(asn_DEF_RICserviceQuery_IEs_tags_173[0]), /* 1 */ + asn_DEF_RICserviceQuery_IEs_tags_173, /* Same as above */ + sizeof(asn_DEF_RICserviceQuery_IEs_tags_173) + /sizeof(asn_DEF_RICserviceQuery_IEs_tags_173[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICserviceQuery_IEs_173, 3, /* Elements count */ - &asn_SPC_RICserviceQuery_IEs_specs_101 /* Additional specs */ + &asn_SPC_RICserviceQuery_IEs_specs_173 /* Additional specs */ }; diff --git a/e2ap/lib/ProtocolIE-FieldPair.c b/e2ap/lib/ProtocolIE-FieldPair.c index fa909ca..87a45dc 100644 --- a/e2ap/lib/ProtocolIE-FieldPair.c +++ b/e2ap/lib/ProtocolIE-FieldPair.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ProtocolIE-FieldPair.h" diff --git a/e2ap/lib/ProtocolIE-ID.c b/e2ap/lib/ProtocolIE-ID.c index b0e56de..4865d75 100644 --- a/e2ap/lib/ProtocolIE-ID.c +++ b/e2ap/lib/ProtocolIE-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP-CommonDataTypes-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "commonDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ProtocolIE-ID.h" @@ -21,7 +21,7 @@ ProtocolIE_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,14 +36,18 @@ ProtocolIE_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_ProtocolIE_ID_constr_1 CC_NOTUSED = { { 2, 1 } /* (0..65535) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_ProtocolIE_ID_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_ProtocolIE_ID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -57,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ID = { asn_DEF_ProtocolIE_ID_tags_1, /* Same as above */ sizeof(asn_DEF_ProtocolIE_ID_tags_1) /sizeof(asn_DEF_ProtocolIE_ID_tags_1[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ID_constr_1, &asn_PER_type_ProtocolIE_ID_constr_1, ProtocolIE_ID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ProtocolIE_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ProtocolIE_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + ProtocolIE_ID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2ap/lib/ProtocolIE-SingleContainer.c b/e2ap/lib/ProtocolIE-SingleContainer.c index 5b06b80..4c69f96 100644 --- a/e2ap/lib/ProtocolIE-SingleContainer.c +++ b/e2ap/lib/ProtocolIE-SingleContainer.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP-Containers-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "containerDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ProtocolIE-SingleContainer.h" @@ -19,6 +19,50 @@ * This type is implemented using RICaction_NotAdmitted_ItemIEs, * so here we adjust the DEF accordingly. */ +/* + * This type is implemented using RICsubscription_withCause_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using E2connectionUpdate_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using E2connectionUpdateRemove_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using E2connectionSetupFailed_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using E2nodeComponentConfigAddition_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using E2nodeComponentConfigUpdate_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using E2nodeComponentConfigRemoval_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using E2nodeTNLassociationRemoval_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using E2nodeComponentConfigAdditionAck_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using E2nodeComponentConfigUpdateAck_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using E2nodeComponentConfigRemovalAck_ItemIEs, + * so here we adjust the DEF accordingly. + */ /* * This type is implemented using RANfunction_ItemIEs, * so here we adjust the DEF accordingly. @@ -31,117 +75,462 @@ * This type is implemented using RANfunctionIDcause_ItemIEs, * so here we adjust the DEF accordingly. */ -static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_90P0_tags_1[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P0_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P0 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P0 = { "ProtocolIE-SingleContainer", "ProtocolIE-SingleContainer", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainer_90P0_tags_1, - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P0_tags_1) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P0_tags_1[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainer_90P0_tags_1, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P0_tags_1) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P0_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + asn_DEF_ProtocolIE_SingleContainer_88P0_tags_1, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P0_tags_1[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P0_tags_1, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P0_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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_SingleContainer_90P1_tags_2[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P1_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P1 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P1 = { "ProtocolIE-SingleContainer", "ProtocolIE-SingleContainer", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainer_90P1_tags_2, - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P1_tags_2) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P1_tags_2[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainer_90P1_tags_2, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P1_tags_2) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P1_tags_2[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + asn_DEF_ProtocolIE_SingleContainer_88P1_tags_2, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P1_tags_2) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P1_tags_2[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P1_tags_2, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P1_tags_2) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P1_tags_2[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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_SingleContainer_90P2_tags_3[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P2_tags_3[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P2 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P2 = { "ProtocolIE-SingleContainer", "ProtocolIE-SingleContainer", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainer_90P2_tags_3, - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P2_tags_3) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P2_tags_3[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainer_90P2_tags_3, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P2_tags_3) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P2_tags_3[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + asn_DEF_ProtocolIE_SingleContainer_88P2_tags_3, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P2_tags_3) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P2_tags_3[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P2_tags_3, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P2_tags_3) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P2_tags_3[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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_SingleContainer_90P3_tags_4[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P3_tags_4[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P3 = { + "ProtocolIE-SingleContainer", + "ProtocolIE-SingleContainer", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainer_88P3_tags_4, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P3_tags_4) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P3_tags_4[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P3_tags_4, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P3_tags_4) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P3_tags_4[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICsubscription_withCause_ItemIEs_13, + 3, /* Elements count */ + &asn_SPC_RICsubscription_withCause_ItemIEs_specs_13 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P4_tags_5[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P4 = { + "ProtocolIE-SingleContainer", + "ProtocolIE-SingleContainer", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainer_88P4_tags_5, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P4_tags_5) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P4_tags_5[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P4_tags_5, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P4_tags_5) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P4_tags_5[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdate_ItemIEs_17, + 3, /* Elements count */ + &asn_SPC_E2connectionUpdate_ItemIEs_specs_17 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P5_tags_6[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P5 = { + "ProtocolIE-SingleContainer", + "ProtocolIE-SingleContainer", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainer_88P5_tags_6, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P5_tags_6) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P5_tags_6[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P5_tags_6, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P5_tags_6) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P5_tags_6[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionUpdateRemove_ItemIEs_21, + 3, /* Elements count */ + &asn_SPC_E2connectionUpdateRemove_ItemIEs_specs_21 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P6_tags_7[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P6 = { + "ProtocolIE-SingleContainer", + "ProtocolIE-SingleContainer", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainer_88P6_tags_7, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P6_tags_7) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P6_tags_7[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P6_tags_7, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P6_tags_7) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P6_tags_7[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2connectionSetupFailed_ItemIEs_25, + 3, /* Elements count */ + &asn_SPC_E2connectionSetupFailed_ItemIEs_specs_25 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P7_tags_8[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P7 = { + "ProtocolIE-SingleContainer", + "ProtocolIE-SingleContainer", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainer_88P7_tags_8, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P7_tags_8) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P7_tags_8[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P7_tags_8, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P7_tags_8) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P7_tags_8[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigAddition_ItemIEs_29, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigAddition_ItemIEs_specs_29 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P8_tags_9[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P8 = { + "ProtocolIE-SingleContainer", + "ProtocolIE-SingleContainer", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainer_88P8_tags_9, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P8_tags_9) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P8_tags_9[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P8_tags_9, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P8_tags_9) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P8_tags_9[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigUpdate_ItemIEs_33, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigUpdate_ItemIEs_specs_33 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P9_tags_10[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P9 = { + "ProtocolIE-SingleContainer", + "ProtocolIE-SingleContainer", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainer_88P9_tags_10, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P9_tags_10) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P9_tags_10[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P9_tags_10, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P9_tags_10) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P9_tags_10[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigRemoval_ItemIEs_37, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigRemoval_ItemIEs_specs_37 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P10_tags_11[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P10 = { + "ProtocolIE-SingleContainer", + "ProtocolIE-SingleContainer", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainer_88P10_tags_11, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P10_tags_11) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P10_tags_11[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P10_tags_11, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P10_tags_11) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P10_tags_11[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeTNLassociationRemoval_ItemIEs_41, + 3, /* Elements count */ + &asn_SPC_E2nodeTNLassociationRemoval_ItemIEs_specs_41 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P11_tags_12[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P11 = { + "ProtocolIE-SingleContainer", + "ProtocolIE-SingleContainer", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainer_88P11_tags_12, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P11_tags_12) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P11_tags_12[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P11_tags_12, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P11_tags_12) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P11_tags_12[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigAdditionAck_ItemIEs_45, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigAdditionAck_ItemIEs_specs_45 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P12_tags_13[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P12 = { + "ProtocolIE-SingleContainer", + "ProtocolIE-SingleContainer", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainer_88P12_tags_13, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P12_tags_13) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P12_tags_13[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P12_tags_13, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P12_tags_13) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P12_tags_13[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigUpdateAck_ItemIEs_49, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigUpdateAck_ItemIEs_specs_49 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P13_tags_14[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P13 = { + "ProtocolIE-SingleContainer", + "ProtocolIE-SingleContainer", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainer_88P13_tags_14, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P13_tags_14) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P13_tags_14[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P13_tags_14, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P13_tags_14) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P13_tags_14[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_E2nodeComponentConfigRemovalAck_ItemIEs_53, + 3, /* Elements count */ + &asn_SPC_E2nodeComponentConfigRemovalAck_ItemIEs_specs_53 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P14_tags_15[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P3 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P14 = { "ProtocolIE-SingleContainer", "ProtocolIE-SingleContainer", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainer_90P3_tags_4, - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P3_tags_4) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P3_tags_4[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainer_90P3_tags_4, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P3_tags_4) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P3_tags_4[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_RANfunction_ItemIEs_13, + asn_DEF_ProtocolIE_SingleContainer_88P14_tags_15, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P14_tags_15) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P14_tags_15[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P14_tags_15, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P14_tags_15) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P14_tags_15[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RANfunction_ItemIEs_57, 3, /* Elements count */ - &asn_SPC_RANfunction_ItemIEs_specs_13 /* Additional specs */ + &asn_SPC_RANfunction_ItemIEs_specs_57 /* Additional specs */ }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_90P4_tags_5[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P15_tags_16[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P4 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P15 = { "ProtocolIE-SingleContainer", "ProtocolIE-SingleContainer", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainer_90P4_tags_5, - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P4_tags_5) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P4_tags_5[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainer_90P4_tags_5, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P4_tags_5) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P4_tags_5[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_RANfunctionID_ItemIEs_17, + asn_DEF_ProtocolIE_SingleContainer_88P15_tags_16, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P15_tags_16) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P15_tags_16[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P15_tags_16, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P15_tags_16) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P15_tags_16[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RANfunctionID_ItemIEs_61, 3, /* Elements count */ - &asn_SPC_RANfunctionID_ItemIEs_specs_17 /* Additional specs */ + &asn_SPC_RANfunctionID_ItemIEs_specs_61 /* Additional specs */ }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_90P5_tags_6[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_88P16_tags_17[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_90P5 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_88P16 = { "ProtocolIE-SingleContainer", "ProtocolIE-SingleContainer", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainer_90P5_tags_6, - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P5_tags_6) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P5_tags_6[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainer_90P5_tags_6, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainer_90P5_tags_6) - /sizeof(asn_DEF_ProtocolIE_SingleContainer_90P5_tags_6[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_RANfunctionIDcause_ItemIEs_21, + asn_DEF_ProtocolIE_SingleContainer_88P16_tags_17, + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P16_tags_17) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P16_tags_17[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainer_88P16_tags_17, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainer_88P16_tags_17) + /sizeof(asn_DEF_ProtocolIE_SingleContainer_88P16_tags_17[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RANfunctionIDcause_ItemIEs_65, 3, /* Elements count */ - &asn_SPC_RANfunctionIDcause_ItemIEs_specs_21 /* Additional specs */ + &asn_SPC_RANfunctionIDcause_ItemIEs_specs_65 /* Additional specs */ }; diff --git a/e2ap/lib/RANfunction-Item.c b/e2ap/lib/RANfunction-Item.c index f80753b..0c8ea28 100644 --- a/e2ap/lib/RANfunction-Item.c +++ b/e2ap/lib/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-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RANfunction-Item.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_RANfunction_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RANfunctionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ranFunctionID" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_RANfunction_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RANfunctionDefinition, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ranFunctionDefinition" }, @@ -31,10 +47,35 @@ asn_TYPE_member_t asn_MBR_RANfunction_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RANfunctionRevision, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ranFunctionRevision" }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionOID), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionOID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "ranFunctionOID" + }, }; static const ber_tlv_tag_t asn_DEF_RANfunction_Item_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) @@ -42,15 +83,16 @@ static const ber_tlv_tag_t asn_DEF_RANfunction_Item_tags_1[] = { 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 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ranFunctionRevision */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* ranFunctionOID */ }; 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 */ + 4, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ - 3, /* First extension addition */ + 4, /* First extension addition */ }; asn_TYPE_descriptor_t asn_DEF_RANfunction_Item = { "RANfunction-Item", @@ -62,9 +104,17 @@ asn_TYPE_descriptor_t asn_DEF_RANfunction_Item = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RANfunction_Item_1, - 3, /* Elements count */ + 4, /* Elements count */ &asn_SPC_RANfunction_Item_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/RANfunctionDefinition.c b/e2ap/lib/RANfunctionDefinition.c index 49c090f..3a626fb 100644 --- a/e2ap/lib/RANfunctionDefinition.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RANfunctionDefinition.h" @@ -24,7 +24,15 @@ asn_TYPE_descriptor_t asn_DEF_RANfunctionDefinition = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OCTET_STRING_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2ap/lib/RANfunctionID-Item.c b/e2ap/lib/RANfunctionID-Item.c index fb2b6fc..a359e1c 100644 --- a/e2ap/lib/RANfunctionID-Item.c +++ b/e2ap/lib/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-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RANfunctionID-Item.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_RANfunctionID_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RANfunctionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ranFunctionID" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_RANfunctionID_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RANfunctionRevision, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ranFunctionRevision" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_RANfunctionID_Item = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RANfunctionID_Item_1, 2, /* Elements count */ &asn_SPC_RANfunctionID_Item_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RANfunctionID.c b/e2ap/lib/RANfunctionID.c index d79a9d6..08295bd 100644 --- a/e2ap/lib/RANfunctionID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RANfunctionID.h" @@ -21,7 +21,7 @@ RANfunctionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 4095)) { + if((value >= 0L && value <= 4095L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,14 +36,18 @@ RANfunctionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RANfunctionID_constr_1 CC_NOTUSED = { { 2, 1 } /* (0..4095) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_RANfunctionID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -57,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_RANfunctionID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RANfunctionID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RANfunctionID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + RANfunctionID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2ap/lib/RANfunctionIDcause-Item.c b/e2ap/lib/RANfunctionIDcause-Item.c index b74eb64..dae1954 100644 --- a/e2ap/lib/RANfunctionIDcause-Item.c +++ b/e2ap/lib/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-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RANfunctionIDcause-Item.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_RANfunctionIDcause_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RANfunctionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ranFunctionID" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_RANfunctionIDcause_Item_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_Cause, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "cause" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_Item = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RANfunctionIDcause_Item_1, 2, /* Elements count */ &asn_SPC_RANfunctionIDcause_Item_specs_1 /* Additional specs */ diff --git a/e2sm/lib/RANcallProcess-ID-string.c b/e2ap/lib/RANfunctionOID.c similarity index 57% rename from e2sm/lib/RANcallProcess-ID-string.c rename to e2ap/lib/RANfunctionOID.c index b49b812..2cacab4 100644 --- a/e2sm/lib/RANcallProcess-ID-string.c +++ b/e2ap/lib/RANfunctionOID.c @@ -1,11 +1,11 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ -#include "RANcallProcess-ID-string.h" +#include "RANfunctionOID.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, /* */ @@ -40,7 +40,7 @@ static int check_permitted_alphabet_1(const void *sptr) { } int -RANcallProcess_ID_string_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, +RANfunctionOID_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; @@ -54,7 +54,7 @@ RANcallProcess_ID_string_constraint(const asn_TYPE_descriptor_t *td, const void size = st->size; - if((size >= 1 && size <= 150) + if((size >= 1UL && size <= 1000UL) && !check_permitted_alphabet_1(st)) { /* Constraint check succeeded */ return 0; @@ -66,12 +66,12 @@ RANcallProcess_ID_string_constraint(const asn_TYPE_descriptor_t *td, const void } } -static int asn_PER_MAP_RANcallProcess_ID_string_1_v2c(unsigned int value) { +static int asn_PER_MAP_RANfunctionOID_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) { +static int asn_PER_MAP_RANfunctionOID_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]; @@ -80,29 +80,41 @@ static int asn_PER_MAP_RANcallProcess_ID_string_1_c2v(unsigned int 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 = { +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_RANfunctionOID_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 = { +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_RANfunctionOID_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 */ + { APC_CONSTRAINED | APC_EXTENSIBLE, 10, 10, 1, 1000 } /* (SIZE(1..1000,...)) */, + asn_PER_MAP_RANfunctionOID_1_v2c, /* Value to PER code map */ + asn_PER_MAP_RANfunctionOID_1_c2v /* PER code to value map */ }; -static const ber_tlv_tag_t asn_DEF_RANcallProcess_ID_string_tags_1[] = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static const ber_tlv_tag_t asn_DEF_RANfunctionOID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_RANcallProcess_ID_string = { - "RANcallProcess-ID-string", - "RANcallProcess-ID-string", +asn_TYPE_descriptor_t asn_DEF_RANfunctionOID = { + "RANfunctionOID", + "RANfunctionOID", &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 }, + asn_DEF_RANfunctionOID_tags_1, + sizeof(asn_DEF_RANfunctionOID_tags_1) + /sizeof(asn_DEF_RANfunctionOID_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionOID_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionOID_tags_1) + /sizeof(asn_DEF_RANfunctionOID_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RANfunctionOID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RANfunctionOID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + RANfunctionOID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2ap/lib/RANfunctionRevision.c b/e2ap/lib/RANfunctionRevision.c index 32cc4a5..390cd0f 100644 --- a/e2ap/lib/RANfunctionRevision.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RANfunctionRevision.h" @@ -21,7 +21,7 @@ RANfunctionRevision_constraint(const asn_TYPE_descriptor_t *td, const void *sptr value = *(const long *)sptr; - if((value >= 0 && value <= 4095)) { + if((value >= 0L && value <= 4095L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,14 +36,18 @@ RANfunctionRevision_constraint(const asn_TYPE_descriptor_t *td, const void *sptr * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RANfunctionRevision_constr_1 CC_NOTUSED = { { 2, 1 } /* (0..4095) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_RANfunctionRevision_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -57,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_RANfunctionRevision = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RANfunctionRevision_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RANfunctionRevision_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + RANfunctionRevision_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2ap/lib/RANfunctions-List.c b/e2ap/lib/RANfunctions-List.c index cf01054..d4f0f92 100644 --- a/e2ap/lib/RANfunctions-List.c +++ b/e2ap/lib/RANfunctions-List.c @@ -1,28 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RANfunctions-List.h" #include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RANfunctions_List_constr_1 CC_NOTUSED = { { 0, 0 }, - -1 /* (SIZE(0..256)) */}; + -1 /* (SIZE(1..256)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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)) */, + { APC_CONSTRAINED, 8, 8, 1, 256 } /* (SIZE(1..256)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_RANfunctions_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainer_90P3, + &asn_DEF_ProtocolIE_SingleContainer_88P14, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -45,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_RANfunctions_List = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RANfunctions_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RANfunctions_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_RANfunctions_List_1, 1, /* Single element */ &asn_SPC_RANfunctions_List_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RANfunctionsID-List.c b/e2ap/lib/RANfunctionsID-List.c index b888995..00a70d8 100644 --- a/e2ap/lib/RANfunctionsID-List.c +++ b/e2ap/lib/RANfunctionsID-List.c @@ -1,28 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RANfunctionsID-List.h" #include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RANfunctionsID_List_constr_1 CC_NOTUSED = { { 0, 0 }, - -1 /* (SIZE(0..256)) */}; + -1 /* (SIZE(1..256)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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)) */, + { APC_CONSTRAINED, 8, 8, 1, 256 } /* (SIZE(1..256)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_RANfunctionsID_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainer_90P4, + &asn_DEF_ProtocolIE_SingleContainer_88P15, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -45,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_RANfunctionsID_List = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RANfunctionsID_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RANfunctionsID_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_RANfunctionsID_List_1, 1, /* Single element */ &asn_SPC_RANfunctionsID_List_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RANfunctionsIDcause-List.c b/e2ap/lib/RANfunctionsIDcause-List.c index e1ae0d2..16100ba 100644 --- a/e2ap/lib/RANfunctionsIDcause-List.c +++ b/e2ap/lib/RANfunctionsIDcause-List.c @@ -1,28 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RANfunctionsIDcause-List.h" #include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RANfunctionsIDcause_List_constr_1 CC_NOTUSED = { { 0, 0 }, - -1 /* (SIZE(0..256)) */}; + -1 /* (SIZE(1..256)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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)) */, + { APC_CONSTRAINED, 8, 8, 1, 256 } /* (SIZE(1..256)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_RANfunctionsIDcause_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainer_90P5, + &asn_DEF_ProtocolIE_SingleContainer_88P16, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -45,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_RANfunctionsIDcause_List = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RANfunctionsIDcause_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RANfunctionsIDcause_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_RANfunctionsIDcause_List_1, 1, /* Single element */ &asn_SPC_RANfunctionsIDcause_List_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICaction-Admitted-Item.c b/e2ap/lib/RICaction-Admitted-Item.c index 27e741d..e7d3296 100644 --- a/e2ap/lib/RICaction-Admitted-Item.c +++ b/e2ap/lib/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-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICaction-Admitted-Item.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_RICaction_Admitted_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RICactionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricActionID" }, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_Item = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICaction_Admitted_Item_1, 1, /* Elements count */ &asn_SPC_RICaction_Admitted_Item_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICaction-Admitted-List.c b/e2ap/lib/RICaction-Admitted-List.c index e9e8a5b..8e5f99c 100644 --- a/e2ap/lib/RICaction-Admitted-List.c +++ b/e2ap/lib/RICaction-Admitted-List.c @@ -1,28 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICaction-Admitted-List.h" #include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RICaction_Admitted_List_constr_1 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(1..16)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_RICaction_Admitted_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainer_90P1, + &asn_DEF_ProtocolIE_SingleContainer_88P1, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -45,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_List = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RICaction_Admitted_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RICaction_Admitted_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_RICaction_Admitted_List_1, 1, /* Single element */ &asn_SPC_RICaction_Admitted_List_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICaction-NotAdmitted-Item.c b/e2ap/lib/RICaction-NotAdmitted-Item.c index 86212ed..2291aa7 100644 --- a/e2ap/lib/RICaction-NotAdmitted-Item.c +++ b/e2ap/lib/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-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICaction-NotAdmitted-Item.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RICactionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricActionID" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_Item_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_Cause, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "cause" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_Item = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICaction_NotAdmitted_Item_1, 2, /* Elements count */ &asn_SPC_RICaction_NotAdmitted_Item_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICaction-NotAdmitted-List.c b/e2ap/lib/RICaction-NotAdmitted-List.c index 7c7f6e2..3f9e045 100644 --- a/e2ap/lib/RICaction-NotAdmitted-List.c +++ b/e2ap/lib/RICaction-NotAdmitted-List.c @@ -1,28 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICaction-NotAdmitted-List.h" #include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RICaction_NotAdmitted_List_constr_1 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..16)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainer_90P2, + &asn_DEF_ProtocolIE_SingleContainer_88P2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -45,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_List = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RICaction_NotAdmitted_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RICaction_NotAdmitted_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_RICaction_NotAdmitted_List_1, 1, /* Single element */ &asn_SPC_RICaction_NotAdmitted_List_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICaction-ToBeSetup-Item.c b/e2ap/lib/RICaction-ToBeSetup-Item.c index 1e78073..7e71d34 100644 --- a/e2ap/lib/RICaction-ToBeSetup-Item.c +++ b/e2ap/lib/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-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICaction-ToBeSetup-Item.h" @@ -14,7 +14,15 @@ asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RICactionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricActionID" }, @@ -23,7 +31,15 @@ asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RICactionType, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricActionType" }, @@ -32,7 +48,15 @@ asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RICactionDefinition, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricActionDefinition" }, @@ -41,7 +65,15 @@ asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RICsubsequentAction, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricSubsequentAction" }, @@ -75,7 +107,15 @@ asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_Item = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICaction_ToBeSetup_Item_1, 4, /* Elements count */ &asn_SPC_RICaction_ToBeSetup_Item_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICactionDefinition.c b/e2ap/lib/RICactionDefinition.c index 3f157ba..04c5489 100644 --- a/e2ap/lib/RICactionDefinition.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICactionDefinition.h" @@ -24,7 +24,15 @@ asn_TYPE_descriptor_t asn_DEF_RICactionDefinition = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OCTET_STRING_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2ap/lib/RICactionID.c b/e2ap/lib/RICactionID.c index 73658f5..6ad19f7 100644 --- a/e2ap/lib/RICactionID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICactionID.h" @@ -21,7 +21,7 @@ RICactionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 255)) { + if((value >= 0L && value <= 255L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,14 +36,18 @@ RICactionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RICactionID_constr_1 CC_NOTUSED = { { 1, 1 } /* (0..255) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_RICactionID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -57,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_RICactionID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RICactionID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RICactionID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + RICactionID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2ap/lib/RICactionType.c b/e2ap/lib/RICactionType.c index bfd33d5..b3cf10f 100644 --- a/e2ap/lib/RICactionType.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICactionType.h" @@ -11,14 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RICactionType_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_RICactionType_value2enum_1[] = { { 0, 6, "report" }, { 1, 6, "insert" }, @@ -53,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_RICactionType = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RICactionType_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RICactionType_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_RICactionType_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/RICactions-ToBeSetup-List.c b/e2ap/lib/RICactions-ToBeSetup-List.c index 93905c3..d1a5c9f 100644 --- a/e2ap/lib/RICactions-ToBeSetup-List.c +++ b/e2ap/lib/RICactions-ToBeSetup-List.c @@ -1,28 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICactions-ToBeSetup-List.h" #include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RICactions_ToBeSetup_List_constr_1 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(1..16)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_RICactions_ToBeSetup_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainer_90P0, + &asn_DEF_ProtocolIE_SingleContainer_88P0, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -45,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_RICactions_ToBeSetup_List = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RICactions_ToBeSetup_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RICactions_ToBeSetup_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_RICactions_ToBeSetup_List_1, 1, /* Single element */ &asn_SPC_RICactions_ToBeSetup_List_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICcallProcessID.c b/e2ap/lib/RICcallProcessID.c index fd2d0eb..8194d04 100644 --- a/e2ap/lib/RICcallProcessID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICcallProcessID.h" @@ -24,7 +24,15 @@ asn_TYPE_descriptor_t asn_DEF_RICcallProcessID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OCTET_STRING_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2ap/lib/RICcontrolAckRequest.c b/e2ap/lib/RICcontrolAckRequest.c index 1db6bee..0f1bfe2 100644 --- a/e2ap/lib/RICcontrolAckRequest.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICcontrolAckRequest.h" @@ -11,31 +11,33 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RICcontrolAckRequest_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_RICcontrolAckRequest_constr_1 CC_NOTUSED = { - { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_RICcontrolAckRequest_value2enum_1[] = { { 0, 5, "noAck" }, - { 1, 3, "ack" }, - { 2, 4, "nAck" } + { 1, 3, "ack" } /* 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 */ }; 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 */ + 2, /* Number of elements in the maps */ + 3, /* Extensions before this member */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 @@ -53,7 +55,15 @@ asn_TYPE_descriptor_t asn_DEF_RICcontrolAckRequest = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RICcontrolAckRequest_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RICcontrolAckRequest_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_RICcontrolAckRequest_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/RICcontrolAcknowledge.c b/e2ap/lib/RICcontrolAcknowledge.c index 85011b6..b890fc1 100644 --- a/e2ap/lib/RICcontrolAcknowledge.c +++ b/e2ap/lib/RICcontrolAcknowledge.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICcontrolAcknowledge.h" -static asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_1[] = { +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_Container_87P8, + &asn_DEF_ProtocolIE_Container_85P9, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICcontrolAcknowledge_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICcontrolAcknowledge_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_specs_1 = { sizeof(struct RICcontrolAcknowledge), offsetof(struct RICcontrolAcknowledge, _asn_ctx), asn_MAP_RICcontrolAcknowledge_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICcontrolAcknowledge_1, 1, /* Elements count */ &asn_SPC_RICcontrolAcknowledge_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICcontrolFailure.c b/e2ap/lib/RICcontrolFailure.c index a847f9f..fadeedd 100644 --- a/e2ap/lib/RICcontrolFailure.c +++ b/e2ap/lib/RICcontrolFailure.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICcontrolFailure.h" -static asn_TYPE_member_t asn_MBR_RICcontrolFailure_1[] = { +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_Container_87P9, + &asn_DEF_ProtocolIE_Container_85P10, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICcontrolFailure_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICcontrolFailure_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_specs_1 = { sizeof(struct RICcontrolFailure), offsetof(struct RICcontrolFailure, _asn_ctx), asn_MAP_RICcontrolFailure_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICcontrolFailure_1, 1, /* Elements count */ &asn_SPC_RICcontrolFailure_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICcontrolHeader.c b/e2ap/lib/RICcontrolHeader.c index 3accabb..cadba18 100644 --- a/e2ap/lib/RICcontrolHeader.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICcontrolHeader.h" @@ -24,7 +24,15 @@ asn_TYPE_descriptor_t asn_DEF_RICcontrolHeader = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OCTET_STRING_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2ap/lib/RICcontrolMessage.c b/e2ap/lib/RICcontrolMessage.c index d865706..c29f126 100644 --- a/e2ap/lib/RICcontrolMessage.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICcontrolMessage.h" @@ -24,7 +24,15 @@ asn_TYPE_descriptor_t asn_DEF_RICcontrolMessage = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OCTET_STRING_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2ap/lib/RICcontrolOutcome.c b/e2ap/lib/RICcontrolOutcome.c index 806038d..e4a704c 100644 --- a/e2ap/lib/RICcontrolOutcome.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICcontrolOutcome.h" @@ -24,7 +24,15 @@ asn_TYPE_descriptor_t asn_DEF_RICcontrolOutcome = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OCTET_STRING_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2ap/lib/RICcontrolRequest.c b/e2ap/lib/RICcontrolRequest.c index 43a04e2..8a25f16 100644 --- a/e2ap/lib/RICcontrolRequest.c +++ b/e2ap/lib/RICcontrolRequest.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICcontrolRequest.h" -static asn_TYPE_member_t asn_MBR_RICcontrolRequest_1[] = { +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_Container_87P7, + &asn_DEF_ProtocolIE_Container_85P8, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICcontrolRequest_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICcontrolRequest_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_specs_1 = { sizeof(struct RICcontrolRequest), offsetof(struct RICcontrolRequest, _asn_ctx), asn_MAP_RICcontrolRequest_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICcontrolRequest_1, 1, /* Elements count */ &asn_SPC_RICcontrolRequest_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICcontrolStatus.c b/e2ap/lib/RICcontrolStatus.c deleted file mode 100644 index d2873fc..0000000 --- a/e2ap/lib/RICcontrolStatus.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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}; -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 */ -}; -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/e2ap/lib/RICeventTriggerDefinition.c b/e2ap/lib/RICeventTriggerDefinition.c index a13ddbd..f51fab9 100644 --- a/e2ap/lib/RICeventTriggerDefinition.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICeventTriggerDefinition.h" @@ -24,7 +24,15 @@ asn_TYPE_descriptor_t asn_DEF_RICeventTriggerDefinition = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OCTET_STRING_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2ap/lib/RICindication.c b/e2ap/lib/RICindication.c index 5c40aa5..501c11d 100644 --- a/e2ap/lib/RICindication.c +++ b/e2ap/lib/RICindication.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICindication.h" -static asn_TYPE_member_t asn_MBR_RICindication_1[] = { +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_Container_87P6, + &asn_DEF_ProtocolIE_Container_85P7, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICindication_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICindication_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICindication_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICindication_specs_1 = { sizeof(struct RICindication), offsetof(struct RICindication, _asn_ctx), asn_MAP_RICindication_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICindication = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICindication_1, 1, /* Elements count */ &asn_SPC_RICindication_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICindicationHeader.c b/e2ap/lib/RICindicationHeader.c index d252382..eefde8f 100644 --- a/e2ap/lib/RICindicationHeader.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICindicationHeader.h" @@ -24,7 +24,15 @@ asn_TYPE_descriptor_t asn_DEF_RICindicationHeader = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OCTET_STRING_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2ap/lib/RICindicationMessage.c b/e2ap/lib/RICindicationMessage.c index bd0ac0f..9d0289c 100644 --- a/e2ap/lib/RICindicationMessage.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICindicationMessage.h" @@ -24,7 +24,15 @@ asn_TYPE_descriptor_t asn_DEF_RICindicationMessage = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OCTET_STRING_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2ap/lib/RICindicationSN.c b/e2ap/lib/RICindicationSN.c index efd2d48..ddb8aa5 100644 --- a/e2ap/lib/RICindicationSN.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICindicationSN.h" @@ -21,7 +21,7 @@ RICindicationSN_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,14 +36,18 @@ RICindicationSN_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RICindicationSN_constr_1 CC_NOTUSED = { { 2, 1 } /* (0..65535) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_RICindicationSN_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -57,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_RICindicationSN = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RICindicationSN_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RICindicationSN_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + RICindicationSN_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2ap/lib/RICindicationType.c b/e2ap/lib/RICindicationType.c index 58935bb..e96be98 100644 --- a/e2ap/lib/RICindicationType.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICindicationType.h" @@ -11,14 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RICindicationType_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_RICindicationType_value2enum_1[] = { { 0, 6, "report" }, { 1, 6, "insert" } @@ -51,7 +55,15 @@ asn_TYPE_descriptor_t asn_DEF_RICindicationType = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RICindicationType_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RICindicationType_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_RICindicationType_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/RICrequestID.c b/e2ap/lib/RICrequestID.c index 1422a31..ffc34f0 100644 --- a/e2ap/lib/RICrequestID.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICrequestID.h" @@ -21,7 +21,7 @@ memb_ricRequestorID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sp value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -46,7 +46,7 @@ memb_ricInstanceID_constraint_1(const asn_TYPE_descriptor_t *td, const void *spt value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -57,29 +57,45 @@ memb_ricInstanceID_constraint_1(const asn_TYPE_descriptor_t *td, const void *spt } } +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_ricRequestorID_constr_2 CC_NOTUSED = { { 2, 1 } /* (0..65535) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_ricInstanceID_constr_3 CC_NOTUSED = { { 2, 1 } /* (0..65535) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_ricRequestorID_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_ricRequestorID_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_ricRequestorID_constraint_1 + }, 0, 0, /* No default value */ "ricRequestorID" }, @@ -88,7 +104,15 @@ asn_TYPE_member_t asn_MBR_RICrequestID_1[] = { -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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_ricInstanceID_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_ricInstanceID_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_ricInstanceID_constraint_1 + }, 0, 0, /* No default value */ "ricInstanceID" }, @@ -118,7 +142,15 @@ asn_TYPE_descriptor_t asn_DEF_RICrequestID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICrequestID_1, 2, /* Elements count */ &asn_SPC_RICrequestID_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICserviceQuery.c b/e2ap/lib/RICserviceQuery.c index a7d452e..3f80693 100644 --- a/e2ap/lib/RICserviceQuery.c +++ b/e2ap/lib/RICserviceQuery.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICserviceQuery.h" -static asn_TYPE_member_t asn_MBR_RICserviceQuery_1[] = { +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_Container_87P19, + &asn_DEF_ProtocolIE_Container_85P26, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICserviceQuery_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICserviceQuery_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_specs_1 = { sizeof(struct RICserviceQuery), offsetof(struct RICserviceQuery, _asn_ctx), asn_MAP_RICserviceQuery_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICserviceQuery = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICserviceQuery_1, 1, /* Elements count */ &asn_SPC_RICserviceQuery_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICserviceUpdate.c b/e2ap/lib/RICserviceUpdate.c index a562e2f..72b8cb9 100644 --- a/e2ap/lib/RICserviceUpdate.c +++ b/e2ap/lib/RICserviceUpdate.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICserviceUpdate.h" -static asn_TYPE_member_t asn_MBR_RICserviceUpdate_1[] = { +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_Container_87P16, + &asn_DEF_ProtocolIE_Container_85P23, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICserviceUpdate_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdate_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_specs_1 = { sizeof(struct RICserviceUpdate), offsetof(struct RICserviceUpdate, _asn_ctx), asn_MAP_RICserviceUpdate_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICserviceUpdate_1, 1, /* Elements count */ &asn_SPC_RICserviceUpdate_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICserviceUpdateAcknowledge.c b/e2ap/lib/RICserviceUpdateAcknowledge.c index 845acb2..969c78b 100644 --- a/e2ap/lib/RICserviceUpdateAcknowledge.c +++ b/e2ap/lib/RICserviceUpdateAcknowledge.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICserviceUpdateAcknowledge.h" -static asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_1[] = { +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_Container_87P17, + &asn_DEF_ProtocolIE_Container_85P24, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICserviceUpdateAcknowledge_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateAcknowledge_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_specs_1 = { sizeof(struct RICserviceUpdateAcknowledge), offsetof(struct RICserviceUpdateAcknowledge, _asn_ctx), asn_MAP_RICserviceUpdateAcknowledge_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICserviceUpdateAcknowledge_1, 1, /* Elements count */ &asn_SPC_RICserviceUpdateAcknowledge_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICserviceUpdateFailure.c b/e2ap/lib/RICserviceUpdateFailure.c index f54da69..bdfbd22 100644 --- a/e2ap/lib/RICserviceUpdateFailure.c +++ b/e2ap/lib/RICserviceUpdateFailure.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICserviceUpdateFailure.h" -static asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_1[] = { +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_Container_87P18, + &asn_DEF_ProtocolIE_Container_85P25, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICserviceUpdateFailure_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateFailure_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_specs_1 = { sizeof(struct RICserviceUpdateFailure), offsetof(struct RICserviceUpdateFailure, _asn_ctx), asn_MAP_RICserviceUpdateFailure_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICserviceUpdateFailure_1, 1, /* Elements count */ &asn_SPC_RICserviceUpdateFailure_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICsubscription-List-withCause.c b/e2ap/lib/RICsubscription-List-withCause.c new file mode 100644 index 0000000..cd07ee9 --- /dev/null +++ b/e2ap/lib/RICsubscription-List-withCause.c @@ -0,0 +1,73 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "RICsubscription-List-withCause.h" + +#include "ProtocolIE-SingleContainer.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_RICsubscription_List_withCause_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..4294967295)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_RICsubscription_List_withCause_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 32, -1, 1, 4294967295 } /* (SIZE(1..4294967295)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_RICsubscription_List_withCause_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainer_88P3, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscription_List_withCause_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_RICsubscription_List_withCause_specs_1 = { + sizeof(struct RICsubscription_List_withCause), + offsetof(struct RICsubscription_List_withCause, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscription_List_withCause = { + "RICsubscription-List-withCause", + "RICsubscription-List-withCause", + &asn_OP_SEQUENCE_OF, + asn_DEF_RICsubscription_List_withCause_tags_1, + sizeof(asn_DEF_RICsubscription_List_withCause_tags_1) + /sizeof(asn_DEF_RICsubscription_List_withCause_tags_1[0]), /* 1 */ + asn_DEF_RICsubscription_List_withCause_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscription_List_withCause_tags_1) + /sizeof(asn_DEF_RICsubscription_List_withCause_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RICsubscription_List_withCause_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RICsubscription_List_withCause_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_RICsubscription_List_withCause_1, + 1, /* Single element */ + &asn_SPC_RICsubscription_List_withCause_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/RICsubscription-withCause-Item.c b/e2ap/lib/RICsubscription-withCause-Item.c new file mode 100644 index 0000000..44a57f3 --- /dev/null +++ b/e2ap/lib/RICsubscription-withCause-Item.c @@ -0,0 +1,102 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "RICsubscription-withCause-Item.h" + +asn_TYPE_member_t asn_MBR_RICsubscription_withCause_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscription_withCause_Item, ricRequestID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICrequestID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "ricRequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscription_withCause_Item, ranFunctionID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "ranFunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscription_withCause_Item, cause), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_Cause, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "cause" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscription_withCause_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscription_withCause_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequestID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ranFunctionID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* cause */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscription_withCause_Item_specs_1 = { + sizeof(struct RICsubscription_withCause_Item), + offsetof(struct RICsubscription_withCause_Item, _asn_ctx), + asn_MAP_RICsubscription_withCause_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_RICsubscription_withCause_Item = { + "RICsubscription-withCause-Item", + "RICsubscription-withCause-Item", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscription_withCause_Item_tags_1, + sizeof(asn_DEF_RICsubscription_withCause_Item_tags_1) + /sizeof(asn_DEF_RICsubscription_withCause_Item_tags_1[0]), /* 1 */ + asn_DEF_RICsubscription_withCause_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscription_withCause_Item_tags_1) + /sizeof(asn_DEF_RICsubscription_withCause_Item_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICsubscription_withCause_Item_1, + 3, /* Elements count */ + &asn_SPC_RICsubscription_withCause_Item_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/RICsubscriptionDeleteFailure.c b/e2ap/lib/RICsubscriptionDeleteFailure.c index 88a9836..18c2143 100644 --- a/e2ap/lib/RICsubscriptionDeleteFailure.c +++ b/e2ap/lib/RICsubscriptionDeleteFailure.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICsubscriptionDeleteFailure.h" -static asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_1[] = { +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_Container_87P5, + &asn_DEF_ProtocolIE_Container_85P5, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteFailure_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteFailure_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_specs_1 = { sizeof(struct RICsubscriptionDeleteFailure), offsetof(struct RICsubscriptionDeleteFailure, _asn_ctx), asn_MAP_RICsubscriptionDeleteFailure_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICsubscriptionDeleteFailure_1, 1, /* Elements count */ &asn_SPC_RICsubscriptionDeleteFailure_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICsubscriptionDeleteRequest.c b/e2ap/lib/RICsubscriptionDeleteRequest.c index 627f516..a9bf320 100644 --- a/e2ap/lib/RICsubscriptionDeleteRequest.c +++ b/e2ap/lib/RICsubscriptionDeleteRequest.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICsubscriptionDeleteRequest.h" -static asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_1[] = { +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_Container_87P3, + &asn_DEF_ProtocolIE_Container_85P3, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequest_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequest_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_specs_1 = { sizeof(struct RICsubscriptionDeleteRequest), offsetof(struct RICsubscriptionDeleteRequest, _asn_ctx), asn_MAP_RICsubscriptionDeleteRequest_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICsubscriptionDeleteRequest_1, 1, /* Elements count */ &asn_SPC_RICsubscriptionDeleteRequest_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICsubscriptionDeleteRequired.c b/e2ap/lib/RICsubscriptionDeleteRequired.c new file mode 100644 index 0000000..e659f4c --- /dev/null +++ b/e2ap/lib/RICsubscriptionDeleteRequired.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "RICsubscriptionDeleteRequired.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequired_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequired, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_Container_85P6, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequired_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequired_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequired_specs_1 = { + sizeof(struct RICsubscriptionDeleteRequired), + offsetof(struct RICsubscriptionDeleteRequired, _asn_ctx), + asn_MAP_RICsubscriptionDeleteRequired_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_RICsubscriptionDeleteRequired = { + "RICsubscriptionDeleteRequired", + "RICsubscriptionDeleteRequired", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteRequired_tags_1, + sizeof(asn_DEF_RICsubscriptionDeleteRequired_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteRequired_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteRequired_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteRequired_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteRequired_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_RICsubscriptionDeleteRequired_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteRequired_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/RICsubscriptionDeleteResponse.c b/e2ap/lib/RICsubscriptionDeleteResponse.c index fc0f72d..9fcf7e2 100644 --- a/e2ap/lib/RICsubscriptionDeleteResponse.c +++ b/e2ap/lib/RICsubscriptionDeleteResponse.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICsubscriptionDeleteResponse.h" -static asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_1[] = { +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_Container_87P4, + &asn_DEF_ProtocolIE_Container_85P4, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteResponse_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteResponse_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_specs_1 = { sizeof(struct RICsubscriptionDeleteResponse), offsetof(struct RICsubscriptionDeleteResponse, _asn_ctx), asn_MAP_RICsubscriptionDeleteResponse_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICsubscriptionDeleteResponse_1, 1, /* Elements count */ &asn_SPC_RICsubscriptionDeleteResponse_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICsubscriptionDetails.c b/e2ap/lib/RICsubscriptionDetails.c index 9033dc2..727cbb9 100644 --- a/e2ap/lib/RICsubscriptionDetails.c +++ b/e2ap/lib/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-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICsubscriptionDetails.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_RICsubscriptionDetails_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RICeventTriggerDefinition, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricEventTriggerDefinition" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_RICsubscriptionDetails_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RICactions_ToBeSetup_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricAction-ToBeSetup-List" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDetails = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICsubscriptionDetails_1, 2, /* Elements count */ &asn_SPC_RICsubscriptionDetails_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICsubscriptionFailure.c b/e2ap/lib/RICsubscriptionFailure.c index f765319..90defbf 100644 --- a/e2ap/lib/RICsubscriptionFailure.c +++ b/e2ap/lib/RICsubscriptionFailure.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICsubscriptionFailure.h" -static asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_1[] = { +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_Container_87P2, + &asn_DEF_ProtocolIE_Container_85P2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICsubscriptionFailure_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionFailure_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_specs_1 = { sizeof(struct RICsubscriptionFailure), offsetof(struct RICsubscriptionFailure, _asn_ctx), asn_MAP_RICsubscriptionFailure_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICsubscriptionFailure_1, 1, /* Elements count */ &asn_SPC_RICsubscriptionFailure_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICsubscriptionRequest.c b/e2ap/lib/RICsubscriptionRequest.c index 46c4fe8..dfa30f4 100644 --- a/e2ap/lib/RICsubscriptionRequest.c +++ b/e2ap/lib/RICsubscriptionRequest.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICsubscriptionRequest.h" -static asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_1[] = { +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_Container_87P0, + &asn_DEF_ProtocolIE_Container_85P0, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICsubscriptionRequest_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionRequest_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_specs_1 = { sizeof(struct RICsubscriptionRequest), offsetof(struct RICsubscriptionRequest, _asn_ctx), asn_MAP_RICsubscriptionRequest_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICsubscriptionRequest_1, 1, /* Elements count */ &asn_SPC_RICsubscriptionRequest_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICsubscriptionResponse.c b/e2ap/lib/RICsubscriptionResponse.c index 56c92ae..cc39812 100644 --- a/e2ap/lib/RICsubscriptionResponse.c +++ b/e2ap/lib/RICsubscriptionResponse.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICsubscriptionResponse.h" -static asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_1[] = { +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_Container_87P1, + &asn_DEF_ProtocolIE_Container_85P1, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_RICsubscriptionResponse_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionResponse_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_specs_1 = { sizeof(struct RICsubscriptionResponse), offsetof(struct RICsubscriptionResponse, _asn_ctx), asn_MAP_RICsubscriptionResponse_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICsubscriptionResponse_1, 1, /* Elements count */ &asn_SPC_RICsubscriptionResponse_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICsubsequentAction.c b/e2ap/lib/RICsubsequentAction.c index 8b3248c..6d7ba14 100644 --- a/e2ap/lib/RICsubsequentAction.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICsubsequentAction.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_RICsubsequentAction_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RICsubsequentActionType, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricSubsequentActionType" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_RICsubsequentAction_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RICtimeToWait, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ricTimeToWait" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_RICsubsequentAction = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RICsubsequentAction_1, 2, /* Elements count */ &asn_SPC_RICsubsequentAction_specs_1 /* Additional specs */ diff --git a/e2ap/lib/RICsubsequentActionType.c b/e2ap/lib/RICsubsequentActionType.c index f88a331..270d676 100644 --- a/e2ap/lib/RICsubsequentActionType.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICsubsequentActionType.h" @@ -11,14 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RICsubsequentActionType_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_RICsubsequentActionType_value2enum_1[] = { { 0, 8, "continue" }, { 1, 4, "wait" } @@ -51,7 +55,15 @@ asn_TYPE_descriptor_t asn_DEF_RICsubsequentActionType = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RICsubsequentActionType_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RICsubsequentActionType_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_RICsubsequentActionType_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/RICtimeToWait.c b/e2ap/lib/RICtimeToWait.c index 94fc184..c5e5e57 100644 --- a/e2ap/lib/RICtimeToWait.c +++ b/e2ap/lib/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-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RICtimeToWait.h" @@ -11,61 +11,63 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_RICtimeToWait_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_RICtimeToWait_constr_1 CC_NOTUSED = { - { APC_CONSTRAINED | APC_EXTENSIBLE, 5, 5, 0, 17 } /* (0..17,...) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 5, 5, 0, 16 } /* (0..16,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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" } + { 0, 4, "w1ms" }, + { 1, 4, "w2ms" }, + { 2, 4, "w5ms" }, + { 3, 5, "w10ms" }, + { 4, 5, "w20ms" }, + { 5, 5, "w30ms" }, + { 6, 5, "w40ms" }, + { 7, 5, "w50ms" }, + { 8, 6, "w100ms" }, + { 9, 6, "w200ms" }, + { 10, 6, "w500ms" }, + { 11, 3, "w1s" }, + { 12, 3, "w2s" }, + { 13, 3, "w5s" }, + { 14, 4, "w10s" }, + { 15, 4, "w20s" }, + { 16, 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) */ + 8, /* w100ms(8) */ + 3, /* w10ms(3) */ + 14, /* w10s(14) */ + 0, /* w1ms(0) */ + 11, /* w1s(11) */ + 9, /* w200ms(9) */ + 4, /* w20ms(4) */ + 15, /* w20s(15) */ + 1, /* w2ms(1) */ + 12, /* w2s(12) */ + 5, /* w30ms(5) */ + 6, /* w40ms(6) */ + 10, /* w500ms(10) */ + 7, /* w50ms(7) */ + 2, /* w5ms(2) */ + 13, /* w5s(13) */ + 16 /* w60s(16) */ /* 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 */ + 17, /* Number of elements in the maps */ + 18, /* Extensions before this member */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 @@ -83,7 +85,15 @@ asn_TYPE_descriptor_t asn_DEF_RICtimeToWait = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RICtimeToWait_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RICtimeToWait_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_RICtimeToWait_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/ResetRequest.c b/e2ap/lib/ResetRequest.c index f40779f..1c91cae 100644 --- a/e2ap/lib/ResetRequest.c +++ b/e2ap/lib/ResetRequest.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ResetRequest.h" -static asn_TYPE_member_t asn_MBR_ResetRequest_1[] = { +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_Container_87P14, + &asn_DEF_ProtocolIE_Container_85P21, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_ResetRequest_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_ResetRequest_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_specs_1 = { sizeof(struct ResetRequest), offsetof(struct ResetRequest, _asn_ctx), asn_MAP_ResetRequest_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_ResetRequest = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_ResetRequest_1, 1, /* Elements count */ &asn_SPC_ResetRequest_specs_1 /* Additional specs */ diff --git a/e2ap/lib/ResetResponse.c b/e2ap/lib/ResetResponse.c index 47c433a..6e8f4ed 100644 --- a/e2ap/lib/ResetResponse.c +++ b/e2ap/lib/ResetResponse.c @@ -1,19 +1,27 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP-PDU-Contents-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "pduDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ResetResponse.h" -static asn_TYPE_member_t asn_MBR_ResetResponse_1[] = { +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_Container_87P15, + &asn_DEF_ProtocolIE_Container_85P22, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "protocolIEs" }, @@ -24,7 +32,7 @@ static const ber_tlv_tag_t asn_DEF_ResetResponse_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_ResetResponse_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ }; -static asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_specs_1 = { sizeof(struct ResetResponse), offsetof(struct ResetResponse, _asn_ctx), asn_MAP_ResetResponse_tag2el_1, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_ResetResponse = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_ResetResponse_1, 1, /* Elements count */ &asn_SPC_ResetResponse_specs_1 /* Additional specs */ diff --git a/e2ap/lib/SuccessfulOutcome.c b/e2ap/lib/SuccessfulOutcome.c index 7328b32..ba99ed6 100644 --- a/e2ap/lib/SuccessfulOutcome.c +++ b/e2ap/lib/SuccessfulOutcome.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-PDU-Descriptions-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "elementryProcedureDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "SuccessfulOutcome.h" @@ -17,14 +17,20 @@ 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_id_E2nodeConfigurationUpdate = 10; 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_ErrorIndication = 2; +static const long asn_VAL_7_id_E2connectionUpdate = 11; +static const long asn_VAL_7_reject = 0; +static const long asn_VAL_8_id_Reset = 3; +static const long asn_VAL_8_reject = 0; +static const long asn_VAL_9_id_RICindication = 5; static const long asn_VAL_9_ignore = 1; +static const long asn_VAL_10_id_RICserviceQuery = 6; +static const long asn_VAL_10_ignore = 1; +static const long asn_VAL_11_id_ErrorIndication = 2; +static const long asn_VAL_11_ignore = 1; +static const long asn_VAL_12_id_RICsubscriptionDeleteRequired = 12; +static const long asn_VAL_12_ignore = 1; static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { { "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionRequest }, { "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionResponse }, @@ -51,29 +57,44 @@ static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { { "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2setupFailure }, { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_5_id_E2setup }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_reject }, + { "&InitiatingMessage", aioc__type, &asn_DEF_E2nodeConfigurationUpdate }, + { "&SuccessfulOutcome", aioc__type, &asn_DEF_E2nodeConfigurationUpdateAcknowledge }, + { "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2nodeConfigurationUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_E2nodeConfigurationUpdate }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject }, + { "&InitiatingMessage", aioc__type, &asn_DEF_E2connectionUpdate }, + { "&SuccessfulOutcome", aioc__type, &asn_DEF_E2connectionUpdateAcknowledge }, + { "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2connectionUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_E2connectionUpdate }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_reject }, { "&InitiatingMessage", aioc__type, &asn_DEF_ResetRequest }, { "&SuccessfulOutcome", aioc__type, &asn_DEF_ResetResponse }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_Reset }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_Reset }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_reject }, { "&InitiatingMessage", aioc__type, &asn_DEF_RICindication }, { "&SuccessfulOutcome", }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_RICindication }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_ignore }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_RICindication }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore }, { "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceQuery }, { "&SuccessfulOutcome", }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_RICserviceQuery }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_ignore }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_10_id_RICserviceQuery }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_10_ignore }, { "&InitiatingMessage", aioc__type, &asn_DEF_ErrorIndication }, { "&SuccessfulOutcome", }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_ErrorIndication }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore } + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_11_id_ErrorIndication }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_11_ignore }, + { "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionDeleteRequired }, + { "&SuccessfulOutcome", }, + { "&UnsuccessfulOutcome", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_12_id_RICsubscriptionDeleteRequired }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_12_ignore } }; static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = { - { 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } + { 12, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } }; static int memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, @@ -89,7 +110,7 @@ memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *spt value = *(const long *)sptr; - if((value >= 0 && value <= 255)) { + if((value >= 0L && value <= 255L)) { /* Constraint check succeeded */ return 0; } else { @@ -192,37 +213,57 @@ memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); } +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_procedureCode_constr_2 CC_NOTUSED = { { 1, 1 } /* (0..255) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_value_4[] = { { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome__value, choice.RICsubscriptionResponse), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICsubscriptionResponse, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICsubscriptionResponse" }, @@ -231,7 +272,15 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_RICsubscriptionDeleteResponse, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICsubscriptionDeleteResponse" }, @@ -240,7 +289,15 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_RICserviceUpdateAcknowledge, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICserviceUpdateAcknowledge" }, @@ -249,7 +306,15 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_RICcontrolAcknowledge, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICcontrolAcknowledge" }, @@ -258,27 +323,79 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_E2setupResponse, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "E2setupResponse" }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome__value, choice.E2nodeConfigurationUpdateAcknowledge), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeConfigurationUpdateAcknowledge, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeConfigurationUpdateAcknowledge" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome__value, choice.E2connectionUpdateAcknowledge), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2connectionUpdateAcknowledge, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2connectionUpdateAcknowledge" + }, { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome__value, choice.ResetResponse), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_ResetResponse, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 7 }, /* RICsubscriptionResponse */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 6 }, /* RICsubscriptionDeleteResponse */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 5 }, /* RICserviceUpdateAcknowledge */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 4 }, /* RICcontrolAcknowledge */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 3 }, /* E2setupResponse */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 2 }, /* E2nodeConfigurationUpdateAcknowledge */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 6, -6, 1 }, /* E2connectionUpdateAcknowledge */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 7, -7, 0 } /* ResetResponse */ }; static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { sizeof(struct SuccessfulOutcome__value), @@ -286,7 +403,7 @@ static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { offsetof(struct SuccessfulOutcome__value, present), sizeof(((struct SuccessfulOutcome__value *)0)->present), asn_MAP_value_tag2el_4, - 6, /* Count of tags in the map */ + 8, /* Count of tags in the map */ 0, 0, -1 /* Extensions start */ }; @@ -299,9 +416,17 @@ asn_TYPE_descriptor_t asn_DEF_value_4 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, 0, OPEN_TYPE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, asn_MBR_value_4, - 6, /* Elements count */ + 8, /* Elements count */ &asn_SPC_value_specs_4 /* Additional specs */ }; @@ -311,7 +436,15 @@ asn_TYPE_member_t asn_MBR_SuccessfulOutcome_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_ProcedureCode, 0, - { &asn_OER_memb_procedureCode_constr_2, &asn_PER_memb_procedureCode_constr_2, memb_procedureCode_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_procedureCode_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_procedureCode_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_procedureCode_constraint_1 + }, 0, 0, /* No default value */ "procedureCode" }, @@ -320,7 +453,15 @@ asn_TYPE_member_t asn_MBR_SuccessfulOutcome_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_Criticality, select_SuccessfulOutcome_criticality_type, - { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_1 + }, 0, 0, /* No default value */ "criticality" }, @@ -329,7 +470,15 @@ asn_TYPE_member_t asn_MBR_SuccessfulOutcome_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_value_4, select_SuccessfulOutcome_value_type, - { &asn_OER_memb_value_constr_4, &asn_PER_memb_value_constr_4, memb_value_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_4, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_4, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_1 + }, 0, 0, /* No default value */ "value" }, @@ -360,7 +509,15 @@ asn_TYPE_descriptor_t asn_DEF_SuccessfulOutcome = { asn_DEF_SuccessfulOutcome_tags_1, /* Same as above */ sizeof(asn_DEF_SuccessfulOutcome_tags_1) /sizeof(asn_DEF_SuccessfulOutcome_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_SuccessfulOutcome_1, 3, /* Elements count */ &asn_SPC_SuccessfulOutcome_specs_1 /* Additional specs */ diff --git a/e2ap/lib/TNLinformation.c b/e2ap/lib/TNLinformation.c new file mode 100644 index 0000000..e99b94c --- /dev/null +++ b/e2ap/lib/TNLinformation.c @@ -0,0 +1,172 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "TNLinformation.h" + +static int +memb_tnlAddress_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 >= 1UL && size <= 160UL)) { + /* 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_tnlPort_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 == 16UL)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_tnlAddress_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_tnlAddress_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 1, 160 } /* (SIZE(1..160,...)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_tnlPort_constr_3 CC_NOTUSED = { + { 0, 0 }, + 16 /* (SIZE(16..16)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_tnlPort_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 16, 16 } /* (SIZE(16..16)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_TNLinformation_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct TNLinformation, tnlAddress), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_tnlAddress_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_tnlAddress_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_tnlAddress_constraint_1 + }, + 0, 0, /* No default value */ + "tnlAddress" + }, + { ATF_POINTER, 1, offsetof(struct TNLinformation, tnlPort), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_tnlPort_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_tnlPort_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_tnlPort_constraint_1 + }, + 0, 0, /* No default value */ + "tnlPort" + }, +}; +static const int asn_MAP_TNLinformation_oms_1[] = { 1 }; +static const ber_tlv_tag_t asn_DEF_TNLinformation_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_TNLinformation_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* tnlAddress */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* tnlPort */ +}; +asn_SEQUENCE_specifics_t asn_SPC_TNLinformation_specs_1 = { + sizeof(struct TNLinformation), + offsetof(struct TNLinformation, _asn_ctx), + asn_MAP_TNLinformation_tag2el_1, + 2, /* Count of tags in the map */ + asn_MAP_TNLinformation_oms_1, /* Optional members */ + 1, 0, /* Root/Additions */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_TNLinformation = { + "TNLinformation", + "TNLinformation", + &asn_OP_SEQUENCE, + asn_DEF_TNLinformation_tags_1, + sizeof(asn_DEF_TNLinformation_tags_1) + /sizeof(asn_DEF_TNLinformation_tags_1[0]), /* 1 */ + asn_DEF_TNLinformation_tags_1, /* Same as above */ + sizeof(asn_DEF_TNLinformation_tags_1) + /sizeof(asn_DEF_TNLinformation_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_TNLinformation_1, + 2, /* Elements count */ + &asn_SPC_TNLinformation_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/TNLusage.c b/e2ap/lib/TNLusage.c new file mode 100644 index 0000000..8bdb3a8 --- /dev/null +++ b/e2ap/lib/TNLusage.c @@ -0,0 +1,72 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "TNLusage.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_TNLusage_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_TNLusage_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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static const asn_INTEGER_enum_map_t asn_MAP_TNLusage_value2enum_1[] = { + { 0, 11, "ric-service" }, + { 1, 16, "support-function" }, + { 2, 4, "both" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_TNLusage_enum2value_1[] = { + 2, /* both(2) */ + 0, /* ric-service(0) */ + 1 /* support-function(1) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_TNLusage_specs_1 = { + asn_MAP_TNLusage_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_TNLusage_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_TNLusage_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_TNLusage = { + "TNLusage", + "TNLusage", + &asn_OP_NativeEnumerated, + asn_DEF_TNLusage_tags_1, + sizeof(asn_DEF_TNLusage_tags_1) + /sizeof(asn_DEF_TNLusage_tags_1[0]), /* 1 */ + asn_DEF_TNLusage_tags_1, /* Same as above */ + sizeof(asn_DEF_TNLusage_tags_1) + /sizeof(asn_DEF_TNLusage_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_TNLusage_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_TNLusage_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_TNLusage_specs_1 /* Additional specs */ +}; + diff --git a/e2ap/lib/TimeToWait.c b/e2ap/lib/TimeToWait.c index a969d55..baa69bc 100644 --- a/e2ap/lib/TimeToWait.c +++ b/e2ap/lib/TimeToWait.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "TimeToWait.h" @@ -11,14 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_TimeToWait_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_TimeToWait_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_TimeToWait_value2enum_1[] = { { 0, 3, "v1s" }, { 1, 3, "v2s" }, @@ -59,7 +63,15 @@ asn_TYPE_descriptor_t asn_DEF_TimeToWait = { asn_DEF_TimeToWait_tags_1, /* Same as above */ sizeof(asn_DEF_TimeToWait_tags_1) /sizeof(asn_DEF_TimeToWait_tags_1[0]), /* 1 */ - { &asn_OER_type_TimeToWait_constr_1, &asn_PER_type_TimeToWait_constr_1, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_TimeToWait_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_TimeToWait_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_TimeToWait_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/TransactionID.c b/e2ap/lib/TransactionID.c new file mode 100644 index 0000000..46a3ae6 --- /dev/null +++ b/e2ap/lib/TransactionID.c @@ -0,0 +1,76 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "TransactionID.h" + +int +TransactionID_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 >= 0L && value <= 255L)) { + /* 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. + */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_TransactionID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_TransactionID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 0, 255 } /* (0..255,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static const ber_tlv_tag_t asn_DEF_TransactionID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_TransactionID = { + "TransactionID", + "TransactionID", + &asn_OP_NativeInteger, + asn_DEF_TransactionID_tags_1, + sizeof(asn_DEF_TransactionID_tags_1) + /sizeof(asn_DEF_TransactionID_tags_1[0]), /* 1 */ + asn_DEF_TransactionID_tags_1, /* Same as above */ + sizeof(asn_DEF_TransactionID_tags_1) + /sizeof(asn_DEF_TransactionID_tags_1[0]), /* 1 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_TransactionID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_TransactionID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + TransactionID_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/e2ap/lib/TriggeringMessage.c b/e2ap/lib/TriggeringMessage.c index 7d1dbe8..68c01b3 100644 --- a/e2ap/lib/TriggeringMessage.c +++ b/e2ap/lib/TriggeringMessage.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP-CommonDataTypes-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "commonDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "TriggeringMessage.h" @@ -11,14 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_TriggeringMessage_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_TriggeringMessage_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_TriggeringMessage_value2enum_1[] = { { 0, 18, "initiating-message" }, { 1, 18, "successful-outcome" }, @@ -51,7 +55,15 @@ asn_TYPE_descriptor_t asn_DEF_TriggeringMessage = { asn_DEF_TriggeringMessage_tags_1, /* Same as above */ sizeof(asn_DEF_TriggeringMessage_tags_1) /sizeof(asn_DEF_TriggeringMessage_tags_1[0]), /* 1 */ - { &asn_OER_type_TriggeringMessage_constr_1, &asn_PER_type_TriggeringMessage_constr_1, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_TriggeringMessage_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_TriggeringMessage_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_TriggeringMessage_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/TypeOfError.c b/e2ap/lib/TypeOfError.c index e37ab6b..60d0a7f 100644 --- a/e2ap/lib/TypeOfError.c +++ b/e2ap/lib/TypeOfError.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP-IEs-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "informationElementDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "TypeOfError.h" @@ -11,14 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_type_TypeOfError_constr_1 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_TypeOfError_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_TypeOfError_value2enum_1[] = { { 0, 14, "not-understood" }, { 1, 7, "missing" } @@ -51,7 +55,15 @@ asn_TYPE_descriptor_t asn_DEF_TypeOfError = { asn_DEF_TypeOfError_tags_1, /* Same as above */ sizeof(asn_DEF_TypeOfError_tags_1) /sizeof(asn_DEF_TypeOfError_tags_1[0]), /* 1 */ - { &asn_OER_type_TypeOfError_constr_1, &asn_PER_type_TypeOfError_constr_1, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_TypeOfError_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_TypeOfError_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_TypeOfError_specs_1 /* Additional specs */ }; diff --git a/e2ap/lib/UnsuccessfulOutcome.c b/e2ap/lib/UnsuccessfulOutcome.c index 5c85aa8..660017c 100644 --- a/e2ap/lib/UnsuccessfulOutcome.c +++ b/e2ap/lib/UnsuccessfulOutcome.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-PDU-Descriptions-v01.00.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` + * found in "elementryProcedureDefinition.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UnsuccessfulOutcome.h" @@ -17,14 +17,20 @@ 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_id_E2nodeConfigurationUpdate = 10; 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_ErrorIndication = 2; +static const long asn_VAL_7_id_E2connectionUpdate = 11; +static const long asn_VAL_7_reject = 0; +static const long asn_VAL_8_id_Reset = 3; +static const long asn_VAL_8_reject = 0; +static const long asn_VAL_9_id_RICindication = 5; static const long asn_VAL_9_ignore = 1; +static const long asn_VAL_10_id_RICserviceQuery = 6; +static const long asn_VAL_10_ignore = 1; +static const long asn_VAL_11_id_ErrorIndication = 2; +static const long asn_VAL_11_ignore = 1; +static const long asn_VAL_12_id_RICsubscriptionDeleteRequired = 12; +static const long asn_VAL_12_ignore = 1; static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { { "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionRequest }, { "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionResponse }, @@ -51,29 +57,44 @@ static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { { "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2setupFailure }, { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_5_id_E2setup }, { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_reject }, + { "&InitiatingMessage", aioc__type, &asn_DEF_E2nodeConfigurationUpdate }, + { "&SuccessfulOutcome", aioc__type, &asn_DEF_E2nodeConfigurationUpdateAcknowledge }, + { "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2nodeConfigurationUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_E2nodeConfigurationUpdate }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject }, + { "&InitiatingMessage", aioc__type, &asn_DEF_E2connectionUpdate }, + { "&SuccessfulOutcome", aioc__type, &asn_DEF_E2connectionUpdateAcknowledge }, + { "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2connectionUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_E2connectionUpdate }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_reject }, { "&InitiatingMessage", aioc__type, &asn_DEF_ResetRequest }, { "&SuccessfulOutcome", aioc__type, &asn_DEF_ResetResponse }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_Reset }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_Reset }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_reject }, { "&InitiatingMessage", aioc__type, &asn_DEF_RICindication }, { "&SuccessfulOutcome", }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_RICindication }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_ignore }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_RICindication }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore }, { "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceQuery }, { "&SuccessfulOutcome", }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_RICserviceQuery }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_ignore }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_10_id_RICserviceQuery }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_10_ignore }, { "&InitiatingMessage", aioc__type, &asn_DEF_ErrorIndication }, { "&SuccessfulOutcome", }, { "&UnsuccessfulOutcome", }, - { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_ErrorIndication }, - { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore } + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_11_id_ErrorIndication }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_11_ignore }, + { "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionDeleteRequired }, + { "&SuccessfulOutcome", }, + { "&UnsuccessfulOutcome", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_12_id_RICsubscriptionDeleteRequired }, + { "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_12_ignore } }; static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = { - { 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } + { 12, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } }; static int memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, @@ -89,7 +110,7 @@ memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *spt value = *(const long *)sptr; - if((value >= 0 && value <= 255)) { + if((value >= 0L && value <= 255L)) { /* Constraint check succeeded */ return 0; } else { @@ -192,37 +213,57 @@ memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); } +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_procedureCode_constr_2 CC_NOTUSED = { { 1, 1 } /* (0..255) */, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { { 0, 0 }, -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_value_4[] = { { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcome__value, choice.RICsubscriptionFailure), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RICsubscriptionFailure, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICsubscriptionFailure" }, @@ -231,7 +272,15 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_RICsubscriptionDeleteFailure, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICsubscriptionDeleteFailure" }, @@ -240,7 +289,15 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_RICserviceUpdateFailure, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICserviceUpdateFailure" }, @@ -249,7 +306,15 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_RICcontrolFailure, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "RICcontrolFailure" }, @@ -258,17 +323,61 @@ static asn_TYPE_member_t asn_MBR_value_4[] = { 0, &asn_DEF_E2setupFailure, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "E2setupFailure" }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcome__value, choice.E2nodeConfigurationUpdateFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2nodeConfigurationUpdateFailure, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2nodeConfigurationUpdateFailure" + }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcome__value, choice.E2connectionUpdateFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2connectionUpdateFailure, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "E2connectionUpdateFailure" + }, }; 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 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 6 }, /* RICsubscriptionFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 5 }, /* RICsubscriptionDeleteFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 4 }, /* RICserviceUpdateFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 3 }, /* RICcontrolFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 2 }, /* E2setupFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 1 }, /* E2nodeConfigurationUpdateFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 6, -6, 0 } /* E2connectionUpdateFailure */ }; static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { sizeof(struct UnsuccessfulOutcome__value), @@ -276,7 +385,7 @@ static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { offsetof(struct UnsuccessfulOutcome__value, present), sizeof(((struct UnsuccessfulOutcome__value *)0)->present), asn_MAP_value_tag2el_4, - 5, /* Count of tags in the map */ + 7, /* Count of tags in the map */ 0, 0, -1 /* Extensions start */ }; @@ -289,9 +398,17 @@ asn_TYPE_descriptor_t asn_DEF_value_4 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, 0, OPEN_TYPE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OPEN_TYPE_constraint + }, asn_MBR_value_4, - 5, /* Elements count */ + 7, /* Elements count */ &asn_SPC_value_specs_4 /* Additional specs */ }; @@ -301,7 +418,15 @@ asn_TYPE_member_t asn_MBR_UnsuccessfulOutcome_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_ProcedureCode, 0, - { &asn_OER_memb_procedureCode_constr_2, &asn_PER_memb_procedureCode_constr_2, memb_procedureCode_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_procedureCode_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_procedureCode_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_procedureCode_constraint_1 + }, 0, 0, /* No default value */ "procedureCode" }, @@ -310,7 +435,15 @@ asn_TYPE_member_t asn_MBR_UnsuccessfulOutcome_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_Criticality, select_UnsuccessfulOutcome_criticality_type, - { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_criticality_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_criticality_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_criticality_constraint_1 + }, 0, 0, /* No default value */ "criticality" }, @@ -319,7 +452,15 @@ asn_TYPE_member_t asn_MBR_UnsuccessfulOutcome_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_value_4, select_UnsuccessfulOutcome_value_type, - { &asn_OER_memb_value_constr_4, &asn_PER_memb_value_constr_4, memb_value_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_value_constr_4, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_value_constr_4, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_value_constraint_1 + }, 0, 0, /* No default value */ "value" }, @@ -350,7 +491,15 @@ asn_TYPE_descriptor_t asn_DEF_UnsuccessfulOutcome = { asn_DEF_UnsuccessfulOutcome_tags_1, /* Same as above */ sizeof(asn_DEF_UnsuccessfulOutcome_tags_1) /sizeof(asn_DEF_UnsuccessfulOutcome_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_UnsuccessfulOutcome_1, 3, /* Elements count */ &asn_SPC_UnsuccessfulOutcome_specs_1 /* Additional specs */ diff --git a/e2ap/lib/aper_decoder.c b/e2ap/lib/aper_decoder.c new file mode 100644 index 0000000..0637b6a --- /dev/null +++ b/e2ap/lib/aper_decoder.c @@ -0,0 +1,91 @@ +#include +#include +#include + +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/e2ap/lib/aper_encoder.c b/e2ap/lib/aper_encoder.c new file mode 100644 index 0000000..d9b1c1d --- /dev/null +++ b/e2ap/lib/aper_encoder.c @@ -0,0 +1,129 @@ +#include +#include +#include + +/* + * Argument type and callback necessary for aper_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 +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); + } +} + +/* + * Internally useful functions. + */ + +/* Flush partially filled buffer */ +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 ? cb : ignore_output; + 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/e2ap/lib/aper_opentype.c b/e2ap/lib/aper_opentype.c new file mode 100644 index 0000000..cdd5999 --- /dev/null +++ b/e2ap/lib/aper_opentype.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +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, -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;) { + int need_eom = 0; + ssize_t maySave = aper_put_length(po, -1, -1, toGo, &need_eom); + if(maySave < 0) break; + if(per_put_many_bits(po, bptr, maySave * 8)) break; + bptr = (char *)bptr + maySave; + toGo -= maySave; + if(need_eom && (aper_put_length(po, -1, -1, 0, NULL) < 0)) { + FREEMEM(buf); + return -1; + } + } + + FREEMEM(buf); + if(toGo) return -1; + + ASN_DEBUG("Open type put %s of length %zd + 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/e2ap/lib/aper_support.c b/e2ap/lib/aper_support.c new file mode 100644 index 0000000..1f34c60 --- /dev/null +++ b/e2ap/lib/aper_support.c @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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, ssize_t lb, ssize_t ub, + int ebits, int *repeat) { + int constrained = (lb >= 0) && (ub >= 0); + ssize_t value; + + *repeat = 0; + + if (constrained && ub < 65536) { + int range = ub - lb + 1; + 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) /* #11.9.3.6 */ + return (value & 0x7F); + if((value & 64) == 0) { /* #11.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, #11.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=%zd", length); + return length; + } else { + int repeat; + length = aper_get_length(pd, -1, -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; + int length; + + /* handle indefinite range */ + length = per_get_few_bits(pd, 1); + if (length == 0) + return per_get_few_bits(pd, 6); + + if (aper_get_align(pd) < 0) + return -1; + + length = per_get_few_bits(pd, 8); + /* the length is not likely to be that big */ + if (length > 4) + return -1; + value = 0; + if (per_get_many_bits(pd, (uint8_t *)&value, 0, length * 8) < 0) + return -1; + return value; + } + 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, ssize_t lb, ssize_t ub, size_t n, int *need_eom) { + int constrained = (lb >= 0) && (ub >= 0); + int dummy = 0; + if(!need_eom) need_eom = &dummy; + + *need_eom = 0; + + + ASN_DEBUG("APER put length %zu with range (%zd..%zd)", n, lb, ub); + + /* 11.9 X.691 Note 2 */ + if (constrained && ub < 65536) { + int range = ub - lb + 1; + return aper_put_nsnnwn(po, range, n) ? -1 : (ssize_t)n; + } + + if (aper_put_align(po) < 0) + return -1; + + if(n <= 127) { /* #11.9.3.6 */ + return per_put_few_bits(po, n, 8) + ? -1 : (ssize_t)n; + } + else if(n < 16384) /* #11.9.3.7 */ + return per_put_few_bits(po, n|0x8000, 16) + ? -1 : (ssize_t)n; + + *need_eom = 0 == (n & 16383); + n >>= 14; + if(n > 4) { + *need_eom = 0; + n = 4; + } + + return per_put_few_bits(po, 0xC0 | n, 8) + ? -1 : (ssize_t)(n << 14); +} + + +int +aper_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 { + if(aper_put_length(po, -1, -1, length, NULL) != (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) { + if (number >= range) + return -1; + bytes = 1; + } else if(range <= 65536) { + if (number >= range) + return -1; + 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/e2ap/lib/asn_application.c b/e2ap/lib/asn_application.c index 2bff460..7992185 100644 --- a/e2ap/lib/asn_application.c +++ b/e2ap/lib/asn_application.c @@ -226,7 +226,9 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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}; +#if !defined(ASN_DISABLE_XER_SUPPORT) enum xer_encoder_flags_e xer_flags = XER_F_CANONICAL; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ (void)opt_codec_ctx; /* Parameters are not checked on encode yet. */ @@ -265,6 +267,7 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, errno = ENOENT; /* Randomization doesn't make sense on output. */ ASN__ENCODE_FAILED; +#if !defined(ASN_DISABLE_BER_SUPPORT) case ATS_BER: /* BER is a superset of DER. */ /* Fall through. */ @@ -273,27 +276,29 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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. */ + errno = EBADF; /* Structure has incorrect form. */ } else { - errno = ENOENT; /* DER is not defined for this type. */ + errno = ENOENT; /* DER is not defined for this type. */ } } } else { - errno = ENOENT; /* Transfer syntax is not defined for this type. */ + 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. */ + 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. */ +#else + case ATS_BER: + case ATS_DER: + case ATS_CER: + errno = ENOENT; /* BER is not defined. */ ASN__ENCODE_FAILED; - break; -#else /* ASN_DISABLE_OER_SUPPORT */ + +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) case ATS_BASIC_OER: /* CANONICAL-OER is a superset of BASIC-OER. */ /* Fall through. */ @@ -302,27 +307,25 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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. */ + errno = EBADF; /* Structure has incorrect form. */ } else { - errno = ENOENT; /* OER is not defined for this type. */ + errno = ENOENT; /* OER is not defined for this type. */ } } } else { - errno = ENOENT; /* Transfer syntax is not defined for this type. */ + 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. */ +#else + case ATS_BASIC_OER: + case ATS_CANONICAL_OER: + errno = ENOENT; /* OER is not defined. */ ASN__ENCODE_FAILED; break; -#else /* ASN_DISABLE_PER_SUPPORT */ +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) case ATS_UNALIGNED_BASIC_PER: /* CANONICAL-UPER is a superset of BASIC-UPER. */ /* Fall through. */ @@ -331,9 +334,9 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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. */ + errno = EBADF; /* Structure has incorrect form. */ } else { - errno = ENOENT; /* UPER is not defined for this type. */ + errno = ENOENT; /* UPER is not defined for this type. */ } } else { ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded); @@ -343,16 +346,24 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, errno = EBADF; ASN__ENCODE_FAILED; } - er.encoded = 8; /* Exactly 8 zero bits is added. */ + 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. */ + errno = ENOENT; /* Transfer syntax is not defined for this type. */ ASN__ENCODE_FAILED; } break; +#else + case ATS_UNALIGNED_BASIC_PER: + case ATS_UNALIGNED_CANONICAL_PER: + errno = ENOENT; /* UPER is not defined. */ + ASN__ENCODE_FAILED; + break; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) case ATS_ALIGNED_BASIC_PER: /* CANONICAL-APER is a superset of BASIC-APER. */ /* Fall through. */ @@ -361,9 +372,9 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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. */ + errno = EBADF; /* Structure has incorrect form. */ } else { - errno = ENOENT; /* APER is not defined for this type. */ + errno = ENOENT; /* APER is not defined for this type. */ } } else { ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded); @@ -373,18 +384,25 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, errno = EBADF; ASN__ENCODE_FAILED; } - er.encoded = 8; /* Exactly 8 zero bits is added. */ + 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. */ + errno = ENOENT; /* Transfer syntax is not defined for this type. */ ASN__ENCODE_FAILED; } break; -#endif /* ASN_DISABLE_PER_SUPPORT */ +#else + case ATS_ALIGNED_BASIC_PER: + case ATS_ALIGNED_CANONICAL_PER: + errno = ENOENT; /* APER is not defined. */ + ASN__ENCODE_FAILED; + break; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) case ATS_BASIC_XER: /* CANONICAL-XER is a superset of BASIC-XER. */ xer_flags &= ~XER_F_CANONICAL; @@ -395,17 +413,41 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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. */ + errno = EBADF; /* Structure has incorrect form. */ } else { - errno = ENOENT; /* XER is not defined for this type. */ + errno = ENOENT; /* XER is not defined for this type. */ } } } else { - errno = ENOENT; /* Transfer syntax is not defined for this type. */ + errno = ENOENT; /* Transfer syntax is not defined for this type. */ ASN__ENCODE_FAILED; } break; +#else + case ATS_BASIC_XER: + case ATS_CANONICAL_XER: + errno = ENOENT; /* XER is not defined. */ + ASN__ENCODE_FAILED; + break; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + case ATS_JER: + if(td->op->jer_encoder) { + er = jer_encode(td, sptr, callback, callback_key); + if(er.encoded == -1) { + if(er.failed_type && er.failed_type->op->jer_encoder) { + errno = EBADF; /* Structure has incorrect form. */ + } else { + errno = ENOENT; /* JER is not defined for this type. */ + } + } + } else { + errno = ENOENT; /* Transfer syntax is not defined for this type. */ + ASN__ENCODE_FAILED; + } + break; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ default: errno = ENOENT; ASN__ENCODE_FAILED; @@ -430,6 +472,7 @@ asn_decode(const asn_codec_ctx_t *opt_codec_ctx, ASN__DECODE_FAILED; case ATS_RANDOM: +#if !defined(ASN_DISABLE_RFILL_SUPPORT) if(!td->op->random_fill) { ASN__DECODE_FAILED; } else { @@ -441,41 +484,55 @@ asn_decode(const asn_codec_ctx_t *opt_codec_ctx, } } break; +#else + errno = ENOENT; + ASN__DECODE_FAILED; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ case ATS_DER: case ATS_BER: +#if !defined(ASN_DISABLE_BER_SUPPORT) return ber_decode(opt_codec_ctx, td, sptr, buffer, size); +#else + errno = ENOENT; + ASN__DECODE_FAILED; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ case ATS_BASIC_OER: case ATS_CANONICAL_OER: -#ifdef ASN_DISABLE_OER_SUPPORT +#if !defined(ASN_DISABLE_OER_SUPPORT) + return oer_decode(opt_codec_ctx, td, sptr, buffer, size); +#else errno = ENOENT; ASN__DECODE_FAILED; -#else - return oer_decode(opt_codec_ctx, td, sptr, buffer, size); -#endif +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ case ATS_UNALIGNED_BASIC_PER: case ATS_UNALIGNED_CANONICAL_PER: -#ifdef ASN_DISABLE_PER_SUPPORT +#if !defined(ASN_DISABLE_UPER_SUPPORT) + return uper_decode_complete(opt_codec_ctx, td, sptr, buffer, size); +#else errno = ENOENT; ASN__DECODE_FAILED; -#else - return uper_decode_complete(opt_codec_ctx, td, sptr, buffer, size); -#endif +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ case ATS_ALIGNED_BASIC_PER: case ATS_ALIGNED_CANONICAL_PER: -#ifdef ASN_DISABLE_PER_SUPPORT +#if !defined(ASN_DISABLE_APER_SUPPORT) + return aper_decode_complete(opt_codec_ctx, td, sptr, buffer, size); +#else errno = ENOENT; ASN__DECODE_FAILED; -#else - return aper_decode_complete(opt_codec_ctx, td, sptr, buffer, size); -#endif +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ case ATS_BASIC_XER: case ATS_CANONICAL_XER: +#if !defined(ASN_DISABLE_XER_SUPPORT) return xer_decode(opt_codec_ctx, td, sptr, buffer, size); +#else + errno = ENOENT; + ASN__DECODE_FAILED; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ } } diff --git a/e2ap/lib/asn_codecs_prim.c b/e2ap/lib/asn_codecs_prim.c index fc24247..f3fdbfd 100644 --- a/e2ap/lib/asn_codecs_prim.c +++ b/e2ap/lib/asn_codecs_prim.c @@ -4,115 +4,6 @@ */ #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, @@ -138,180 +29,3 @@ ASN__PRIMITIVE_TYPE_free(const asn_TYPE_descriptor_t *td, void *sptr, 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/e2ap/lib/asn_codecs_prim_ber.c b/e2ap/lib/asn_codecs_prim_ber.c new file mode 100644 index 0000000..c5c2cef --- /dev/null +++ b/e2ap/lib/asn_codecs_prim_ber.c @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#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); +} diff --git a/e2ap/lib/asn_codecs_prim_xer.c b/e2ap/lib/asn_codecs_prim_xer.c new file mode 100644 index 0000000..70c91bc --- /dev/null +++ b/e2ap/lib/asn_codecs_prim_xer.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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 = (chunk_buf == NULL)? NULL : ((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/e2ap/lib/asn_internal.c b/e2ap/lib/asn_internal.c index 1aff95f..c2a8108 100644 --- a/e2ap/lib/asn_internal.c +++ b/e2ap/lib/asn_internal.c @@ -14,10 +14,10 @@ asn__format_to_callback(int (*cb)(const void *, size_t, void *key), void *key, va_start(args, fmt); wrote = vsnprintf(buf, buf_size, fmt, args); + va_end(args); if(wrote < (ssize_t)buf_size) { if(wrote < 0) { if(buf != scratch) FREEMEM(buf); - va_end(args); return -1; } break; diff --git a/e2ap/lib/asn_random_fill.c b/e2ap/lib/asn_random_fill.c index 819cf70..15771b6 100644 --- a/e2ap/lib/asn_random_fill.c +++ b/e2ap/lib/asn_random_fill.c @@ -42,13 +42,23 @@ asn_random_between(intmax_t lb, intmax_t rb) { uintmax_t range = asn__intmax_range(lb, rb); uintmax_t value = 0; uintmax_t got_entropy = 0; + (void)intmax_max; + int max = 0xffffff; - assert(RAND_MAX > 0xffffff); /* Seen 7ffffffd! */ +#ifdef __WIN32__ + max = RAND_MAX-1; +#endif + + assert(RAND_MAX > max); /* Seen 7ffffffd! */ assert(range < intmax_max); for(; got_entropy < range;) { - got_entropy = (got_entropy << 24) | 0xffffff; - value = (value << 24) | (random() % 0xffffff); + got_entropy = (got_entropy << 24) | max; +#ifdef HAVE_RANDOM + value = (value << 24) | (random() % max); +#else + value = (value << 24) | (rand() % max); +#endif } return lb + (intmax_t)(value % (range + 1)); diff --git a/e2ap/lib/ber_tlv_tag.c b/e2ap/lib/ber_tlv_tag.c index 4a7d732..64ec14f 100644 --- a/e2ap/lib/ber_tlv_tag.c +++ b/e2ap/lib/ber_tlv_tag.c @@ -42,7 +42,7 @@ ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { */ if(val >> ((8 * sizeof(val)) - 9)) { /* - * We would not be able to accomodate + * We would not be able to accommodate * any more tag bits. */ return -1; diff --git a/e2ap/lib/constr_CHOICE.c b/e2ap/lib/constr_CHOICE.c index 86dcbb0..5f52e3d 100644 --- a/e2ap/lib/constr_CHOICE.c +++ b/e2ap/lib/constr_CHOICE.c @@ -4,485 +4,102 @@ */ #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) +asn_TYPE_operation_t asn_OP_CHOICE = { + CHOICE_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + CHOICE_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + CHOICE_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + CHOICE_decode_ber, + CHOICE_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + CHOICE_decode_xer, + CHOICE_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + CHOICE_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + CHOICE_decode_oer, + CHOICE_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + CHOICE_decode_uper, + CHOICE_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + CHOICE_decode_aper, + CHOICE_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + CHOICE_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + CHOICE_outmost_tag +}; -/* - * 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) +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; -/* - * 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) + assert(tag_mode == 0); (void)tag_mode; + assert(tag == 0); (void)tag; -/* - * Switch to the next phase of parsing. - */ -#undef NEXT_PHASE -#define NEXT_PHASE(ctx) do { \ - ctx->phase++; \ - ctx->step = 0; \ - } while(0) + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); -/* - * Return a standardized complex structure. - */ -#undef RETURN -#define RETURN(_code) do { \ - rval.code = _code; \ - rval.consumed = consumed_myself;\ - return rval; \ - } while(0) + 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; + } +} /* * 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) { @@ -534,713 +151,6 @@ CHOICE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, } } -#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) { @@ -1297,7 +207,7 @@ CHOICE_free(const asn_TYPE_descriptor_t *td, void *ptr, * is guaranteed to be aligned properly. ASN.1 compiler itself does not * produce packed code. */ -static unsigned +unsigned _fetch_present_idx(const void *struct_ptr, unsigned pres_offset, unsigned pres_size) { const void *present_ptr; @@ -1318,7 +228,7 @@ _fetch_present_idx(const void *struct_ptr, unsigned pres_offset, return present; } -static void +void _set_present_idx(void *struct_ptr, unsigned pres_offset, unsigned pres_size, unsigned present) { void *present_ptr; @@ -1446,88 +356,3 @@ CHOICE_variant_set_presence(const asn_TYPE_descriptor_t *td, void *sptr, 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/e2ap/lib/constr_CHOICE_aper.c b/e2ap/lib/constr_CHOICE_aper.c new file mode 100644 index 0000000..41040aa --- /dev/null +++ b/e2ap/lib/constr_CHOICE_aper.c @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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 = NULL; + asn_TYPE_member_t *elm = NULL; /* CHOICE's element */ + void *memb_ptr = NULL; + void **memb_ptr2 = NULL; + void *st = *sptr; + int value = 0; + + 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; + + if(specs && specs->tag2el_count > specs->ext_start) { + value = aper_get_nsnnwn(pd, specs->tag2el_count - specs->ext_start); /* extension elements range */ + 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; + const void *memb_ptr; + int present; + + 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 = 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 || (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 = specs->to_canonical_order[present]; + + ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); + + if(ct && ct->range_bits >= 0) { + if(present < ct->lower_bound + || present > ct->upper_bound) { + if(ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, 1, 1)) + ASN__ENCODE_FAILED; + } else { + ASN__ENCODE_FAILED; + } + ct = 0; + } + } + if(ct && ct->flags & APC_EXTENSIBLE) { + 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) { + if(per_put_few_bits(po, present, 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; + int n = present - specs->ext_start; + if(n <= 63) { + if(n < 0) ASN__ENCODE_FAILED; + if(per_put_few_bits(po, n, 7)) ASN__ENCODE_FAILED; + } else + 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); + } +} diff --git a/e2ap/lib/constr_CHOICE_ber.c b/e2ap/lib/constr_CHOICE_ber.c new file mode 100644 index 0000000..7ad42c7 --- /dev/null +++ b/e2ap/lib/constr_CHOICE_ber.c @@ -0,0 +1,447 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#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) + +/* + * 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) { + /* ?Subtracted 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; +} diff --git a/e2ap/lib/constr_CHOICE_jer.c b/e2ap/lib/constr_CHOICE_jer.c new file mode 100644 index 0000000..22d5090 --- /dev/null +++ b/e2ap/lib/constr_CHOICE_jer.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +#undef JER_ADVANCE +#define JER_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) + +asn_enc_rval_t +CHOICE_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum jer_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; + + ASN__CALLBACK3("{\n\"", 3, mname, mlen, "\": ", 2); + + tmper = elm->type->op->jer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + + ASN__CALLBACK("}", 1); + // ASN__CALLBACK3("", 1); + } + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} diff --git a/e2ap/lib/constr_CHOICE_oer.c b/e2ap/lib/constr_CHOICE_oer.c index a4c591c..bc71a01 100644 --- a/e2ap/lib/constr_CHOICE_oer.c +++ b/e2ap/lib/constr_CHOICE_oer.c @@ -3,11 +3,8 @@ * 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. @@ -109,7 +106,7 @@ oer_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { */ if(val >> ((8 * sizeof(val)) - 9)) { /* - * We would not be able to accomodate + * We would not be able to accommodate * any more tag bits. */ return -1; @@ -376,5 +373,3 @@ CHOICE_encode_oer(const asn_TYPE_descriptor_t *td, return er; } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2ap/lib/constr_CHOICE_print.c b/e2ap/lib/constr_CHOICE_print.c new file mode 100644 index 0000000..a97202f --- /dev/null +++ b/e2ap/lib/constr_CHOICE_print.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; + } +} diff --git a/e2ap/lib/constr_CHOICE_rfill.c b/e2ap/lib/constr_CHOICE_rfill.c new file mode 100644 index 0000000..fd0a101 --- /dev/null +++ b/e2ap/lib/constr_CHOICE_rfill.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2ap/lib/constr_CHOICE_uper.c b/e2ap/lib/constr_CHOICE_uper.c new file mode 100644 index 0000000..77aab6d --- /dev/null +++ b/e2ap/lib/constr_CHOICE_uper.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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); + } +} diff --git a/e2ap/lib/constr_CHOICE_xer.c b/e2ap/lib/constr_CHOICE_xer.c new file mode 100644 index 0000000..45b4290 --- /dev/null +++ b/e2ap/lib/constr_CHOICE_xer.c @@ -0,0 +1,316 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +#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; +} diff --git a/e2ap/lib/constr_SEQUENCE.c b/e2ap/lib/constr_SEQUENCE.c index 43dcac7..8397d0c 100644 --- a/e2ap/lib/constr_SEQUENCE.c +++ b/e2ap/lib/constr_SEQUENCE.c @@ -5,980 +5,62 @@ */ #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; -} +asn_TYPE_operation_t asn_OP_SEQUENCE = { + SEQUENCE_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + SEQUENCE_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + SEQUENCE_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + SEQUENCE_decode_ber, + SEQUENCE_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + SEQUENCE_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + SEQUENCE_decode_oer, + SEQUENCE_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + SEQUENCE_decode_uper, + SEQUENCE_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + SEQUENCE_decode_aper, + SEQUENCE_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + SEQUENCE_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ +}; void SEQUENCE_free(const asn_TYPE_descriptor_t *td, void *sptr, @@ -1042,6 +124,8 @@ SEQUENCE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; + asn_constr_check_f *constr; + int ret; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); @@ -1057,864 +141,17 @@ SEQUENCE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, 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; + constr = elm->encoding_constraints.general_constraints; + if(!constr) + constr = elm->type->encoding_constraints.general_constraints; - 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; + ret = constr(elm->type, memb_ptr, ctfailcb, app_key); + if(ret) return ret; } - /* 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); + return 0; } -#endif /* ASN_DISABLE_PER_SUPPORT */ - int SEQUENCE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bptr) { @@ -1958,102 +195,3 @@ SEQUENCE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, 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/e2ap/lib/constr_SEQUENCE_OF.c b/e2ap/lib/constr_SEQUENCE_OF.c index 10f18cf..9c5d6cd 100644 --- a/e2ap/lib/constr_SEQUENCE_OF.c +++ b/e2ap/lib/constr_SEQUENCE_OF.c @@ -7,295 +7,61 @@ #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 */ +asn_TYPE_operation_t asn_OP_SEQUENCE_OF = { + SEQUENCE_OF_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + SEQUENCE_OF_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + SEQUENCE_OF_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + SEQUENCE_OF_decode_xer, + SEQUENCE_OF_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + SEQUENCE_OF_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + SEQUENCE_OF_decode_oer, /* Same as SET OF decoder. */ + SEQUENCE_OF_encode_oer, /* Same as SET OF encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + SEQUENCE_OF_decode_uper, /* Same as SET OF decoder */ + SEQUENCE_OF_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + SEQUENCE_OF_decode_aper, + SEQUENCE_OF_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + SEQUENCE_OF_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ +}; int SEQUENCE_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, @@ -324,35 +90,3 @@ SEQUENCE_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, 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/e2ap/lib/constr_SEQUENCE_OF_aper.c b/e2ap/lib/constr_SEQUENCE_OF_aper.c new file mode 100644 index 0000000..ff3ae8b --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_OF_aper.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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 %lld ub %lld %s", + (long long int)ct->lower_bound, + (long long int)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 (ct->lower_bound == ct->upper_bound && ct->upper_bound < 65536) { + /* No length determinant */ + } else if (aper_put_length(po, ct->lower_bound, ct->upper_bound, list->count - ct->lower_bound, 0) < 0) + ASN__ENCODE_FAILED; + } + + for(seq = -1; seq < list->count;) { + ssize_t mayEncode; + int need_eom = 0; + if(seq < 0) seq = 0; + if(ct && ct->effective_bits >= 0) { + mayEncode = list->count; + } else { + mayEncode = aper_put_length(po, -1, -1, list->count - seq, &need_eom); + 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; + } + + if(need_eom && (aper_put_length(po, -1, -1, 0, NULL) < 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + } + + ASN__ENCODED_OK(er); +} diff --git a/e2ap/lib/constr_SEQUENCE_OF_ber.c b/e2ap/lib/constr_SEQUENCE_OF_ber.c new file mode 100644 index 0000000..178f865 --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_OF_ber.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2017 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; +} diff --git a/e2ap/lib/constr_SEQUENCE_OF_jer.c b/e2ap/lib/constr_SEQUENCE_OF_jer.c new file mode 100644 index 0000000..4c366a6 --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_OF_jer.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +asn_enc_rval_t +SEQUENCE_OF_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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 = 0; + int i; + + if(!sptr) ASN__ENCODE_FAILED; + + er.encoded = 0; + ASN__CALLBACK("[", 1); + + 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("{\"", 2, mname, mlen, "\":", 2); + } + + tmper = elm->type->op->jer_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, "\"", 1); + } + + if(mname) { + ASN__CALLBACK("}", 1); + } + if (i != list->count - 1) { + ASN__CALLBACK(",", 1); + } + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + ASN__CALLBACK("]", 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} diff --git a/e2ap/lib/constr_SEQUENCE_OF_uper.c b/e2ap/lib/constr_SEQUENCE_OF_uper.c new file mode 100644 index 0000000..eb20a07 --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_OF_uper.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 + +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); +} diff --git a/e2ap/lib/constr_SEQUENCE_OF_xer.c b/e2ap/lib/constr_SEQUENCE_OF_xer.c new file mode 100644 index 0000000..7bd3236 --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_OF_xer.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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; +} diff --git a/e2ap/lib/constr_SEQUENCE_aper.c b/e2ap/lib/constr_SEQUENCE_aper.c new file mode 100644 index 0000000..895b6da --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_aper.c @@ -0,0 +1,457 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +/* + * 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)) + +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) { + if (OPEN_TYPE_aper_is_unknown_type(td, st, elm)) { + rv = OPEN_TYPE_aper_unknown_type_discard_bytes(pd); + FREEMEM(opres); + return rv; + } + 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 %zd bits (%x..)", + td->name, bmlength, *epres); + + /* Deal with padding */ + if (aper_get_align(pd) < 0) + ASN__DECODE_STARVED; + + /* 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("%zu 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 (@%zu) 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 (@%zu) 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) == 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 */ + + 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 %zu 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", 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); +} diff --git a/e2ap/lib/constr_SEQUENCE_ber.c b/e2ap/lib/constr_SEQUENCE_ber.c new file mode 100644 index 0000000..e982172 --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_ber.c @@ -0,0 +1,612 @@ +/* + * Copyright (c) 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) +#undef PHASE_OUT +#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; /* ?Subtracted 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); +} diff --git a/e2ap/lib/constr_SEQUENCE_jer.c b/e2ap/lib/constr_SEQUENCE_jer.c new file mode 100644 index 0000000..6451f0c --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_jer.c @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +asn_enc_rval_t SEQUENCE_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = {0,0,0}; + int xcan = 0; + 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; + + int bAddComma = 0; + ASN__CALLBACK("{\n", 2); + 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 (bAddComma == 1) { + ASN__CALLBACK(",", 1); + bAddComma = 0; + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("\"", 1, mname, mlen, "\": ", 3); + + /* Print the member itself */ + tmper = elm->type->op->jer_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; + if (edx != td->elements_count - 1) { + bAddComma = 1; + } + } + ASN__CALLBACK("}", 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; +} diff --git a/e2ap/lib/constr_SEQUENCE_oer.c b/e2ap/lib/constr_SEQUENCE_oer.c index ecb589c..a3bdb7b 100644 --- a/e2ap/lib/constr_SEQUENCE_oer.c +++ b/e2ap/lib/constr_SEQUENCE_oer.c @@ -3,12 +3,10 @@ * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ -#ifndef ASN_DISABLE_OER_SUPPORT - #include #include +#include #include -#include /* * This macro "eats" the part of the buffer which is definitely "consumed", @@ -486,7 +484,7 @@ SEQUENCE_encode_oer(const asn_TYPE_descriptor_t *td, } /* - * Before encode extensions, encode extensions additions presense bitmap + * Before encode extensions, encode extensions additions presence bitmap # X.696 (08/2015) #16.4. */ if(has_extensions) { @@ -557,5 +555,3 @@ SEQUENCE_encode_oer(const asn_TYPE_descriptor_t *td, ASN__ENCODED_OK(er); } } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2ap/lib/constr_SEQUENCE_print.c b/e2ap/lib/constr_SEQUENCE_print.c new file mode 100644 index 0000000..7f9e231 --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_print.c @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2ap/lib/constr_SEQUENCE_rfill.c b/e2ap/lib/constr_SEQUENCE_rfill.c new file mode 100644 index 0000000..b464f57 --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_rfill.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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/e2ap/lib/constr_SEQUENCE_uper.c b/e2ap/lib/constr_SEQUENCE_uper.c new file mode 100644 index 0000000..b235f4d --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_uper.c @@ -0,0 +1,429 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +/* + * 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)) + +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); +} diff --git a/e2ap/lib/constr_SEQUENCE_xer.c b/e2ap/lib/constr_SEQUENCE_xer.c new file mode 100644 index 0000000..c6475f7 --- /dev/null +++ b/e2ap/lib/constr_SEQUENCE_xer.c @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * 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)) + +#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; +} diff --git a/e2ap/lib/constr_SET_OF.c b/e2ap/lib/constr_SET_OF.c index bf1dc27..97a7cac 100644 --- a/e2ap/lib/constr_SET_OF.c +++ b/e2ap/lib/constr_SET_OF.c @@ -5,275 +5,63 @@ */ #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; +asn_TYPE_operation_t asn_OP_SET_OF = { + SET_OF_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + SET_OF_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + SET_OF_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + SET_OF_decode_ber, + SET_OF_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + SET_OF_decode_xer, + SET_OF_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + SET_OF_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + SET_OF_decode_oer, + SET_OF_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + SET_OF_decode_uper, + SET_OF_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + SET_OF_decode_aper, + SET_OF_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + SET_OF_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ }; + /* 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; @@ -336,7 +124,7 @@ static int _el_buf_cmp(const void *ap, const void *bp) { return ret; } -static void +void SET_OF__encode_sorted_free(struct _el_buffer *el_buf, size_t count) { size_t i; @@ -347,12 +135,7 @@ SET_OF__encode_sorted_free(struct _el_buffer *el_buf, size_t count) { FREEMEM(el_buf); } -enum SET_OF__encode_method { - SOES_DER, /* Distinguished Encoding Rules */ - SOES_CUPER /* Canonical Unaligned Packed Encoding Rules */ -}; - -static struct _el_buffer * +struct _el_buffer * SET_OF__encode_sorted(const asn_TYPE_member_t *elm, const asn_anonymous_set_ *list, enum SET_OF__encode_method method) { @@ -379,10 +162,13 @@ SET_OF__encode_sorted(const asn_TYPE_member_t *elm, * Encode the member into the prepared space. */ switch(method) { +#if !defined(ASN_DISABLE_BER_SUPPORT) case SOES_DER: erval = elm->type->op->der_encoder(elm->type, memb_ptr, 0, elm->tag, _el_addbytes, encoding_el); break; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) case SOES_CUPER: erval = uper_encode(elm->type, elm->encoding_constraints.per_constraints, @@ -393,6 +179,20 @@ SET_OF__encode_sorted(const asn_TYPE_member_t *elm, encoding_el->bits_unused = (8 - extra_bits) & 0x7; } break; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + case SOES_CAPER: + erval = aper_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; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + default: assert(!"Unreachable"); break; @@ -413,417 +213,6 @@ SET_OF__encode_sorted(const asn_TYPE_member_t *elm, } } - -/* - * 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) { @@ -902,293 +291,6 @@ SET_OF_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, 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; @@ -1267,175 +369,3 @@ SET_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, 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/e2ap/lib/constr_SET_OF_aper.c b/e2ap/lib/constr_SET_OF_aper.c new file mode 100644 index 0000000..87c341e --- /dev/null +++ b/e2ap/lib/constr_SET_OF_aper.c @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +SET_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_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}; + int seq; + + if(!sptr) ASN__ENCODE_FAILED; + + list = _A_CSET_FROM_VOID(sptr); + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SET 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 %lld ub %lld %s", + (long long int)ct->lower_bound, + (long long int)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->lower_bound, ct->upper_bound, list->count - ct->lower_bound, 0) < 0) { + ASN__ENCODE_FAILED; + } + } + + /* + * Canonical PER #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_CAPER); + + for(seq = 0; seq < list->count;) { + ssize_t may_encode; + int need_eom = 0; + if(ct && ct->effective_bits >= 0) { + may_encode = list->count; + } else { + may_encode = + aper_put_length(po, -1, -1, list->count - seq, &need_eom); + if(may_encode < 0) ASN__ENCODE_FAILED; + } + + while(may_encode--) { + const struct _el_buffer *el = &encoded_els[seq++]; + if(asn_put_many_bits(po, el->buf, + (8 * el->length) - el->bits_unused) < 0) { + break; + } + } + if(need_eom && (aper_put_length(po, -1, -1, 0, NULL) < 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + } + + SET_OF__encode_sorted_free(encoded_els, list->count); + + ASN__ENCODED_OK(er); +} + +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+%lld elements from %s", + (long)nelems, (long long int)ct->lower_bound, td->name); + if(nelems < 0) ASN__DECODE_STARVED; + nelems += ct->lower_bound; + } else { + nelems = -1; + } + + do { + int i; + if(nelems < 0) { + if (ct) + nelems = aper_get_length(pd, ct->lower_bound, ct->upper_bound, + ct->effective_bits, &repeat); + else + nelems = aper_get_length(pd, -1, -1, -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; +} diff --git a/e2ap/lib/constr_SET_OF_ber.c b/e2ap/lib/constr_SET_OF_ber.c new file mode 100644 index 0000000..4187e29 --- /dev/null +++ b/e2ap/lib/constr_SET_OF_ber.c @@ -0,0 +1,355 @@ +/* + * Copyright (c) 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) +#undef PHASE_OUT +#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; /* ?Subtracted 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); +} + +/* + * 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; + } +} diff --git a/e2ap/lib/constr_SET_OF_jer.c b/e2ap/lib/constr_SET_OF_jer.c new file mode 100644 index 0000000..a0c2adc --- /dev/null +++ b/e2ap/lib/constr_SET_OF_jer.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +typedef struct jer_tmp_enc_s { + void *buffer; + size_t offset; + size_t size; +} jer_tmp_enc_t; + +static int +SET_OF_encode_jer_callback(const void *buffer, size_t size, void *key) { + jer_tmp_enc_t *t = (jer_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_jer_order(const void *aptr, const void *bptr) { + const jer_tmp_enc_t *a = (const jer_tmp_enc_t *)aptr; + const jer_tmp_enc_t *b = (const jer_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_jer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum jer_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 = 0; + jer_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 = (jer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0])); + if(!encs) ASN__ENCODE_FAILED; + cb = SET_OF_encode_jer_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, "\": ", 3); + } + + if(!xcan && specs->as_XMLValueList == 1) + ASN__TEXT_INDENT(1, ilevel + 1); + tmper = elm->type->op->jer_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) { + jer_tmp_enc_t *enc = encs; + jer_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_jer_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); +} diff --git a/e2ap/lib/constr_SET_OF_oer.c b/e2ap/lib/constr_SET_OF_oer.c index 5200518..a0f0140 100644 --- a/e2ap/lib/constr_SET_OF_oer.c +++ b/e2ap/lib/constr_SET_OF_oer.c @@ -3,8 +3,6 @@ * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ -#ifndef ASN_DISABLE_OER_SUPPORT - #include #include #include @@ -43,12 +41,12 @@ * 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; \ +#define RETURN(_code) \ + do { \ + asn_dec_rval_t _rval; \ + _rval.code = _code; \ + _rval.consumed = consumed_myself; \ + return _rval; \ } while(0) /* @@ -281,5 +279,3 @@ SET_OF_encode_oer(const asn_TYPE_descriptor_t *td, ASN__ENCODED_OK(erval); } } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2ap/lib/constr_SET_OF_print.c b/e2ap/lib/constr_SET_OF_print.c new file mode 100644 index 0000000..748dba7 --- /dev/null +++ b/e2ap/lib/constr_SET_OF_print.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2ap/lib/constr_SET_OF_rfill.c b/e2ap/lib/constr_SET_OF_rfill.c new file mode 100644 index 0000000..9b2ac5e --- /dev/null +++ b/e2ap/lib/constr_SET_OF_rfill.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 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; + } + } +#else + if(!constraints) constraints = &td->encoding_constraints; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + + /* Bias towards edges of allowed space */ + switch(asn_random_between(-1, 4)) { + default: + case -1: +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + /* 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; + } +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + /* 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/e2ap/lib/constr_SET_OF_uper.c b/e2ap/lib/constr_SET_OF_uper.c new file mode 100644 index 0000000..b99a244 --- /dev/null +++ b/e2ap/lib/constr_SET_OF_uper.c @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; + } +} diff --git a/e2ap/lib/constr_SET_OF_xer.c b/e2ap/lib/constr_SET_OF_xer.c new file mode 100644 index 0000000..1d97e5b --- /dev/null +++ b/e2ap/lib/constr_SET_OF_xer.c @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +#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); +} diff --git a/e2ap/lib/constr_TYPE.c b/e2ap/lib/constr_TYPE.c index aefaefd..e634e75 100644 --- a/e2ap/lib/constr_TYPE.c +++ b/e2ap/lib/constr_TYPE.c @@ -70,7 +70,7 @@ _print2fp(const void *buffer, size_t size, void *app_key) { * 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 CC_PRINTFLIKE(1, 2) ASN_DEBUG_f(const char *fmt, ...); void ASN_DEBUG_f(const char *fmt, ...) { va_list ap; va_start(ap, fmt); diff --git a/e2ap/lib/constraints.c b/e2ap/lib/constraints.c index df3c6c1..72137cc 100644 --- a/e2ap/lib/constraints.c +++ b/e2ap/lib/constraints.c @@ -35,6 +35,7 @@ struct errbufDesc { }; static void +CC_PRINTFLIKE(4, 5) _asn_i_ctfailcb(void *key, const asn_TYPE_descriptor_t *td, const void *sptr, const char *fmt, ...) { struct errbufDesc *arg = key; diff --git a/e2ap/lib/jer_encoder.c b/e2ap/lib/jer_encoder.c new file mode 100644 index 0000000..4fe5ce3 --- /dev/null +++ b/e2ap/lib/jer_encoder.c @@ -0,0 +1,69 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * The JER encoder of any type. May be invoked by the application. + */ +asn_enc_rval_t +jer_encode(const asn_TYPE_descriptor_t *td, const void *sptr, + 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; + + if(!td || !sptr) goto cb_failed; + + mname = td->xml_tag; + mlen = strlen(mname); + + ASN__CALLBACK3("{\n\"", 3, mname, mlen, "\":", 2); + + int xFlag = 0; + tmper = td->op->jer_encoder(td, sptr, 1, xFlag, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + + ASN__CALLBACK("}", 1); + // ASN__CALLBACK3("\n", xcan); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +/* + * This is a helper function for jer_fprint, which directs all incoming data + * into the provided file descriptor. + */ +static int +jer__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 +jer_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 = jer_encode(td, sptr, jer__print2fp, stream); + if(er.encoded == -1) + return -1; + + return fflush(stream); +} + diff --git a/e2ap/lib/per_decoder.c b/e2ap/lib/per_decoder.c index 8a3e39d..42b92ca 100644 --- a/e2ap/lib/per_decoder.c +++ b/e2ap/lib/per_decoder.c @@ -2,184 +2,4 @@ #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; -} - +// Absolutely nothing diff --git a/e2ap/lib/per_encoder.c b/e2ap/lib/per_encoder.c index a35e1f0..01ab70b 100644 --- a/e2ap/lib/per_encoder.c +++ b/e2ap/lib/per_encoder.c @@ -1,10 +1,7 @@ -#include #include #include -static int _uper_encode_flush_outp(asn_per_outp_t *po); - -static int +int ignore_output(const void *data, size_t size, void *app_key) { (void)data; (void)size; @@ -12,81 +9,7 @@ ignore_output(const void *data, size_t 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 +int encode_dyn_cb(const void *buffer, size_t size, void *key) { enc_dyn_arg *arg = key; if(arg->length + size >= arg->allocated) { @@ -110,156 +33,3 @@ encode_dyn_cb(const void *buffer, size_t size, void *key) { 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/e2ap/lib/per_opentype.c b/e2ap/lib/per_opentype.c index 28f3cb6..5620c5b 100644 --- a/e2ap/lib/per_opentype.c +++ b/e2ap/lib/per_opentype.c @@ -2,288 +2,13 @@ * 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 +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) { @@ -301,233 +26,3 @@ uper_sot_suck(const asn_codec_ctx_t *ctx, const asn_TYPE_descriptor_t *td, 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/e2ap/lib/per_support.c b/e2ap/lib/per_support.c index 2285677..62d343c 100644 --- a/e2ap/lib/per_support.c +++ b/e2ap/lib/per_support.c @@ -6,484 +6,4 @@ #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); -} +// Absolutely nothing diff --git a/e2ap/lib/uper_decoder.c b/e2ap/lib/uper_decoder.c new file mode 100644 index 0000000..a88e95c --- /dev/null +++ b/e2ap/lib/uper_decoder.c @@ -0,0 +1,96 @@ +#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; +} diff --git a/e2ap/lib/uper_encoder.c b/e2ap/lib/uper_encoder.c new file mode 100644 index 0000000..4c1d24a --- /dev/null +++ b/e2ap/lib/uper_encoder.c @@ -0,0 +1,127 @@ +#include +#include +#include + +static int _uper_encode_flush_outp(asn_per_outp_t *po); + +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); +} + +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); +} diff --git a/e2ap/lib/uper_opentype.c b/e2ap/lib/uper_opentype.c new file mode 100644 index 0000000..17ee064 --- /dev/null +++ b/e2ap/lib/uper_opentype.c @@ -0,0 +1,372 @@ +/* + * 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); + +/* + * 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 == NULL)? NULL : 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; /* No one 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 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; +} diff --git a/e2ap/lib/uper_support.c b/e2ap/lib/uper_support.c new file mode 100644 index 0000000..ce8adc5 --- /dev/null +++ b/e2ap/lib/uper_support.c @@ -0,0 +1,311 @@ +/* + * 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, uintmax_t *out_value, int nbits) { + uintmax_t lhalf; /* Lower half of the number*/ + intmax_t 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 = ((uintmax_t)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, uintmax_t 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__imax_range(intmax_t lb, intmax_t ub, uintmax_t *range_r) { + uintmax_t bounds_range; + if((ub < 0) == (lb < 0)) { + bounds_range = ub - lb; + } else if(lb < 0) { + assert(ub >= 0); + bounds_range = 1 + ((uintmax_t)ub + (uintmax_t)-(lb + 1)); + } else { + assert(!"Unreachable"); + return -1; + } + *range_r = bounds_range; + return 0; +} + +int +per_imax_range_rebase(intmax_t v, intmax_t lb, intmax_t ub, uintmax_t *output) { + uintmax_t range; + + assert(lb <= ub); + + if(v < lb || v > ub || per__imax_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) { + uintmax_t rebased = 1 + (uintmax_t)-(v+1) + (uintmax_t)lb; + assert(rebased <= range); /* By construction */ + *output = rebased; + return 0; + } else if(lb < 0) { + uintmax_t rebased = 1 + (uintmax_t)-(lb+1) + (uintmax_t)v; + assert(rebased <= range); /* By construction */ + *output = rebased; + return 0; + } else { + assert(!"Unreachable"); + return -1; + } +} + +int +per_long_range_rebase(long v, intmax_t lb, intmax_t ub, unsigned long *output) { + uintmax_t tmp = *output; + int rc = per_imax_range_rebase((intmax_t)v, lb, ub, &tmp); + *output = tmp; + return rc; +} + +int +per_imax_range_unrebase(uintmax_t inp, intmax_t lb, intmax_t ub, intmax_t *outp) { + uintmax_t range; + + if(per__imax_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 <= INTMAX_MAX) { + *outp = (intmax_t)inp + lb; + } else { + *outp = (lb + INTMAX_MAX + 1) + (intmax_t)((inp - INTMAX_MAX) - 1); + } + + return 0; +} + +int +per_long_range_unrebase(unsigned long inp, intmax_t lb, intmax_t ub, long *outp) { + intmax_t tmp = *outp; + int rc = per_imax_range_unrebase((uintmax_t)inp, lb, ub, &tmp); + *outp = tmp; + return rc; +} diff --git a/e2ap/lib/xer_decoder.c b/e2ap/lib/xer_decoder.c index 5b87703..2a14557 100644 --- a/e2ap/lib/xer_decoder.c +++ b/e2ap/lib/xer_decoder.c @@ -323,7 +323,7 @@ xer_decode_general(const asn_codec_ctx_t *opt_codec_ctx, 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; + const char *pend = (p == NULL)? NULL : p + chunk_size; for(; p < pend; p++) { switch(*p) { diff --git a/e2ap/wrapper.h b/e2ap/wrapper.h index 44d3e85..bacc5a4 100644 --- a/e2ap/wrapper.h +++ b/e2ap/wrapper.h @@ -1,5 +1,5 @@ -#ifndef _WRAPPER_H_ -#define _WRAPPER_H_ +#ifndef _WRAPPER_E2AP_H_ +#define _WRAPPER_E2AP_H_ #include #include #include "RICsubscriptionRequest.h" @@ -16,7 +16,17 @@ #include "ProtocolIE-Field.h" #include "RICactionDefinition.h" #include "RICsubsequentAction.h" -#include "CauseRIC.h" +#include "CauseE2node.h" +#include "Cause.h" +#include "CauseMisc.h" +#include "CauseProtocol.h" +#include "CauseRICrequest.h" +#include "CauseRICservice.h" +#include "CauseTransport.h" +#include "RICsubscription-List-withCause.h" +#include "RICsubscription-withCause-Item.h" + +//#include "CauseRIC.h" typedef struct RICindicationMessage { long requestorID; @@ -101,4 +111,4 @@ RICindicationMsg* e2ap_decode_ric_indication_message(void *buffer, size_t buf_si RICindicationMsg* e2ap_decode_ric_indication_m(); void e2ap_free_decoded_ric_indication_message(RICindicationMsg* msg); -#endif /* _WRAPPER_H_ */ +#endif /* _WRAPPER_E2AP_H_ */ diff --git a/e2sm/asn1/Makefile.am.libasncodec b/e2sm/asn1/Makefile.am.libasncodec new file mode 100644 index 0000000..70946d3 --- /dev/null +++ b/e2sm/asn1/Makefile.am.libasncodec @@ -0,0 +1,480 @@ +ASN_MODULE_SRCS= \ + CGI.c \ + CoreCPID.c \ + InterfaceIdentifier.c \ + InterfaceID-NG.c \ + InterfaceID-Xn.c \ + InterfaceID-F1.c \ + InterfaceID-E1.c \ + InterfaceID-S1.c \ + InterfaceID-X2.c \ + InterfaceID-W1.c \ + Interface-MessageID.c \ + InterfaceType.c \ + GroupID.c \ + QoSID.c \ + RANfunction-Name.c \ + RIC-Format-Type.c \ + RIC-Style-Type.c \ + RIC-Style-Name.c \ + RRC-MessageID.c \ + RRCclass-LTE.c \ + RRCclass-NR.c \ + ServingCell-ARFCN.c \ + ServingCell-PCI.c \ + UEID.c \ + UEID-GNB.c \ + UEID-GNB-CU-CP-E1AP-ID-List.c \ + UEID-GNB-CU-CP-E1AP-ID-Item.c \ + UEID-GNB-CU-F1AP-ID-List.c \ + UEID-GNB-CU-CP-F1AP-ID-Item.c \ + UEID-GNB-DU.c \ + UEID-GNB-CU-UP.c \ + UEID-NG-ENB.c \ + UEID-NG-ENB-DU.c \ + UEID-EN-GNB.c \ + UEID-ENB.c \ + ENB-ID.c \ + GlobalENB-ID.c \ + GUMMEI.c \ + MME-Group-ID.c \ + MME-Code.c \ + MME-UE-S1AP-ID.c \ + QCI.c \ + SubscriberProfileIDforRFP.c \ + EN-GNB-ID.c \ + ENB-UE-X2AP-ID.c \ + ENB-UE-X2AP-ID-Extension.c \ + E-UTRA-ARFCN.c \ + E-UTRA-PCI.c \ + E-UTRA-TAC.c \ + GlobalenGNB-ID.c \ + NGENB-CU-UE-W1AP-ID.c \ + NGENB-DU-ID.c \ + AMFPointer.c \ + AMFRegionID.c \ + AMFSetID.c \ + AMF-UE-NGAP-ID.c \ + EUTRACellIdentity.c \ + EUTRA-CGI.c \ + FiveQI.c \ + GlobalGNB-ID.c \ + GlobalNgENB-ID.c \ + GlobalRANNodeID.c \ + GNB-ID.c \ + GUAMI.c \ + IndexToRFSP.c \ + NgENB-ID.c \ + NRCellIdentity.c \ + NR-CGI.c \ + PLMNIdentity.c \ + QosFlowIdentifier.c \ + SD.c \ + S-NSSAI.c \ + SST.c \ + NG-RANnodeUEXnAPID.c \ + GNB-CU-CP-UE-E1AP-ID.c \ + GNB-CU-UP-ID.c \ + FiveGS-TAC.c \ + GNB-CU-UE-F1AP-ID.c \ + GNB-DU-ID.c \ + NR-PCI.c \ + NR-ARFCN.c \ + FreqBandNrItem.c \ + RANUEID.c \ + TimeStamp.c \ + GranularityPeriod.c \ + MeasurementType.c \ + MeasurementTypeName.c \ + MeasurementTypeID.c \ + MeasurementLabel.c \ + TestCondInfo.c \ + TestCond-Type.c \ + TestCond-Expression.c \ + TestCond-Value.c \ + MeasurementInfoList.c \ + MeasurementInfoItem.c \ + LabelInfoList.c \ + LabelInfoItem.c \ + MeasurementData.c \ + MeasurementDataItem.c \ + MeasurementRecord.c \ + MeasurementRecordItem.c \ + MeasurementInfo-Action-List.c \ + MeasurementInfo-Action-Item.c \ + MeasurementCondList.c \ + MeasurementCondItem.c \ + MeasurementCondUEidList.c \ + MeasurementCondUEidItem.c \ + MatchingCondList.c \ + MatchingCondItem.c \ + MatchingUEidList.c \ + MatchingUEidItem.c \ + E2SM-KPM-EventTriggerDefinition.c \ + E2SM-KPM-EventTriggerDefinition-Format1.c \ + E2SM-KPM-ActionDefinition.c \ + E2SM-KPM-ActionDefinition-Format1.c \ + E2SM-KPM-ActionDefinition-Format2.c \ + E2SM-KPM-ActionDefinition-Format3.c \ + E2SM-KPM-IndicationHeader.c \ + E2SM-KPM-IndicationHeader-Format1.c \ + E2SM-KPM-IndicationMessage.c \ + E2SM-KPM-IndicationMessage-Format1.c \ + E2SM-KPM-IndicationMessage-Format2.c \ + E2SM-KPM-RANfunction-Description.c \ + RIC-EventTriggerStyle-Item.c \ + RIC-ReportStyle-Item.c \ + EXTERNAL.c + +ASN_MODULE_HDRS= \ + CGI.h \ + CoreCPID.h \ + InterfaceIdentifier.h \ + InterfaceID-NG.h \ + InterfaceID-Xn.h \ + InterfaceID-F1.h \ + InterfaceID-E1.h \ + InterfaceID-S1.h \ + InterfaceID-X2.h \ + InterfaceID-W1.h \ + Interface-MessageID.h \ + InterfaceType.h \ + GroupID.h \ + QoSID.h \ + RANfunction-Name.h \ + RIC-Format-Type.h \ + RIC-Style-Type.h \ + RIC-Style-Name.h \ + RRC-MessageID.h \ + RRCclass-LTE.h \ + RRCclass-NR.h \ + ServingCell-ARFCN.h \ + ServingCell-PCI.h \ + UEID.h \ + UEID-GNB.h \ + UEID-GNB-CU-CP-E1AP-ID-List.h \ + UEID-GNB-CU-CP-E1AP-ID-Item.h \ + UEID-GNB-CU-F1AP-ID-List.h \ + UEID-GNB-CU-CP-F1AP-ID-Item.h \ + UEID-GNB-DU.h \ + UEID-GNB-CU-UP.h \ + UEID-NG-ENB.h \ + UEID-NG-ENB-DU.h \ + UEID-EN-GNB.h \ + UEID-ENB.h \ + ENB-ID.h \ + GlobalENB-ID.h \ + GUMMEI.h \ + MME-Group-ID.h \ + MME-Code.h \ + MME-UE-S1AP-ID.h \ + QCI.h \ + SubscriberProfileIDforRFP.h \ + EN-GNB-ID.h \ + ENB-UE-X2AP-ID.h \ + ENB-UE-X2AP-ID-Extension.h \ + E-UTRA-ARFCN.h \ + E-UTRA-PCI.h \ + E-UTRA-TAC.h \ + GlobalenGNB-ID.h \ + NGENB-CU-UE-W1AP-ID.h \ + NGENB-DU-ID.h \ + AMFPointer.h \ + AMFRegionID.h \ + AMFSetID.h \ + AMF-UE-NGAP-ID.h \ + EUTRACellIdentity.h \ + EUTRA-CGI.h \ + FiveQI.h \ + GlobalGNB-ID.h \ + GlobalNgENB-ID.h \ + GlobalRANNodeID.h \ + GNB-ID.h \ + GUAMI.h \ + IndexToRFSP.h \ + NgENB-ID.h \ + NRCellIdentity.h \ + NR-CGI.h \ + PLMNIdentity.h \ + QosFlowIdentifier.h \ + SD.h \ + S-NSSAI.h \ + SST.h \ + NG-RANnodeUEXnAPID.h \ + GNB-CU-CP-UE-E1AP-ID.h \ + GNB-CU-UP-ID.h \ + FiveGS-TAC.h \ + GNB-CU-UE-F1AP-ID.h \ + GNB-DU-ID.h \ + NR-PCI.h \ + NR-ARFCN.h \ + FreqBandNrItem.h \ + RANUEID.h \ + TimeStamp.h \ + GranularityPeriod.h \ + MeasurementType.h \ + MeasurementTypeName.h \ + MeasurementTypeID.h \ + MeasurementLabel.h \ + TestCondInfo.h \ + TestCond-Type.h \ + TestCond-Expression.h \ + TestCond-Value.h \ + MeasurementInfoList.h \ + MeasurementInfoItem.h \ + LabelInfoList.h \ + LabelInfoItem.h \ + MeasurementData.h \ + MeasurementDataItem.h \ + MeasurementRecord.h \ + MeasurementRecordItem.h \ + MeasurementInfo-Action-List.h \ + MeasurementInfo-Action-Item.h \ + MeasurementCondList.h \ + MeasurementCondItem.h \ + MeasurementCondUEidList.h \ + MeasurementCondUEidItem.h \ + MatchingCondList.h \ + MatchingCondItem.h \ + MatchingUEidList.h \ + MatchingUEidItem.h \ + E2SM-KPM-EventTriggerDefinition.h \ + E2SM-KPM-EventTriggerDefinition-Format1.h \ + E2SM-KPM-ActionDefinition.h \ + E2SM-KPM-ActionDefinition-Format1.h \ + E2SM-KPM-ActionDefinition-Format2.h \ + E2SM-KPM-ActionDefinition-Format3.h \ + E2SM-KPM-IndicationHeader.h \ + E2SM-KPM-IndicationHeader-Format1.h \ + E2SM-KPM-IndicationMessage.h \ + E2SM-KPM-IndicationMessage-Format1.h \ + E2SM-KPM-IndicationMessage-Format2.h \ + E2SM-KPM-RANfunction-Description.h \ + RIC-EventTriggerStyle-Item.h \ + RIC-ReportStyle-Item.h \ + EXTERNAL.h + +ASN_MODULE_HDRS+=ANY.h +ASN_MODULE_SRCS+=ANY.c +ASN_MODULE_HDRS+=OCTET_STRING.h +ASN_MODULE_HDRS+=OPEN_TYPE.h +ASN_MODULE_SRCS+=OPEN_TYPE.c +ASN_MODULE_HDRS+=constr_CHOICE.h +ASN_MODULE_HDRS+=BOOLEAN.h +ASN_MODULE_SRCS+=BOOLEAN.c +ASN_MODULE_HDRS+=GraphicString.h +ASN_MODULE_SRCS+=GraphicString.c +ASN_MODULE_HDRS+=INTEGER.h +ASN_MODULE_SRCS+=INTEGER.c +ASN_MODULE_HDRS+=NULL.h +ASN_MODULE_SRCS+=NULL.c +ASN_MODULE_HDRS+=NativeEnumerated.h +ASN_MODULE_SRCS+=NativeEnumerated.c +ASN_MODULE_HDRS+=NativeInteger.h +ASN_MODULE_SRCS+=NativeInteger.c +ASN_MODULE_HDRS+=NativeReal.h +ASN_MODULE_SRCS+=NativeReal.c +ASN_MODULE_HDRS+=REAL.h +ASN_MODULE_HDRS+=OBJECT_IDENTIFIER.h +ASN_MODULE_SRCS+=OBJECT_IDENTIFIER.c +ASN_MODULE_HDRS+=asn_codecs_prim.h +ASN_MODULE_HDRS+=ObjectDescriptor.h +ASN_MODULE_SRCS+=ObjectDescriptor.c +ASN_MODULE_HDRS+=PrintableString.h +ASN_MODULE_SRCS+=PrintableString.c +ASN_MODULE_SRCS+=REAL.c +ASN_MODULE_HDRS+=asn_SEQUENCE_OF.h +ASN_MODULE_SRCS+=asn_SEQUENCE_OF.c +ASN_MODULE_HDRS+=asn_SET_OF.h +ASN_MODULE_SRCS+=asn_SET_OF.c +ASN_MODULE_SRCS+=constr_CHOICE.c +ASN_MODULE_HDRS+=constr_SEQUENCE.h +ASN_MODULE_SRCS+=constr_SEQUENCE.c +ASN_MODULE_HDRS+=constr_SEQUENCE_OF.h +ASN_MODULE_SRCS+=constr_SEQUENCE_OF.c +ASN_MODULE_HDRS+=constr_SET_OF.h +ASN_MODULE_SRCS+=constr_SET_OF.c +ASN_MODULE_HDRS+=asn_application.h +ASN_MODULE_SRCS+=asn_application.c +ASN_MODULE_HDRS+=asn_ioc.h +ASN_MODULE_HDRS+=asn_system.h +ASN_MODULE_HDRS+=asn_codecs.h +ASN_MODULE_HDRS+=asn_internal.h +ASN_MODULE_SRCS+=asn_internal.c +ASN_MODULE_HDRS+=asn_bit_data.h +ASN_MODULE_SRCS+=asn_bit_data.c +ASN_MODULE_SRCS+=OCTET_STRING.c +ASN_MODULE_HDRS+=BIT_STRING.h +ASN_MODULE_SRCS+=BIT_STRING.c +ASN_MODULE_SRCS+=asn_codecs_prim.c +ASN_MODULE_HDRS+=ber_tlv_length.h +ASN_MODULE_SRCS+=ber_tlv_length.c +ASN_MODULE_HDRS+=ber_tlv_tag.h +ASN_MODULE_SRCS+=ber_tlv_tag.c +ASN_MODULE_HDRS+=constr_TYPE.h +ASN_MODULE_SRCS+=constr_TYPE.c +ASN_MODULE_HDRS+=constraints.h +ASN_MODULE_SRCS+=constraints.c +ASN_MODULE_HDRS+=ber_decoder.h +ASN_MODULE_HDRS+=der_encoder.h +ASN_MODULE_SRCS+=ber_decoder.c +ASN_MODULE_SRCS+=der_encoder.c +ASN_MODULE_SRCS+=ANY_ber.c +ASN_MODULE_SRCS+=BOOLEAN_ber.c +ASN_MODULE_SRCS+=INTEGER_ber.c +ASN_MODULE_SRCS+=NULL_ber.c +ASN_MODULE_SRCS+=NativeInteger_ber.c +ASN_MODULE_SRCS+=NativeReal_ber.c +ASN_MODULE_SRCS+=OCTET_STRING_ber.c +ASN_MODULE_SRCS+=OPEN_TYPE_ber.c +ASN_MODULE_SRCS+=asn_codecs_prim_ber.c +ASN_MODULE_SRCS+=constr_CHOICE_ber.c +ASN_MODULE_SRCS+=constr_SEQUENCE_OF_ber.c +ASN_MODULE_SRCS+=constr_SEQUENCE_ber.c +ASN_MODULE_SRCS+=constr_SET_OF_ber.c +ASN_MODULE_HDRS+=xer_support.h +ASN_MODULE_HDRS+=xer_decoder.h +ASN_MODULE_HDRS+=xer_encoder.h +ASN_MODULE_SRCS+=xer_support.c +ASN_MODULE_SRCS+=xer_decoder.c +ASN_MODULE_SRCS+=xer_encoder.c +ASN_MODULE_SRCS+=ANY_xer.c +ASN_MODULE_SRCS+=BIT_STRING_xer.c +ASN_MODULE_SRCS+=BOOLEAN_xer.c +ASN_MODULE_SRCS+=INTEGER_xer.c +ASN_MODULE_SRCS+=NULL_xer.c +ASN_MODULE_SRCS+=NativeEnumerated_xer.c +ASN_MODULE_SRCS+=NativeInteger_xer.c +ASN_MODULE_SRCS+=NativeReal_xer.c +ASN_MODULE_SRCS+=OBJECT_IDENTIFIER_xer.c +ASN_MODULE_SRCS+=OCTET_STRING_xer.c +ASN_MODULE_SRCS+=OPEN_TYPE_xer.c +ASN_MODULE_SRCS+=REAL_xer.c +ASN_MODULE_SRCS+=asn_codecs_prim_xer.c +ASN_MODULE_SRCS+=constr_CHOICE_xer.c +ASN_MODULE_SRCS+=constr_SEQUENCE_OF_xer.c +ASN_MODULE_SRCS+=constr_SEQUENCE_xer.c +ASN_MODULE_SRCS+=constr_SET_OF_xer.c +ASN_MODULE_HDRS+=oer_decoder.h +ASN_MODULE_HDRS+=oer_encoder.h +ASN_MODULE_HDRS+=oer_support.h +ASN_MODULE_SRCS+=oer_decoder.c +ASN_MODULE_SRCS+=oer_encoder.c +ASN_MODULE_SRCS+=oer_support.c +ASN_MODULE_SRCS+=OPEN_TYPE_oer.c +ASN_MODULE_SRCS+=INTEGER_oer.c +ASN_MODULE_SRCS+=BIT_STRING_oer.c +ASN_MODULE_SRCS+=OCTET_STRING_oer.c +ASN_MODULE_SRCS+=NativeInteger_oer.c +ASN_MODULE_SRCS+=NativeEnumerated_oer.c +ASN_MODULE_SRCS+=constr_CHOICE_oer.c +ASN_MODULE_SRCS+=constr_SEQUENCE_oer.c +ASN_MODULE_SRCS+=constr_SET_OF_oer.c +ASN_MODULE_SRCS+=BOOLEAN_oer.c +ASN_MODULE_SRCS+=NULL_oer.c +ASN_MODULE_SRCS+=NativeReal_oer.c +ASN_MODULE_SRCS+=REAL_oer.c +ASN_MODULE_HDRS+=per_decoder.h +ASN_MODULE_HDRS+=per_encoder.h +ASN_MODULE_HDRS+=per_support.h +ASN_MODULE_HDRS+=per_opentype.h +ASN_MODULE_SRCS+=per_decoder.c +ASN_MODULE_SRCS+=per_encoder.c +ASN_MODULE_SRCS+=per_support.c +ASN_MODULE_SRCS+=per_opentype.c +ASN_MODULE_HDRS+=uper_decoder.h +ASN_MODULE_HDRS+=uper_encoder.h +ASN_MODULE_HDRS+=uper_support.h +ASN_MODULE_HDRS+=uper_opentype.h +ASN_MODULE_SRCS+=uper_decoder.c +ASN_MODULE_SRCS+=uper_encoder.c +ASN_MODULE_SRCS+=uper_support.c +ASN_MODULE_SRCS+=uper_opentype.c +ASN_MODULE_SRCS+=ANY_uper.c +ASN_MODULE_SRCS+=BIT_STRING_uper.c +ASN_MODULE_SRCS+=BOOLEAN_uper.c +ASN_MODULE_SRCS+=INTEGER_uper.c +ASN_MODULE_SRCS+=NULL_uper.c +ASN_MODULE_SRCS+=NativeEnumerated_uper.c +ASN_MODULE_SRCS+=NativeInteger_uper.c +ASN_MODULE_SRCS+=NativeReal_uper.c +ASN_MODULE_SRCS+=OCTET_STRING_uper.c +ASN_MODULE_SRCS+=OPEN_TYPE_uper.c +ASN_MODULE_SRCS+=REAL_uper.c +ASN_MODULE_SRCS+=constr_CHOICE_uper.c +ASN_MODULE_SRCS+=constr_SEQUENCE_OF_uper.c +ASN_MODULE_SRCS+=constr_SEQUENCE_uper.c +ASN_MODULE_SRCS+=constr_SET_OF_uper.c +ASN_MODULE_HDRS+=aper_decoder.h +ASN_MODULE_HDRS+=aper_encoder.h +ASN_MODULE_HDRS+=aper_support.h +ASN_MODULE_HDRS+=aper_opentype.h +ASN_MODULE_SRCS+=aper_decoder.c +ASN_MODULE_SRCS+=aper_encoder.c +ASN_MODULE_SRCS+=aper_support.c +ASN_MODULE_SRCS+=aper_opentype.c +ASN_MODULE_SRCS+=ANY_aper.c +ASN_MODULE_SRCS+=BOOLEAN_aper.c +ASN_MODULE_SRCS+=INTEGER_aper.c +ASN_MODULE_SRCS+=NULL_aper.c +ASN_MODULE_SRCS+=NativeEnumerated_aper.c +ASN_MODULE_SRCS+=NativeInteger_aper.c +ASN_MODULE_SRCS+=NativeReal_aper.c +ASN_MODULE_SRCS+=OCTET_STRING_aper.c +ASN_MODULE_SRCS+=OPEN_TYPE_aper.c +ASN_MODULE_SRCS+=REAL_aper.c +ASN_MODULE_SRCS+=constr_CHOICE_aper.c +ASN_MODULE_SRCS+=constr_SEQUENCE_OF_aper.c +ASN_MODULE_SRCS+=constr_SEQUENCE_aper.c +ASN_MODULE_SRCS+=constr_SET_OF_aper.c +ASN_MODULE_SRCS+=BIT_STRING_print.c +ASN_MODULE_SRCS+=BOOLEAN_print.c +ASN_MODULE_SRCS+=INTEGER_print.c +ASN_MODULE_SRCS+=NULL_print.c +ASN_MODULE_SRCS+=NativeInteger_print.c +ASN_MODULE_SRCS+=NativeReal_print.c +ASN_MODULE_SRCS+=OBJECT_IDENTIFIER_print.c +ASN_MODULE_SRCS+=OCTET_STRING_print.c +ASN_MODULE_SRCS+=REAL_print.c +ASN_MODULE_SRCS+=constr_CHOICE_print.c +ASN_MODULE_SRCS+=constr_SEQUENCE_print.c +ASN_MODULE_SRCS+=constr_SET_OF_print.c +ASN_MODULE_HDRS+=asn_random_fill.h +ASN_MODULE_SRCS+=asn_random_fill.c +ASN_MODULE_SRCS+=BIT_STRING_rfill.c +ASN_MODULE_SRCS+=BOOLEAN_rfill.c +ASN_MODULE_SRCS+=INTEGER_rfill.c +ASN_MODULE_SRCS+=NULL_rfill.c +ASN_MODULE_SRCS+=NativeInteger_rfill.c +ASN_MODULE_SRCS+=NativeReal_rfill.c +ASN_MODULE_SRCS+=OBJECT_IDENTIFIER_rfill.c +ASN_MODULE_SRCS+=OCTET_STRING_rfill.c +ASN_MODULE_SRCS+=REAL_rfill.c +ASN_MODULE_SRCS+=constr_CHOICE_rfill.c +ASN_MODULE_SRCS+=constr_SEQUENCE_rfill.c +ASN_MODULE_SRCS+=constr_SET_OF_rfill.c +ASN_MODULE_HDRS+=jer_encoder.h +ASN_MODULE_SRCS+=jer_encoder.c +ASN_MODULE_SRCS+=ANY_jer.c +ASN_MODULE_SRCS+=BIT_STRING_jer.c +ASN_MODULE_SRCS+=BOOLEAN_jer.c +ASN_MODULE_SRCS+=INTEGER_jer.c +ASN_MODULE_SRCS+=NULL_jer.c +ASN_MODULE_SRCS+=NativeEnumerated_jer.c +ASN_MODULE_SRCS+=NativeInteger_jer.c +ASN_MODULE_SRCS+=NativeReal_jer.c +ASN_MODULE_SRCS+=OBJECT_IDENTIFIER_jer.c +ASN_MODULE_SRCS+=OCTET_STRING_jer.c +ASN_MODULE_SRCS+=REAL_jer.c +ASN_MODULE_SRCS+=constr_CHOICE_jer.c +ASN_MODULE_SRCS+=constr_SEQUENCE_OF_jer.c +ASN_MODULE_SRCS+=constr_SEQUENCE_jer.c +ASN_MODULE_SRCS+=constr_SET_OF_jer.c + +ASN_MODULE_CFLAGS= + +lib_LTLIBRARIES+=libasncodec.la +libasncodec_la_SOURCES=$(ASN_MODULE_SRCS) $(ASN_MODULE_HDRS) +libasncodec_la_CPPFLAGS=-I$(top_srcdir)/ +libasncodec_la_CFLAGS=$(ASN_MODULE_CFLAGS) +libasncodec_la_LDFLAGS=-lm diff --git a/e2sm/asn1/e2sm2_0.asn b/e2sm/asn1/e2sm2_0.asn new file mode 100644 index 0000000..0bb2e7e --- /dev/null +++ b/e2sm/asn1/e2sm2_0.asn @@ -0,0 +1,541 @@ +-- ASN1START +-- ************************************************************** +-- E2SM +-- Information Element Definitions +-- +-- ************************************************************** + +E2SM-COMMON-IEs { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version1 (1) e2sm(2) e2sm-COMMON-IEs (0)} + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- -------------------------------------------------- +-- Constants +-- -------------------------------------------------- + +maxE1APid INTEGER ::= 65535 +maxF1APid INTEGER ::= 4 + +-- IEs derived from 3GPP 36.423 (X2AP) +maxEARFCN INTEGER ::= 65535 + +-- IEs derived from 3GPP 38.473 (F1AP) +maxNRARFCN INTEGER ::= 3279165 +maxnoofNrCellBands INTEGER ::= 32 + + +-- -------------------------------------------------- +-- E2SM Commmon IEs +-- -------------------------------------------------- + +CGI ::= CHOICE { + nR-CGI NR-CGI, + eUTRA-CGI EUTRA-CGI, + ... +} + +CoreCPID ::= CHOICE { + fiveGC GUAMI, + ePC GUMMEI, + ... +} + +InterfaceIdentifier ::= CHOICE { + nG InterfaceID-NG, + xN InterfaceID-Xn, + f1 InterfaceID-F1, + e1 InterfaceID-E1, + s1 InterfaceID-S1, + x2 InterfaceID-X2, + w1 InterfaceID-W1, + ... +} + +InterfaceID-NG ::= SEQUENCE { + guami GUAMI, + ... +} + +InterfaceID-Xn ::= SEQUENCE { + global-NG-RAN-ID GlobalRANNodeID, + ... +} + +InterfaceID-F1 ::= SEQUENCE { + global-NG-RAN-ID GlobalRANNodeID, + gNB-DU-ID GNB-DU-ID, + ... +} + +InterfaceID-E1 ::= SEQUENCE { + global-NG-RAN-ID GlobalRANNodeID, + gNB-CU-UP-ID GNB-CU-UP-ID, + ... +} + +InterfaceID-S1 ::= SEQUENCE { + gUMMEI GUMMEI, + ... +} + +InterfaceID-X2 ::= SEQUENCE { + nodeType CHOICE { + global-eNB-ID GlobalENB-ID, + global-en-gNB-ID GlobalenGNB-ID, + ... + }, + ... +} + +InterfaceID-W1 ::= SEQUENCE { + global-ng-eNB-ID GlobalNgENB-ID, + ng-eNB-DU-ID NGENB-DU-ID, + ... +} + +Interface-MessageID ::= SEQUENCE { + interfaceProcedureID INTEGER, + messageType ENUMERATED {initiatingMessage, successfulOutcome, unsuccessfulOutcome, ...}, + ... +} + +InterfaceType ::= ENUMERATED {nG, xn, f1, e1, s1, x2, w1, ...} + +GroupID ::= CHOICE { + fiveGC FiveQI, + ePC QCI, + ... +} + +QoSID ::= CHOICE { + fiveGC FiveQI, + ePC QCI, + ... +} + +RANfunction-Name ::= SEQUENCE{ + ranFunction-ShortName PrintableString(SIZE(1..150,...)), + ranFunction-E2SM-OID PrintableString(SIZE(1..1000,...)), + ranFunction-Description PrintableString(SIZE(1..150,...)), + ranFunction-Instance INTEGER OPTIONAL, + ... +} + +RIC-Format-Type ::= INTEGER + +RIC-Style-Type ::= INTEGER + +RIC-Style-Name ::= PrintableString(SIZE(1..150,...)) + + +RRC-MessageID ::= SEQUENCE { + rrcType CHOICE { + lTE RRCclass-LTE, + nR RRCclass-NR, + ... + }, + messageID INTEGER, + ... +} + +RRCclass-LTE ::= ENUMERATED {bCCH-BCH, bCCH-BCH-MBMS, bCCH-DL-SCH, bCCH-DL-SCH-BR, bCCH-DL-SCH-MBMS, mCCH, pCCH, dL-CCCH, dL-DCCH, uL-CCCH, uL-DCCH, sC-MCCH, ...} + +RRCclass-NR ::= ENUMERATED {bCCH-BCH, bCCH-DL-SCH, dL-CCCH, dL-DCCH, pCCH, uL-CCCH, uL-CCCH1, uL-DCCH, ...} + +ServingCell-ARFCN ::= CHOICE { + nR NR-ARFCN, + eUTRA E-UTRA-ARFCN, + ... +} + +ServingCell-PCI ::= CHOICE { + nR NR-PCI, + eUTRA E-UTRA-PCI, + ... +} + + +UEID ::= CHOICE{ + gNB-UEID UEID-GNB, + gNB-DU-UEID UEID-GNB-DU, + gNB-CU-UP-UEID UEID-GNB-CU-UP, + ng-eNB-UEID UEID-NG-ENB, + ng-eNB-DU-UEID UEID-NG-ENB-DU, + en-gNB-UEID UEID-EN-GNB, + eNB-UEID UEID-ENB, + ... +} + +UEID-GNB ::= SEQUENCE{ + amf-UE-NGAP-ID AMF-UE-NGAP-ID, + guami GUAMI, + gNB-CU-UE-F1AP-ID-List UEID-GNB-CU-F1AP-ID-List OPTIONAL, +-- C-ifCUDUseparated: This IE shall be present only for a CU-DU separated gNB. More than 1 F1AP ID shall be reported only when NR-DC is established. + gNB-CU-CP-UE-E1AP-ID-List UEID-GNB-CU-CP-E1AP-ID-List OPTIONAL, +-- C-ifCPUPseparated: This IE shall be present only for a CP-UP separated gNB. + ran-UEID RANUEID OPTIONAL, + m-NG-RAN-UE-XnAP-ID NG-RANnodeUEXnAPID OPTIONAL, +-- C-ifDCSetup: This IE shall be present only if DC is established. To be reported by both MN and SN. + globalGNB-ID GlobalGNB-ID OPTIONAL, +-- C-ifDCSetup: This IE shall be present only if DC is established. To be reported only by SN. + ... +} + +UEID-GNB-CU-CP-E1AP-ID-List ::= SEQUENCE (SIZE(1..maxE1APid)) OF UEID-GNB-CU-CP-E1AP-ID-Item + +UEID-GNB-CU-CP-E1AP-ID-Item ::= SEQUENCE{ + gNB-CU-CP-UE-E1AP-ID GNB-CU-CP-UE-E1AP-ID, + ... +} + +UEID-GNB-CU-F1AP-ID-List ::= SEQUENCE (SIZE(1..maxF1APid)) OF UEID-GNB-CU-CP-F1AP-ID-Item + +UEID-GNB-CU-CP-F1AP-ID-Item ::= SEQUENCE{ + gNB-CU-UE-F1AP-ID GNB-CU-UE-F1AP-ID, + ... +} + +UEID-GNB-DU ::= SEQUENCE{ + gNB-CU-UE-F1AP-ID GNB-CU-UE-F1AP-ID, + ran-UEID RANUEID OPTIONAL, + ... +} + +UEID-GNB-CU-UP ::= SEQUENCE{ + gNB-CU-CP-UE-E1AP-ID GNB-CU-CP-UE-E1AP-ID, + ran-UEID RANUEID OPTIONAL, + ... +} + +UEID-NG-ENB ::= SEQUENCE{ + amf-UE-NGAP-ID AMF-UE-NGAP-ID, + guami GUAMI, + ng-eNB-CU-UE-W1AP-ID NGENB-CU-UE-W1AP-ID OPTIONAL, +-- C-ifCUDUseperated: This IE shall be present only for a CU-DU seperated ng-eNB. + m-NG-RAN-UE-XnAP-ID NG-RANnodeUEXnAPID OPTIONAL, +-- C-ifDCSetup: This IE shall be present only if DC is established. To be reported by both MN and SN. + globalNgENB-ID GlobalNgENB-ID OPTIONAL, +-- C-ifDCSetup: This IE shall be present only if DC is established. To be reported only by SN. + ... +} + + +UEID-NG-ENB-DU ::= SEQUENCE{ + ng-eNB-CU-UE-W1AP-ID NGENB-CU-UE-W1AP-ID, + ... +} + +UEID-EN-GNB ::= SEQUENCE{ + m-eNB-UE-X2AP-ID ENB-UE-X2AP-ID, + m-eNB-UE-X2AP-ID-Extension ENB-UE-X2AP-ID-Extension OPTIONAL, + globalENB-ID GlobalENB-ID, + gNB-CU-UE-F1AP-ID GNB-CU-UE-F1AP-ID OPTIONAL, +-- C-ifCUDUseperated: This IE shall be present only for a CU-DU seperated en-gNB. + gNB-CU-CP-UE-E1AP-ID-List UEID-GNB-CU-CP-E1AP-ID-List OPTIONAL, +-- C-ifCPUPseparated: This IE shall be present only for a CP-UP separated en-gNB. + ran-UEID RANUEID OPTIONAL, + ... +} + +UEID-ENB ::= SEQUENCE{ + mME-UE-S1AP-ID MME-UE-S1AP-ID, + gUMMEI GUMMEI, + m-eNB-UE-X2AP-ID ENB-UE-X2AP-ID OPTIONAL, +-- This IE shall be present only if DC is established. To be reported by MeNB and SeNB. + m-eNB-UE-X2AP-ID-Extension ENB-UE-X2AP-ID-Extension OPTIONAL, + globalENB-ID GlobalENB-ID OPTIONAL, +-- This IE shall be present only if DC is established. To be reported only by SeNB. + ... +} + +-- ************************************************************** +-- 3GPP derived IEs +-- ************************************************************** +-- NOTE: +-- - Extension fields removed and replaced with "..." +-- - IE names modified across all extracts to use "PLMNIdentity" + +-- ************************************************************** +-- IEs derived from 3GPP 36.413 (S1AP) +-- ************************************************************** +-- ************************************************************** + +-- copied from v16.5.0 +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 v16.5.0 +GlobalENB-ID ::= SEQUENCE { + pLMNIdentity PLMNIdentity, + eNB-ID ENB-ID, + ... +} + + +-- copied from v16.5.0 +GUMMEI ::= SEQUENCE { + pLMN-Identity PLMNIdentity, + mME-Group-ID MME-Group-ID, + mME-Code MME-Code, + ... +} + +-- copied from v16.5.0 +MME-Group-ID ::= OCTET STRING (SIZE (2)) + +-- copied from v16.5.0 +MME-Code ::= OCTET STRING (SIZE (1)) + +-- copied from v16.5.0 +MME-UE-S1AP-ID ::= INTEGER (0..4294967295) + +-- copied from v16.5.0 +QCI ::= INTEGER (0..255) + +-- copied from v16.5.0 +SubscriberProfileIDforRFP ::= INTEGER (1..256) + + + + +-- ************************************************************** +-- IEs derived from 3GPP 36.423 (X2AP) +-- ************************************************************** +-- Extension fields removed. +-- Note: to avoid duplicate names with NGAP, XnAP, etc.: +-- GNB-ID renamed ENGNB-ID, +-- GlobalGNB-ID renamed GlobalenGNB-ID, +-- UE-X2AP-ID renamed ENB-UE-X2AP-ID +-- UE-X2AP-ID-Extension renamed ENB-UE-X2AP-ID-Extension +-- ************************************************************** + +-- copied from v16.5.0 +EN-GNB-ID ::= CHOICE { + en-gNB-ID BIT STRING (SIZE (22..32)), + ... +} + +-- copied from v16.5.0 +ENB-UE-X2AP-ID ::= INTEGER (0..4095) + +-- copied from v16.5.0 +ENB-UE-X2AP-ID-Extension ::= INTEGER (0..4095, ...) + +-- copied from v16.5.0 +E-UTRA-ARFCN ::= INTEGER (0..maxEARFCN) + +-- copied from v16.5.0 +E-UTRA-PCI ::= INTEGER (0..503, ...) + +-- copied from v16.5.0 +E-UTRA-TAC ::= OCTET STRING (SIZE(2)) + +-- copied from v16.5.0 +GlobalenGNB-ID ::= SEQUENCE { + pLMN-Identity PLMNIdentity, + en-gNB-ID EN-GNB-ID, + ... +} + + + + + +-- ************************************************************** +-- IEs derived from 3GPP 37.473 (W1AP) +-- ************************************************************** + +-- copied from v16.3.0 +NGENB-CU-UE-W1AP-ID ::= INTEGER (0..4294967295) + +-- copied from v16.3.0 +NGENB-DU-ID ::= INTEGER (0..68719476735) + + + + + +-- ************************************************************** +-- IEs derived from 3GPP 38.413 (NGAP) +-- Extension fields removed and replaced with ... +-- ************************************************************** + +-- copied from v16.2.0 +AMFPointer ::= BIT STRING (SIZE(6)) + +-- copied from v16.2.0 +AMFRegionID ::= BIT STRING (SIZE(8)) + +-- copied from v16.2.0 +AMFSetID ::= BIT STRING (SIZE(10)) + +-- copied from v16.2.0 +AMF-UE-NGAP-ID ::= INTEGER (0..1099511627775) + +-- copied from v16.2.0 +EUTRACellIdentity ::= BIT STRING (SIZE(28)) + +-- copied from v16.2.0 +EUTRA-CGI ::= SEQUENCE { + pLMNIdentity PLMNIdentity, + eUTRACellIdentity EUTRACellIdentity, + ... +} + +-- copied from v16.2.0 +FiveQI ::= INTEGER (0..255, ...) + +-- copied from v16.2.0 +GlobalGNB-ID ::= SEQUENCE { + pLMNIdentity PLMNIdentity, + gNB-ID GNB-ID, + ... +} + +-- copied from v16.2.0 +GlobalNgENB-ID ::= SEQUENCE { + pLMNIdentity PLMNIdentity, + ngENB-ID NgENB-ID, + ... +} + +-- copied from v16.2.0 +GlobalRANNodeID ::= CHOICE { + globalGNB-ID GlobalGNB-ID, + globalNgENB-ID GlobalNgENB-ID, + ... +} + +-- copied from v16.2.0 +GNB-ID ::= CHOICE { + gNB-ID BIT STRING (SIZE(22..32)), + ... +} + +-- copied from v16.2.0 +GUAMI ::= SEQUENCE { + pLMNIdentity PLMNIdentity, + aMFRegionID AMFRegionID, + aMFSetID AMFSetID, + aMFPointer AMFPointer, + ... +} + +-- copied from v16.2.0 +IndexToRFSP ::= INTEGER (1..256, ...) + +-- copied from v16.2.0 +NgENB-ID ::= CHOICE { + macroNgENB-ID BIT STRING (SIZE(20)), + shortMacroNgENB-ID BIT STRING (SIZE(18)), + longMacroNgENB-ID BIT STRING (SIZE(21)), + ... +} + +-- copied from v16.2.0 +NRCellIdentity ::= BIT STRING (SIZE(36)) + +-- copied from v16.2.0 +NR-CGI ::= SEQUENCE { + pLMNIdentity PLMNIdentity, + nRCellIdentity NRCellIdentity, + ... +} + +-- copied from v16.2.0 +PLMNIdentity ::= OCTET STRING (SIZE(3)) + +-- copied from v16.2.0 +QosFlowIdentifier ::= INTEGER (0..63, ...) + +-- copied from v16.2.0 +SD ::= OCTET STRING (SIZE(3)) + +-- copied from v16.2.0 +S-NSSAI ::= SEQUENCE { + sST SST, + sD SD OPTIONAL, + ... +} + +-- copied from v16.2.0 +SST ::= OCTET STRING (SIZE(1)) + + + + + +-- ************************************************************** +-- IEs derived from 3GPP 38.423 (XnAP) +-- ************************************************************** + +-- copied from v16.2.0 +NG-RANnodeUEXnAPID ::= INTEGER (0.. 4294967295) + + + + + +-- ************************************************************** +-- IEs derived from 3GPP 38.463 (E1AP) +-- ************************************************************** + +-- copied from v16.5.0 +GNB-CU-CP-UE-E1AP-ID ::= INTEGER (0..4294967295) + +-- copied from v16.5.0 +GNB-CU-UP-ID ::= INTEGER (0..68719476735) + + + + + + +-- ************************************************************** +-- IEs derived from 3GPP 38.473 (F1AP) +-- ************************************************************** + +-- copied from v16.5.0 +FiveGS-TAC ::= OCTET STRING (SIZE(3)) + +-- copied from v16.5.0 +GNB-CU-UE-F1AP-ID ::= INTEGER (0..4294967295) + +-- copied from v16.5.0 +GNB-DU-ID ::= INTEGER (0..68719476735) + +-- copied from v16.5.0 +NR-PCI ::= INTEGER (0..1007) + +-- copied from v16.5.0 +NR-ARFCN ::= SEQUENCE { + nRARFCN INTEGER (0..maxNRARFCN), + freqBandListNr SEQUENCE (SIZE(1..maxnoofNrCellBands)) OF FreqBandNrItem, + ... +} + +-- copied from v16.5.0 +FreqBandNrItem ::= SEQUENCE { + freqBandIndicatorNr INTEGER (1..1024, ...), + ... +} + +-- copied from v16.5.0 +RANUEID ::= OCTET STRING (SIZE (8)) + + + + + + +END +-- ASN1STOP + diff --git a/e2sm/asn1/kpm2_0.asn b/e2sm/asn1/kpm2_0.asn new file mode 100644 index 0000000..f9d812d --- /dev/null +++ b/e2sm/asn1/kpm2_0.asn @@ -0,0 +1,327 @@ +-- ASN1START +-- ************************************************************** +-- E2SM-KPM Information Element Definitions +-- ************************************************************** + +E2SM-KPM-IEs { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) oran(53148) e2(1) version2(2) e2sm(2) e2sm-KPMMON-IEs (2)} + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- ************************************************************** +-- IEs +-- ************************************************************** + +IMPORTS + CGI, + FiveQI, + PLMNIdentity, + QCI, + QosFlowIdentifier, + RANfunction-Name, + RIC-Format-Type, + RIC-Style-Name, + RIC-Style-Type, + S-NSSAI, + UEID +FROM E2SM-COMMON-IEs; + +TimeStamp ::= OCTET STRING (SIZE(4)) + +GranularityPeriod ::= INTEGER (1.. 4294967295) + +MeasurementType ::= CHOICE { + measName MeasurementTypeName, + measID MeasurementTypeID, + ... +} + +MeasurementTypeName ::= PrintableString(SIZE(1.. 150, ...)) + +MeasurementTypeID ::= INTEGER (1.. 65536, ...) + +MeasurementLabel ::= SEQUENCE { + noLabel ENUMERATED {true, ...} OPTIONAL, + plmnID PLMNIdentity OPTIONAL, + sliceID S-NSSAI OPTIONAL, + fiveQI FiveQI OPTIONAL, + qFI QosFlowIdentifier OPTIONAL, + qCI QCI OPTIONAL, + qCImax QCI OPTIONAL, + qCImin QCI OPTIONAL, + aRPmax INTEGER (1.. 15, ...) OPTIONAL, + aRPmin INTEGER (1.. 15, ...) OPTIONAL, + bitrateRange INTEGER (1.. 65535, ...) OPTIONAL, + layerMU-MIMO INTEGER (1.. 65535, ...) OPTIONAL, + sUM ENUMERATED {true, ...} OPTIONAL, + distBinX INTEGER (1.. 65535, ...) OPTIONAL, + distBinY INTEGER (1.. 65535, ...) OPTIONAL, + distBinZ INTEGER (1.. 65535, ...) OPTIONAL, + preLabelOverride ENUMERATED {true, ...} OPTIONAL, + startEndInd ENUMERATED {start, end, ...} OPTIONAL, + min ENUMERATED {true, ...} OPTIONAL, + max ENUMERATED {true, ...} OPTIONAL, + avg ENUMERATED {true, ...} OPTIONAL, + ... +} + +TestCondInfo ::= SEQUENCE{ + testType TestCond-Type, + testExpr TestCond-Expression, + testValue TestCond-Value, + ... +} + +TestCond-Type ::= CHOICE{ + gBR ENUMERATED {true, ...}, + aMBR ENUMERATED {true, ...}, + isStat ENUMERATED {true, ...}, + isCatM ENUMERATED {true, ...}, + rSRP ENUMERATED {true, ...}, + rSRQ ENUMERATED {true, ...}, + ... +} + +TestCond-Expression ::= ENUMERATED { +equal, +greaterthan, +lessthan, +contains, +present, +... +} + +TestCond-Value ::= CHOICE{ + valueInt INTEGER, + valueEnum INTEGER, + valueBool BOOLEAN, + valueBitS BIT STRING, + valueOctS OCTET STRING, + valuePrtS PrintableString, + ... +} + +-- ************************************************************** +-- Lists +-- ************************************************************** + +maxnoofCells INTEGER ::= 16384 +maxnoofRICStyles INTEGER ::= 63 +maxnoofMeasurementInfo INTEGER ::= 65535 +maxnoofLabelInfo INTEGER ::= 2147483647 +maxnoofMeasurementRecord INTEGER ::= 65535 +maxnoofMeasurementValue INTEGER ::= 2147483647 +maxnoofConditionInfo INTEGER ::= 32768 +maxnoofUEID INTEGER ::= 65535 + + +MeasurementInfoList ::= SEQUENCE (SIZE(1..maxnoofMeasurementInfo)) OF MeasurementInfoItem + +MeasurementInfoItem ::= SEQUENCE { + measType MeasurementType, + labelInfoList LabelInfoList, + ... +} + +LabelInfoList ::= SEQUENCE (SIZE(1..maxnoofLabelInfo)) OF LabelInfoItem + +LabelInfoItem ::= SEQUENCE { + measLabel MeasurementLabel, + ... +} + +MeasurementData ::= SEQUENCE (SIZE(1..maxnoofMeasurementRecord)) OF MeasurementDataItem + +MeasurementDataItem ::= SEQUENCE { +measRecord MeasurementRecord, +incompleteFlag ENUMERATED {true, ...} OPTIONAL, +... +} + +MeasurementRecord ::= SEQUENCE (SIZE(1..maxnoofMeasurementValue)) OF MeasurementRecordItem + +MeasurementRecordItem ::= CHOICE { + integer INTEGER (0.. 4294967295), + real REAL, + noValue NULL, + ... +} + +MeasurementInfo-Action-List ::= SEQUENCE (SIZE(1..maxnoofMeasurementInfo)) OF MeasurementInfo-Action-Item + +MeasurementInfo-Action-Item ::= SEQUENCE { + measName MeasurementTypeName, + measID MeasurementTypeID OPTIONAL, + ... +} + +MeasurementCondList ::= SEQUENCE (SIZE(1..maxnoofMeasurementInfo)) OF MeasurementCondItem + +MeasurementCondItem ::= SEQUENCE { + measType MeasurementType, + matchingCond MatchingCondList, + ... +} + +MeasurementCondUEidList ::= SEQUENCE (SIZE(1..maxnoofMeasurementInfo)) OF MeasurementCondUEidItem + +MeasurementCondUEidItem ::= SEQUENCE { + measType MeasurementType, + matchingCond MatchingCondList, + matchingUEidList MatchingUEidList OPTIONAL, + ... +} + +MatchingCondList ::= SEQUENCE (SIZE(1..maxnoofConditionInfo)) OF MatchingCondItem + +MatchingCondItem ::= CHOICE{ + measLabel MeasurementLabel, + testCondInfo TestCondInfo, + ... +} + +MatchingUEidList ::= SEQUENCE (SIZE(1..maxnoofUEID)) OF MatchingUEidItem + +MatchingUEidItem ::= SEQUENCE{ + ueID UEID, + ... +} + +-- ************************************************************** +-- E2SM-KPM Service Model IEs +-- ************************************************************** + +-- ************************************************************** +-- Event Trigger Definition OCTET STRING contents +-- ************************************************************** + +E2SM-KPM-EventTriggerDefinition ::= SEQUENCE{ + eventDefinition-formats CHOICE{ + eventDefinition-Format1 E2SM-KPM-EventTriggerDefinition-Format1, + ... + }, + ... +} + +E2SM-KPM-EventTriggerDefinition-Format1 ::= SEQUENCE{ + reportingPeriod INTEGER (1.. 4294967295), + ... +} + +-- ************************************************************** +-- Action Definition OCTET STRING contents +-- ************************************************************** + +E2SM-KPM-ActionDefinition ::= SEQUENCE{ + ric-Style-Type RIC-Style-Type, + actionDefinition-formats CHOICE{ + actionDefinition-Format1 E2SM-KPM-ActionDefinition-Format1, + actionDefinition-Format2 E2SM-KPM-ActionDefinition-Format2, + actionDefinition-Format3 E2SM-KPM-ActionDefinition-Format3, + ... + }, + ... +} + +E2SM-KPM-ActionDefinition-Format1 ::= SEQUENCE { + measInfoList MeasurementInfoList, + granulPeriod GranularityPeriod, + cellGlobalID CGI OPTIONAL, + ... +} + +E2SM-KPM-ActionDefinition-Format2 ::= SEQUENCE { + ueID UEID, + subscriptInfo E2SM-KPM-ActionDefinition-Format1, + ... +} + +E2SM-KPM-ActionDefinition-Format3 ::= SEQUENCE { + measCondList MeasurementCondList, + granulPeriod GranularityPeriod, + cellGlobalID CGI OPTIONAL, + ... +} + +-- ************************************************************** +-- Indication Header OCTET STRING contents +-- ************************************************************** + +E2SM-KPM-IndicationHeader ::= SEQUENCE{ + indicationHeader-formats CHOICE{ + indicationHeader-Format1 E2SM-KPM-IndicationHeader-Format1, + ... + }, + ... +} + +E2SM-KPM-IndicationHeader-Format1 ::= SEQUENCE{ + colletStartTime TimeStamp, + fileFormatversion PrintableString (SIZE (0..15), ...) OPTIONAL, + senderName PrintableString (SIZE (0..400), ...) OPTIONAL, + senderType PrintableString (SIZE (0..8), ...) OPTIONAL, + vendorName PrintableString (SIZE (0..32), ...) OPTIONAL, + ... +} + +-- ************************************************************** +-- Indication Message OCTET STRING contents +-- ************************************************************** + +E2SM-KPM-IndicationMessage ::= SEQUENCE{ + indicationMessage-formats CHOICE{ + indicationMessage-Format1 E2SM-KPM-IndicationMessage-Format1, + indicationMessage-Format2 E2SM-KPM-IndicationMessage-Format2, + ... + }, + ... +} + +E2SM-KPM-IndicationMessage-Format1 ::= SEQUENCE { + measData MeasurementData, + measInfoList MeasurementInfoList OPTIONAL, + granulPeriod GranularityPeriod OPTIONAL, + ... +} + +E2SM-KPM-IndicationMessage-Format2 ::= SEQUENCE { + measData MeasurementData, + measCondUEidList MeasurementCondUEidList, + granulPeriod GranularityPeriod OPTIONAL, + ... +} + +-- *************************************************************** +-- RAN Function Definition OCTET STRING contents +-- *************************************************************** + +E2SM-KPM-RANfunction-Description ::= SEQUENCE{ + ranFunction-Name RANfunction-Name, + ric-EventTriggerStyle-List SEQUENCE (SIZE(1..maxnoofRICStyles)) OF RIC-EventTriggerStyle-Item OPTIONAL, + ric-ReportStyle-List SEQUENCE (SIZE(1..maxnoofRICStyles)) OF RIC-ReportStyle-Item OPTIONAL, + ... +} + +RIC-EventTriggerStyle-Item ::= SEQUENCE{ + ric-EventTriggerStyle-Type RIC-Style-Type, + ric-EventTriggerStyle-Name RIC-Style-Name, + ric-EventTriggerFormat-Type RIC-Format-Type, + ... +} + +RIC-ReportStyle-Item ::= SEQUENCE{ + ric-ReportStyle-Type RIC-Style-Type, + ric-ReportStyle-Name RIC-Style-Name, + ric-ActionFormat-Type RIC-Format-Type, + measInfo-Action-List MeasurementInfo-Action-List, + ric-IndicationHeaderFormat-Type RIC-Format-Type, + ric-IndicationMessageFormat-Type RIC-Format-Type, + ... +} + +END + +-- ASN1STOP + diff --git a/e2sm/headers/AMF-UE-NGAP-ID.h b/e2sm/headers/AMF-UE-NGAP-ID.h index f7c3430..0d7a390 100644 --- a/e2sm/headers/AMF-UE-NGAP-ID.h +++ b/e2sm/headers/AMF-UE-NGAP-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _AMF_UE_NGAP_ID_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f AMF_UE_NGAP_ID_decode_ber; der_type_encoder_f AMF_UE_NGAP_ID_encode_der; xer_type_decoder_f AMF_UE_NGAP_ID_decode_xer; xer_type_encoder_f AMF_UE_NGAP_ID_encode_xer; +jer_type_encoder_f AMF_UE_NGAP_ID_encode_jer; +oer_type_decoder_f AMF_UE_NGAP_ID_decode_oer; +oer_type_encoder_f AMF_UE_NGAP_ID_encode_oer; per_type_decoder_f AMF_UE_NGAP_ID_decode_uper; per_type_encoder_f AMF_UE_NGAP_ID_encode_uper; per_type_decoder_f AMF_UE_NGAP_ID_decode_aper; diff --git a/e2sm/headers/AMFPointer.h b/e2sm/headers/AMFPointer.h index 18c18e2..08ebefa 100644 --- a/e2sm/headers/AMFPointer.h +++ b/e2sm/headers/AMFPointer.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _AMFPointer_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f AMFPointer_decode_ber; der_type_encoder_f AMFPointer_encode_der; xer_type_decoder_f AMFPointer_decode_xer; xer_type_encoder_f AMFPointer_encode_xer; +jer_type_encoder_f AMFPointer_encode_jer; +oer_type_decoder_f AMFPointer_decode_oer; +oer_type_encoder_f AMFPointer_encode_oer; per_type_decoder_f AMFPointer_decode_uper; per_type_encoder_f AMFPointer_encode_uper; per_type_decoder_f AMFPointer_decode_aper; diff --git a/e2sm/headers/AMFRegionID.h b/e2sm/headers/AMFRegionID.h index eb94a4b..252eb11 100644 --- a/e2sm/headers/AMFRegionID.h +++ b/e2sm/headers/AMFRegionID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _AMFRegionID_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f AMFRegionID_decode_ber; der_type_encoder_f AMFRegionID_encode_der; xer_type_decoder_f AMFRegionID_decode_xer; xer_type_encoder_f AMFRegionID_encode_xer; +jer_type_encoder_f AMFRegionID_encode_jer; +oer_type_decoder_f AMFRegionID_decode_oer; +oer_type_encoder_f AMFRegionID_encode_oer; per_type_decoder_f AMFRegionID_decode_uper; per_type_encoder_f AMFRegionID_encode_uper; per_type_decoder_f AMFRegionID_decode_aper; diff --git a/e2sm/headers/AMFSetID.h b/e2sm/headers/AMFSetID.h index 6d8c6aa..ce3f2e6 100644 --- a/e2sm/headers/AMFSetID.h +++ b/e2sm/headers/AMFSetID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _AMFSetID_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f AMFSetID_decode_ber; der_type_encoder_f AMFSetID_encode_der; xer_type_decoder_f AMFSetID_decode_xer; xer_type_encoder_f AMFSetID_encode_xer; +jer_type_encoder_f AMFSetID_encode_jer; +oer_type_decoder_f AMFSetID_decode_oer; +oer_type_encoder_f AMFSetID_encode_oer; per_type_decoder_f AMFSetID_decode_uper; per_type_encoder_f AMFSetID_encode_uper; per_type_decoder_f AMFSetID_decode_aper; diff --git a/e2sm/headers/ANY.h b/e2sm/headers/ANY.h index b30381f..871ed5e 100644 --- a/e2sm/headers/ANY.h +++ b/e2sm/headers/ANY.h @@ -22,23 +22,38 @@ extern asn_TYPE_descriptor_t asn_DEF_ANY; extern asn_TYPE_operation_t asn_OP_ANY; extern asn_OCTET_STRING_specifics_t asn_SPC_ANY_specs; -asn_struct_free_f ANY_free; -asn_struct_print_f ANY_print; -ber_type_decoder_f ANY_decode_ber; -der_type_encoder_f ANY_encode_der; +#define ANY_free OCTET_STRING_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define ANY_print OCTET_STRING_print +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define ANY_compare OCTET_STRING_compare + +#define ANY_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define ANY_decode_ber OCTET_STRING_decode_ber +#define ANY_encode_der OCTET_STRING_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define ANY_decode_xer OCTET_STRING_decode_xer_hex xer_type_encoder_f ANY_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f ANY_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f ANY_decode_uper; per_type_encoder_f ANY_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f ANY_decode_aper; per_type_encoder_f ANY_encode_aper; - -#define ANY_free OCTET_STRING_free -#define ANY_print OCTET_STRING_print -#define ANY_compare OCTET_STRING_compare -#define ANY_constraint asn_generic_no_constraint -#define ANY_decode_ber OCTET_STRING_decode_ber -#define ANY_encode_der OCTET_STRING_encode_der -#define ANY_decode_xer OCTET_STRING_decode_xer_hex +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ /****************************** * Handy conversion routines. * @@ -46,13 +61,17 @@ per_type_encoder_f ANY_encode_aper; /* Convert another ASN.1 type into the ANY. This implies DER encoding. */ int ANY_fromType(ANY_t *, asn_TYPE_descriptor_t *td, void *struct_ptr); -int ANY_fromType_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr); ANY_t *ANY_new_fromType(asn_TYPE_descriptor_t *td, void *struct_ptr); +#if !defined(ASN_DISABLE_APER_SUPPORT) +int ANY_fromType_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr); ANY_t *ANY_new_fromType_aper(asn_TYPE_descriptor_t *td, void *sptr); +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ /* Convert the contents of the ANY type into the specified type. */ int ANY_to_type(ANY_t *, asn_TYPE_descriptor_t *td, void **struct_ptr); +#if !defined(ASN_DISABLE_APER_SUPPORT) int ANY_to_type_aper(ANY_t *, asn_TYPE_descriptor_t *td, void **struct_ptr); +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ #define ANY_fromBuf(s, buf, size) OCTET_STRING_fromBuf((s), (buf), (size)) #define ANY_new_fromBuf(buf, size) OCTET_STRING_new_fromBuf( \ diff --git a/e2sm/headers/BIT_STRING.h b/e2sm/headers/BIT_STRING.h index c1bdbbc..e755fe9 100644 --- a/e2sm/headers/BIT_STRING.h +++ b/e2sm/headers/BIT_STRING.h @@ -24,22 +24,49 @@ 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 */ +#define BIT_STRING_free OCTET_STRING_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +asn_struct_print_f BIT_STRING_print; /* Human-readable output */ +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f BIT_STRING_compare; + asn_constr_check_f BIT_STRING_constraint; + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define BIT_STRING_decode_ber OCTET_STRING_decode_ber +#define BIT_STRING_encode_der OCTET_STRING_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define BIT_STRING_decode_xer OCTET_STRING_decode_xer_binary xer_type_encoder_f BIT_STRING_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f BIT_STRING_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f BIT_STRING_decode_oer; oer_type_encoder_f BIT_STRING_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) 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 +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define BIT_STRING_decode_aper OCTET_STRING_decode_aper +#define BIT_STRING_encode_aper OCTET_STRING_encode_aper +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f BIT_STRING_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +const BIT_STRING_t *BIT_STRING__compactify(const BIT_STRING_t *st, BIT_STRING_t *tmp); #ifdef __cplusplus } diff --git a/e2sm/headers/BMPString.h b/e2sm/headers/BMPString.h deleted file mode 100644 index af14588..0000000 --- a/e2sm/headers/BMPString.h +++ /dev/null @@ -1,39 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _BMPString_H_ -#define _BMPString_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t BMPString_t; /* Implemented via OCTET STRING */ - -extern asn_TYPE_descriptor_t asn_DEF_BMPString; -extern asn_TYPE_operation_t asn_OP_BMPString; -extern asn_OCTET_STRING_specifics_t asn_SPC_BMPString_specs; - -asn_struct_print_f BMPString_print; /* Human-readable output */ -asn_constr_check_f BMPString_constraint; -xer_type_decoder_f BMPString_decode_xer; -xer_type_encoder_f BMPString_encode_xer; - -#define BMPString_free OCTET_STRING_free -#define BMPString_print BMPString_print -#define BMPString_compare OCTET_STRING_compare -#define BMPString_decode_ber OCTET_STRING_decode_ber -#define BMPString_encode_der OCTET_STRING_encode_der -#define BMPString_decode_uper OCTET_STRING_decode_uper -#define BMPString_encode_uper OCTET_STRING_encode_uper -#define BMPString_decode_aper OCTET_STRING_decode_aper -#define BMPString_encode_aper OCTET_STRING_encode_aper - -#ifdef __cplusplus -} -#endif - -#endif /* _BMPString_H_ */ diff --git a/e2sm/headers/BOOLEAN.h b/e2sm/headers/BOOLEAN.h index 620acf7..2cbbe71 100644 --- a/e2sm/headers/BOOLEAN.h +++ b/e2sm/headers/BOOLEAN.h @@ -16,27 +16,52 @@ extern "C" { * non-zero is capped to 0xff by the DER encoder. The BER decoder may * yield non-zero values different from 1, beware. */ -typedef int BOOLEAN_t; +typedef unsigned BOOLEAN_t; extern asn_TYPE_descriptor_t asn_DEF_BOOLEAN; extern asn_TYPE_operation_t asn_OP_BOOLEAN; asn_struct_free_f BOOLEAN_free; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f BOOLEAN_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f BOOLEAN_compare; + +#define BOOLEAN_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f BOOLEAN_decode_ber; der_type_encoder_f BOOLEAN_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +xer_type_decoder_f BOOLEAN_decode_xer; +xer_type_encoder_f BOOLEAN_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f BOOLEAN_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f BOOLEAN_decode_oer; oer_type_encoder_f BOOLEAN_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f BOOLEAN_decode_uper; per_type_encoder_f BOOLEAN_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f BOOLEAN_decode_aper; per_type_encoder_f BOOLEAN_encode_aper; -xer_type_decoder_f BOOLEAN_decode_xer; -xer_type_encoder_f BOOLEAN_encode_xer; -asn_random_fill_f BOOLEAN_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ -#define BOOLEAN_constraint asn_generic_no_constraint +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f BOOLEAN_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2sm/headers/C-RNTI.h b/e2sm/headers/C-RNTI.h deleted file mode 100644 index 55f2595..0000000 --- a/e2sm/headers/C-RNTI.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _C_RNTI_H_ -#define _C_RNTI_H_ - - -#include - -/* Including external dependencies */ -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* C-RNTI */ -typedef OCTET_STRING_t C_RNTI_t; - -/* Implementation */ -extern asn_per_constraints_t asn_PER_type_C_RNTI_constr_1; -extern asn_TYPE_descriptor_t asn_DEF_C_RNTI; -asn_struct_free_f C_RNTI_free; -asn_struct_print_f C_RNTI_print; -asn_constr_check_f C_RNTI_constraint; -ber_type_decoder_f C_RNTI_decode_ber; -der_type_encoder_f C_RNTI_encode_der; -xer_type_decoder_f C_RNTI_decode_xer; -xer_type_encoder_f C_RNTI_encode_xer; -oer_type_decoder_f C_RNTI_decode_oer; -oer_type_encoder_f C_RNTI_encode_oer; -per_type_decoder_f C_RNTI_decode_uper; -per_type_encoder_f C_RNTI_encode_uper; -per_type_decoder_f C_RNTI_decode_aper; -per_type_encoder_f C_RNTI_encode_aper; - -#ifdef __cplusplus -} -#endif - -#endif /* _C_RNTI_H_ */ -#include diff --git a/e2sm/headers/CGI.h b/e2sm/headers/CGI.h index 521428d..85e4a3b 100644 --- a/e2sm/headers/CGI.h +++ b/e2sm/headers/CGI.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _CGI_H_ diff --git a/e2sm/headers/CU-CP-Usage-Report-CellResourceReportItem.h b/e2sm/headers/CU-CP-Usage-Report-CellResourceReportItem.h deleted file mode 100644 index c0e619e..0000000 --- a/e2sm/headers/CU-CP-Usage-Report-CellResourceReportItem.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _CU_CP_Usage_Report_CellResourceReportItem_H_ -#define _CU_CP_Usage_Report_CellResourceReportItem_H_ - - -#include - -/* Including external dependencies */ -#include "NRCGI.h" -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Forward declarations */ -struct CU_CP_Usage_Report_UeResourceReportItem; - -/* CU-CP-Usage-Report-CellResourceReportItem */ -typedef struct CU_CP_Usage_Report_CellResourceReportItem { - NRCGI_t nRCGI; - struct CU_CP_Usage_Report_CellResourceReportItem__ueResourceReportList { - A_SEQUENCE_OF(struct CU_CP_Usage_Report_UeResourceReportItem) list; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; - } ueResourceReportList; - /* - * This type is extensible, - * possible extensions are below. - */ - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} CU_CP_Usage_Report_CellResourceReportItem_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_CU_CP_Usage_Report_CellResourceReportItem; -extern asn_SEQUENCE_specifics_t asn_SPC_CU_CP_Usage_Report_CellResourceReportItem_specs_1; -extern asn_TYPE_member_t asn_MBR_CU_CP_Usage_Report_CellResourceReportItem_1[2]; - -#ifdef __cplusplus -} -#endif - -#endif /* _CU_CP_Usage_Report_CellResourceReportItem_H_ */ -#include diff --git a/e2sm/headers/CU-CP-Usage-Report-Per-UE.h b/e2sm/headers/CU-CP-Usage-Report-Per-UE.h deleted file mode 100644 index d32aab2..0000000 --- a/e2sm/headers/CU-CP-Usage-Report-Per-UE.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _CU_CP_Usage_Report_Per_UE_H_ -#define _CU_CP_Usage_Report_Per_UE_H_ - - -#include - -/* Including external dependencies */ -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Forward declarations */ -struct CU_CP_Usage_Report_CellResourceReportItem; - -/* CU-CP-Usage-Report-Per-UE */ -typedef struct CU_CP_Usage_Report_Per_UE { - struct CU_CP_Usage_Report_Per_UE__cellResourceReportList { - A_SEQUENCE_OF(struct CU_CP_Usage_Report_CellResourceReportItem) 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; -} CU_CP_Usage_Report_Per_UE_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_CU_CP_Usage_Report_Per_UE; -extern asn_SEQUENCE_specifics_t asn_SPC_CU_CP_Usage_Report_Per_UE_specs_1; -extern asn_TYPE_member_t asn_MBR_CU_CP_Usage_Report_Per_UE_1[1]; - -#ifdef __cplusplus -} -#endif - -#endif /* _CU_CP_Usage_Report_Per_UE_H_ */ -#include diff --git a/e2sm/headers/CU-CP-Usage-Report-UeResourceReportItem.h b/e2sm/headers/CU-CP-Usage-Report-UeResourceReportItem.h deleted file mode 100644 index 2b018da..0000000 --- a/e2sm/headers/CU-CP-Usage-Report-UeResourceReportItem.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _CU_CP_Usage_Report_UeResourceReportItem_H_ -#define _CU_CP_Usage_Report_UeResourceReportItem_H_ - - -#include - -/* Including external dependencies */ -#include "C-RNTI.h" -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* CU-CP-Usage-Report-UeResourceReportItem */ -typedef struct CU_CP_Usage_Report_UeResourceReportItem { - C_RNTI_t c_RNTI; - OCTET_STRING_t *serving_Cell_RF_Type; /* OPTIONAL */ - OCTET_STRING_t *neighbor_Cell_RF; /* OPTIONAL */ - /* - * This type is extensible, - * possible extensions are below. - */ - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} CU_CP_Usage_Report_UeResourceReportItem_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_CU_CP_Usage_Report_UeResourceReportItem; -extern asn_SEQUENCE_specifics_t asn_SPC_CU_CP_Usage_Report_UeResourceReportItem_specs_1; -extern asn_TYPE_member_t asn_MBR_CU_CP_Usage_Report_UeResourceReportItem_1[3]; - -#ifdef __cplusplus -} -#endif - -#endif /* _CU_CP_Usage_Report_UeResourceReportItem_H_ */ -#include diff --git a/e2sm/headers/CU-UP-Usage-Report-CellResourceReportItem.h b/e2sm/headers/CU-UP-Usage-Report-CellResourceReportItem.h deleted file mode 100644 index ab4b7b8..0000000 --- a/e2sm/headers/CU-UP-Usage-Report-CellResourceReportItem.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _CU_UP_Usage_Report_CellResourceReportItem_H_ -#define _CU_UP_Usage_Report_CellResourceReportItem_H_ - - -#include - -/* Including external dependencies */ -#include "NRCGI.h" -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Forward declarations */ -struct CU_UP_Usage_Report_UeResourceReportItem; - -/* CU-UP-Usage-Report-CellResourceReportItem */ -typedef struct CU_UP_Usage_Report_CellResourceReportItem { - NRCGI_t nRCGI; - struct CU_UP_Usage_Report_CellResourceReportItem__ueResourceReportList { - A_SEQUENCE_OF(struct CU_UP_Usage_Report_UeResourceReportItem) list; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; - } ueResourceReportList; - /* - * This type is extensible, - * possible extensions are below. - */ - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} CU_UP_Usage_Report_CellResourceReportItem_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_CU_UP_Usage_Report_CellResourceReportItem; -extern asn_SEQUENCE_specifics_t asn_SPC_CU_UP_Usage_Report_CellResourceReportItem_specs_1; -extern asn_TYPE_member_t asn_MBR_CU_UP_Usage_Report_CellResourceReportItem_1[2]; - -#ifdef __cplusplus -} -#endif - -#endif /* _CU_UP_Usage_Report_CellResourceReportItem_H_ */ -#include diff --git a/e2sm/headers/CU-UP-Usage-Report-Per-UE.h b/e2sm/headers/CU-UP-Usage-Report-Per-UE.h deleted file mode 100644 index f944abf..0000000 --- a/e2sm/headers/CU-UP-Usage-Report-Per-UE.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _CU_UP_Usage_Report_Per_UE_H_ -#define _CU_UP_Usage_Report_Per_UE_H_ - - -#include - -/* Including external dependencies */ -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Forward declarations */ -struct CU_UP_Usage_Report_CellResourceReportItem; - -/* CU-UP-Usage-Report-Per-UE */ -typedef struct CU_UP_Usage_Report_Per_UE { - struct CU_UP_Usage_Report_Per_UE__cellResourceReportList { - A_SEQUENCE_OF(struct CU_UP_Usage_Report_CellResourceReportItem) 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; -} CU_UP_Usage_Report_Per_UE_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_CU_UP_Usage_Report_Per_UE; -extern asn_SEQUENCE_specifics_t asn_SPC_CU_UP_Usage_Report_Per_UE_specs_1; -extern asn_TYPE_member_t asn_MBR_CU_UP_Usage_Report_Per_UE_1[1]; - -#ifdef __cplusplus -} -#endif - -#endif /* _CU_UP_Usage_Report_Per_UE_H_ */ -#include diff --git a/e2sm/headers/CU-UP-Usage-Report-UeResourceReportItem.h b/e2sm/headers/CU-UP-Usage-Report-UeResourceReportItem.h deleted file mode 100644 index 07b5348..0000000 --- a/e2sm/headers/CU-UP-Usage-Report-UeResourceReportItem.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _CU_UP_Usage_Report_UeResourceReportItem_H_ -#define _CU_UP_Usage_Report_UeResourceReportItem_H_ - - -#include - -/* Including external dependencies */ -#include "C-RNTI.h" -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* CU-UP-Usage-Report-UeResourceReportItem */ -typedef struct CU_UP_Usage_Report_UeResourceReportItem { - C_RNTI_t c_RNTI; - 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; -} CU_UP_Usage_Report_UeResourceReportItem_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_CU_UP_Usage_Report_UeResourceReportItem; -extern asn_SEQUENCE_specifics_t asn_SPC_CU_UP_Usage_Report_UeResourceReportItem_specs_1; -extern asn_TYPE_member_t asn_MBR_CU_UP_Usage_Report_UeResourceReportItem_1[3]; - -#ifdef __cplusplus -} -#endif - -#endif /* _CU_UP_Usage_Report_UeResourceReportItem_H_ */ -#include diff --git a/e2sm/headers/CUUPMeasurement-Container.h b/e2sm/headers/CUUPMeasurement-Container.h deleted file mode 100644 index 32d51b0..0000000 --- a/e2sm/headers/CUUPMeasurement-Container.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/CellResourceReportListItem.h b/e2sm/headers/CellResourceReportListItem.h deleted file mode 100644 index 8fa5613..0000000 --- a/e2sm/headers/CellResourceReportListItem.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/CoreCPID.h b/e2sm/headers/CoreCPID.h index 64ff363..d41f85b 100644 --- a/e2sm/headers/CoreCPID.h +++ b/e2sm/headers/CoreCPID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _CoreCPID_H_ diff --git a/e2sm/headers/DU-Usage-Report-CellResourceReportItem.h b/e2sm/headers/DU-Usage-Report-CellResourceReportItem.h deleted file mode 100644 index bbf14c4..0000000 --- a/e2sm/headers/DU-Usage-Report-CellResourceReportItem.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _DU_Usage_Report_CellResourceReportItem_H_ -#define _DU_Usage_Report_CellResourceReportItem_H_ - - -#include - -/* Including external dependencies */ -#include "NRCGI.h" -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Forward declarations */ -struct DU_Usage_Report_UeResourceReportItem; - -/* DU-Usage-Report-CellResourceReportItem */ -typedef struct DU_Usage_Report_CellResourceReportItem { - NRCGI_t nRCGI; - struct DU_Usage_Report_CellResourceReportItem__ueResourceReportList { - A_SEQUENCE_OF(struct DU_Usage_Report_UeResourceReportItem) list; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; - } ueResourceReportList; - /* - * This type is extensible, - * possible extensions are below. - */ - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} DU_Usage_Report_CellResourceReportItem_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_DU_Usage_Report_CellResourceReportItem; -extern asn_SEQUENCE_specifics_t asn_SPC_DU_Usage_Report_CellResourceReportItem_specs_1; -extern asn_TYPE_member_t asn_MBR_DU_Usage_Report_CellResourceReportItem_1[2]; - -#ifdef __cplusplus -} -#endif - -#endif /* _DU_Usage_Report_CellResourceReportItem_H_ */ -#include diff --git a/e2sm/headers/DU-Usage-Report-Per-UE.h b/e2sm/headers/DU-Usage-Report-Per-UE.h deleted file mode 100644 index 01de53b..0000000 --- a/e2sm/headers/DU-Usage-Report-Per-UE.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _DU_Usage_Report_Per_UE_H_ -#define _DU_Usage_Report_Per_UE_H_ - - -#include - -/* Including external dependencies */ -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Forward declarations */ -struct DU_Usage_Report_CellResourceReportItem; - -/* DU-Usage-Report-Per-UE */ -typedef struct DU_Usage_Report_Per_UE { - struct DU_Usage_Report_Per_UE__cellResourceReportList { - A_SEQUENCE_OF(struct DU_Usage_Report_CellResourceReportItem) 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; -} DU_Usage_Report_Per_UE_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_DU_Usage_Report_Per_UE; -extern asn_SEQUENCE_specifics_t asn_SPC_DU_Usage_Report_Per_UE_specs_1; -extern asn_TYPE_member_t asn_MBR_DU_Usage_Report_Per_UE_1[1]; - -#ifdef __cplusplus -} -#endif - -#endif /* _DU_Usage_Report_Per_UE_H_ */ -#include diff --git a/e2sm/headers/DU-Usage-Report-UeResourceReportItem.h b/e2sm/headers/DU-Usage-Report-UeResourceReportItem.h deleted file mode 100644 index 6f0be01..0000000 --- a/e2sm/headers/DU-Usage-Report-UeResourceReportItem.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _DU_Usage_Report_UeResourceReportItem_H_ -#define _DU_Usage_Report_UeResourceReportItem_H_ - - -#include - -/* Including external dependencies */ -#include "C-RNTI.h" -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* DU-Usage-Report-UeResourceReportItem */ -typedef struct DU_Usage_Report_UeResourceReportItem { - C_RNTI_t c_RNTI; - 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; -} DU_Usage_Report_UeResourceReportItem_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_DU_Usage_Report_UeResourceReportItem; -extern asn_SEQUENCE_specifics_t asn_SPC_DU_Usage_Report_UeResourceReportItem_specs_1; -extern asn_TYPE_member_t asn_MBR_DU_Usage_Report_UeResourceReportItem_1[3]; - -#ifdef __cplusplus -} -#endif - -#endif /* _DU_Usage_Report_UeResourceReportItem_H_ */ -#include diff --git a/e2sm/headers/E-UTRA-ARFCN.h b/e2sm/headers/E-UTRA-ARFCN.h index 2f281e9..dd7707b 100644 --- a/e2sm/headers/E-UTRA-ARFCN.h +++ b/e2sm/headers/E-UTRA-ARFCN.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E_UTRA_ARFCN_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f E_UTRA_ARFCN_decode_ber; der_type_encoder_f E_UTRA_ARFCN_encode_der; xer_type_decoder_f E_UTRA_ARFCN_decode_xer; xer_type_encoder_f E_UTRA_ARFCN_encode_xer; +jer_type_encoder_f E_UTRA_ARFCN_encode_jer; +oer_type_decoder_f E_UTRA_ARFCN_decode_oer; +oer_type_encoder_f E_UTRA_ARFCN_encode_oer; per_type_decoder_f E_UTRA_ARFCN_decode_uper; per_type_encoder_f E_UTRA_ARFCN_encode_uper; per_type_decoder_f E_UTRA_ARFCN_decode_aper; diff --git a/e2sm/headers/E-UTRA-PCI.h b/e2sm/headers/E-UTRA-PCI.h index 5d09203..dfd7bbc 100644 --- a/e2sm/headers/E-UTRA-PCI.h +++ b/e2sm/headers/E-UTRA-PCI.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E_UTRA_PCI_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f E_UTRA_PCI_decode_ber; der_type_encoder_f E_UTRA_PCI_encode_der; xer_type_decoder_f E_UTRA_PCI_decode_xer; xer_type_encoder_f E_UTRA_PCI_encode_xer; +jer_type_encoder_f E_UTRA_PCI_encode_jer; +oer_type_decoder_f E_UTRA_PCI_decode_oer; +oer_type_encoder_f E_UTRA_PCI_encode_oer; per_type_decoder_f E_UTRA_PCI_decode_uper; per_type_encoder_f E_UTRA_PCI_encode_uper; per_type_decoder_f E_UTRA_PCI_decode_aper; diff --git a/e2sm/headers/E-UTRA-TAC.h b/e2sm/headers/E-UTRA-TAC.h index d337742..aece256 100644 --- a/e2sm/headers/E-UTRA-TAC.h +++ b/e2sm/headers/E-UTRA-TAC.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E_UTRA_TAC_H_ @@ -30,6 +30,9 @@ ber_type_decoder_f E_UTRA_TAC_decode_ber; der_type_encoder_f E_UTRA_TAC_encode_der; xer_type_decoder_f E_UTRA_TAC_decode_xer; xer_type_encoder_f E_UTRA_TAC_encode_xer; +jer_type_encoder_f E_UTRA_TAC_encode_jer; +oer_type_decoder_f E_UTRA_TAC_decode_oer; +oer_type_encoder_f E_UTRA_TAC_encode_oer; per_type_decoder_f E_UTRA_TAC_decode_uper; per_type_encoder_f E_UTRA_TAC_encode_uper; per_type_decoder_f E_UTRA_TAC_decode_aper; diff --git a/e2sm/headers/E2SM-KPM-ActionDefinition-Format1.h b/e2sm/headers/E2SM-KPM-ActionDefinition-Format1.h index c4b7690..00ab1a4 100644 --- a/e2sm/headers/E2SM-KPM-ActionDefinition-Format1.h +++ b/e2sm/headers/E2SM-KPM-ActionDefinition-Format1.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_ActionDefinition_Format1_H_ diff --git a/e2sm/headers/E2SM-KPM-ActionDefinition-Format2.h b/e2sm/headers/E2SM-KPM-ActionDefinition-Format2.h index e145db5..8b2d9ce 100644 --- a/e2sm/headers/E2SM-KPM-ActionDefinition-Format2.h +++ b/e2sm/headers/E2SM-KPM-ActionDefinition-Format2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_ActionDefinition_Format2_H_ diff --git a/e2sm/headers/E2SM-KPM-ActionDefinition-Format3.h b/e2sm/headers/E2SM-KPM-ActionDefinition-Format3.h index 13b928c..ffce09f 100644 --- a/e2sm/headers/E2SM-KPM-ActionDefinition-Format3.h +++ b/e2sm/headers/E2SM-KPM-ActionDefinition-Format3.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_ActionDefinition_Format3_H_ diff --git a/e2sm/headers/E2SM-KPM-ActionDefinition.h b/e2sm/headers/E2SM-KPM-ActionDefinition.h index 0aaa3a8..6f9f3ee 100644 --- a/e2sm/headers/E2SM-KPM-ActionDefinition.h +++ b/e2sm/headers/E2SM-KPM-ActionDefinition.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_ActionDefinition_H_ @@ -22,7 +22,7 @@ extern "C" { /* Dependencies */ typedef enum E2SM_KPM_ActionDefinition__actionDefinition_formats_PR { - E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_NOTHING= 0 , /* No components present */ + E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_NOTHING, /* No components present */ E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1, E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format2, E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format3 diff --git a/e2sm/headers/E2SM-KPM-EventTriggerDefinition-Format1.h b/e2sm/headers/E2SM-KPM-EventTriggerDefinition-Format1.h index b778335..c34383b 100644 --- a/e2sm/headers/E2SM-KPM-EventTriggerDefinition-Format1.h +++ b/e2sm/headers/E2SM-KPM-EventTriggerDefinition-Format1.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_EventTriggerDefinition_Format1_H_ diff --git a/e2sm/headers/E2SM-KPM-EventTriggerDefinition.h b/e2sm/headers/E2SM-KPM-EventTriggerDefinition.h index 0ed6d68..4befd32 100644 --- a/e2sm/headers/E2SM-KPM-EventTriggerDefinition.h +++ b/e2sm/headers/E2SM-KPM-EventTriggerDefinition.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_EventTriggerDefinition_H_ diff --git a/e2sm/headers/E2SM-KPM-IndicationHeader-Format1.h b/e2sm/headers/E2SM-KPM-IndicationHeader-Format1.h index f2de5ef..10e8441 100644 --- a/e2sm/headers/E2SM-KPM-IndicationHeader-Format1.h +++ b/e2sm/headers/E2SM-KPM-IndicationHeader-Format1.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_IndicationHeader_Format1_H_ diff --git a/e2sm/headers/E2SM-KPM-IndicationHeader.h b/e2sm/headers/E2SM-KPM-IndicationHeader.h index 80e5094..fb543b6 100644 --- a/e2sm/headers/E2SM-KPM-IndicationHeader.h +++ b/e2sm/headers/E2SM-KPM-IndicationHeader.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_IndicationHeader_H_ diff --git a/e2sm/headers/E2SM-KPM-IndicationMessage-Format1.h b/e2sm/headers/E2SM-KPM-IndicationMessage-Format1.h index e909d8c..dc757b1 100644 --- a/e2sm/headers/E2SM-KPM-IndicationMessage-Format1.h +++ b/e2sm/headers/E2SM-KPM-IndicationMessage-Format1.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_IndicationMessage_Format1_H_ diff --git a/e2sm/headers/E2SM-KPM-IndicationMessage-Format2.h b/e2sm/headers/E2SM-KPM-IndicationMessage-Format2.h index 0f96d3a..cf08aaa 100644 --- a/e2sm/headers/E2SM-KPM-IndicationMessage-Format2.h +++ b/e2sm/headers/E2SM-KPM-IndicationMessage-Format2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_IndicationMessage_Format2_H_ diff --git a/e2sm/headers/E2SM-KPM-IndicationMessage.h b/e2sm/headers/E2SM-KPM-IndicationMessage.h index d54d24b..b676a98 100644 --- a/e2sm/headers/E2SM-KPM-IndicationMessage.h +++ b/e2sm/headers/E2SM-KPM-IndicationMessage.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_IndicationMessage_H_ diff --git a/e2sm/headers/E2SM-KPM-RANfunction-Description.h b/e2sm/headers/E2SM-KPM-RANfunction-Description.h index afd378e..896a72f 100644 --- a/e2sm/headers/E2SM-KPM-RANfunction-Description.h +++ b/e2sm/headers/E2SM-KPM-RANfunction-Description.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _E2SM_KPM_RANfunction_Description_H_ diff --git a/e2sm/headers/EN-GNB-ID.h b/e2sm/headers/EN-GNB-ID.h index 34aff92..dec8dd1 100644 --- a/e2sm/headers/EN-GNB-ID.h +++ b/e2sm/headers/EN-GNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _EN_GNB_ID_H_ diff --git a/e2sm/headers/ENB-ID-Choice.h b/e2sm/headers/ENB-ID-Choice.h deleted file mode 100644 index f1743a5..0000000 --- a/e2sm/headers/ENB-ID-Choice.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/ENB-ID.h b/e2sm/headers/ENB-ID.h index 4d96e8e..ecac855 100644 --- a/e2sm/headers/ENB-ID.h +++ b/e2sm/headers/ENB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ENB_ID_H_ diff --git a/e2sm/headers/ENB-UE-X2AP-ID-Extension.h b/e2sm/headers/ENB-UE-X2AP-ID-Extension.h index aa64c4c..611bc8f 100644 --- a/e2sm/headers/ENB-UE-X2AP-ID-Extension.h +++ b/e2sm/headers/ENB-UE-X2AP-ID-Extension.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ENB_UE_X2AP_ID_Extension_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f ENB_UE_X2AP_ID_Extension_decode_ber; der_type_encoder_f ENB_UE_X2AP_ID_Extension_encode_der; xer_type_decoder_f ENB_UE_X2AP_ID_Extension_decode_xer; xer_type_encoder_f ENB_UE_X2AP_ID_Extension_encode_xer; +jer_type_encoder_f ENB_UE_X2AP_ID_Extension_encode_jer; +oer_type_decoder_f ENB_UE_X2AP_ID_Extension_decode_oer; +oer_type_encoder_f ENB_UE_X2AP_ID_Extension_encode_oer; per_type_decoder_f ENB_UE_X2AP_ID_Extension_decode_uper; per_type_encoder_f ENB_UE_X2AP_ID_Extension_encode_uper; per_type_decoder_f ENB_UE_X2AP_ID_Extension_decode_aper; diff --git a/e2sm/headers/ENB-UE-X2AP-ID.h b/e2sm/headers/ENB-UE-X2AP-ID.h index 7e5796b..0e1162d 100644 --- a/e2sm/headers/ENB-UE-X2AP-ID.h +++ b/e2sm/headers/ENB-UE-X2AP-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ENB_UE_X2AP_ID_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f ENB_UE_X2AP_ID_decode_ber; der_type_encoder_f ENB_UE_X2AP_ID_encode_der; xer_type_decoder_f ENB_UE_X2AP_ID_decode_xer; xer_type_encoder_f ENB_UE_X2AP_ID_encode_xer; +jer_type_encoder_f ENB_UE_X2AP_ID_encode_jer; +oer_type_decoder_f ENB_UE_X2AP_ID_decode_oer; +oer_type_encoder_f ENB_UE_X2AP_ID_encode_oer; per_type_decoder_f ENB_UE_X2AP_ID_decode_uper; per_type_encoder_f ENB_UE_X2AP_ID_encode_uper; per_type_decoder_f ENB_UE_X2AP_ID_decode_aper; diff --git a/e2sm/headers/ENGNB-ID.h b/e2sm/headers/ENGNB-ID.h deleted file mode 100644 index 12fd929..0000000 --- a/e2sm/headers/ENGNB-ID.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/ENUMERATED.h b/e2sm/headers/ENUMERATED.h deleted file mode 100644 index 8fd04de..0000000 --- a/e2sm/headers/ENUMERATED.h +++ /dev/null @@ -1,40 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _ENUMERATED_H_ -#define _ENUMERATED_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef INTEGER_t ENUMERATED_t; /* Implemented via INTEGER */ - -extern asn_TYPE_descriptor_t asn_DEF_ENUMERATED; -extern asn_TYPE_operation_t asn_OP_ENUMERATED; - -oer_type_decoder_f ENUMERATED_decode_oer; -oer_type_encoder_f ENUMERATED_encode_oer; -per_type_decoder_f ENUMERATED_decode_uper; -per_type_encoder_f ENUMERATED_encode_uper; -per_type_decoder_f ENUMERATED_decode_aper; -per_type_encoder_f ENUMERATED_encode_aper; - -#define ENUMERATED_free ASN__PRIMITIVE_TYPE_free -#define ENUMERATED_print INTEGER_print -#define ENUMERATED_compare INTEGER_compare -#define ENUMERATED_constraint asn_generic_no_constraint -#define ENUMERATED_decode_ber ber_decode_primitive -#define ENUMERATED_encode_der INTEGER_encode_der -#define ENUMERATED_decode_xer INTEGER_decode_xer -#define ENUMERATED_encode_xer INTEGER_encode_xer -#define ENUMERATED_random_fill INTEGER_random_fill - -#ifdef __cplusplus -} -#endif - -#endif /* _ENUMERATED_H_ */ diff --git a/e2sm/headers/EPC-CUUP-PM-Format.h b/e2sm/headers/EPC-CUUP-PM-Format.h deleted file mode 100644 index 0c3d299..0000000 --- a/e2sm/headers/EPC-CUUP-PM-Format.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/EPC-DU-PM-Container.h b/e2sm/headers/EPC-DU-PM-Container.h deleted file mode 100644 index e0aeda2..0000000 --- a/e2sm/headers/EPC-DU-PM-Container.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/EUTRA-CGI.h b/e2sm/headers/EUTRA-CGI.h index 7e89c31..9f0d7fa 100644 --- a/e2sm/headers/EUTRA-CGI.h +++ b/e2sm/headers/EUTRA-CGI.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _EUTRA_CGI_H_ diff --git a/e2sm/headers/EUTRACellIdentity.h b/e2sm/headers/EUTRACellIdentity.h index fbdc8f5..94bd9cc 100644 --- a/e2sm/headers/EUTRACellIdentity.h +++ b/e2sm/headers/EUTRACellIdentity.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _EUTRACellIdentity_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f EUTRACellIdentity_decode_ber; der_type_encoder_f EUTRACellIdentity_encode_der; xer_type_decoder_f EUTRACellIdentity_decode_xer; xer_type_encoder_f EUTRACellIdentity_encode_xer; +jer_type_encoder_f EUTRACellIdentity_encode_jer; +oer_type_decoder_f EUTRACellIdentity_decode_oer; +oer_type_encoder_f EUTRACellIdentity_encode_oer; per_type_decoder_f EUTRACellIdentity_decode_uper; per_type_encoder_f EUTRACellIdentity_encode_uper; per_type_decoder_f EUTRACellIdentity_decode_aper; diff --git a/e2sm/headers/EXTERNAL.h b/e2sm/headers/EXTERNAL.h new file mode 100644 index 0000000..fdb5fec --- /dev/null +++ b/e2sm/headers/EXTERNAL.h @@ -0,0 +1,65 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "ASN1C-UsefulInformationObjectClasses" + * found in "/usr/local/share/asn1c/standard-modules/ASN1C-UsefulInformationObjectClasses.asn1" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _EXTERNAL_H_ +#define _EXTERNAL_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "OBJECT_IDENTIFIER.h" +#include "NativeInteger.h" +#include "ObjectDescriptor.h" +#include "ANY.h" +#include "OCTET_STRING.h" +#include "BIT_STRING.h" +#include "constr_CHOICE.h" +#include "constr_SEQUENCE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum EXTERNAL__encoding_PR { + EXTERNAL__encoding_PR_NOTHING, /* No components present */ + EXTERNAL__encoding_PR_single_ASN1_type, + EXTERNAL__encoding_PR_octet_aligned, + EXTERNAL__encoding_PR_arbitrary +} EXTERNAL__encoding_PR; + +/* EXTERNAL */ +typedef struct EXTERNAL { + OBJECT_IDENTIFIER_t *direct_reference; /* OPTIONAL */ + long *indirect_reference; /* OPTIONAL */ + ObjectDescriptor_t *data_value_descriptor; /* OPTIONAL */ + struct EXTERNAL__encoding { + EXTERNAL__encoding_PR present; + union EXTERNAL__encoding_u { + ANY_t single_ASN1_type; + OCTET_STRING_t octet_aligned; + BIT_STRING_t arbitrary; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } encoding; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} EXTERNAL_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_EXTERNAL; + +#ifdef __cplusplus +} +#endif + +#endif /* _EXTERNAL_H_ */ +#include "asn_internal.h" diff --git a/e2sm/headers/FGC-CUUP-PM-Format.h b/e2sm/headers/FGC-CUUP-PM-Format.h deleted file mode 100644 index b152e74..0000000 --- a/e2sm/headers/FGC-CUUP-PM-Format.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/FGC-DU-PM-Container.h b/e2sm/headers/FGC-DU-PM-Container.h deleted file mode 100644 index 4af771f..0000000 --- a/e2sm/headers/FGC-DU-PM-Container.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/FQIPERSlicesPerPlmnListItem.h b/e2sm/headers/FQIPERSlicesPerPlmnListItem.h deleted file mode 100644 index e7960aa..0000000 --- a/e2sm/headers/FQIPERSlicesPerPlmnListItem.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/FQIPERSlicesPerPlmnPerCellListItem.h b/e2sm/headers/FQIPERSlicesPerPlmnPerCellListItem.h deleted file mode 100644 index 147ecfe..0000000 --- a/e2sm/headers/FQIPERSlicesPerPlmnPerCellListItem.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/FiveGS-TAC.h b/e2sm/headers/FiveGS-TAC.h index 80829ad..95c5f09 100644 --- a/e2sm/headers/FiveGS-TAC.h +++ b/e2sm/headers/FiveGS-TAC.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _FiveGS_TAC_H_ @@ -30,6 +30,9 @@ ber_type_decoder_f FiveGS_TAC_decode_ber; der_type_encoder_f FiveGS_TAC_encode_der; xer_type_decoder_f FiveGS_TAC_decode_xer; xer_type_encoder_f FiveGS_TAC_encode_xer; +jer_type_encoder_f FiveGS_TAC_encode_jer; +oer_type_decoder_f FiveGS_TAC_decode_oer; +oer_type_encoder_f FiveGS_TAC_encode_oer; per_type_decoder_f FiveGS_TAC_decode_uper; per_type_encoder_f FiveGS_TAC_encode_uper; per_type_decoder_f FiveGS_TAC_decode_aper; diff --git a/e2sm/headers/FiveQI.h b/e2sm/headers/FiveQI.h index 3f878c2..6af2f9b 100644 --- a/e2sm/headers/FiveQI.h +++ b/e2sm/headers/FiveQI.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _FiveQI_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f FiveQI_decode_ber; der_type_encoder_f FiveQI_encode_der; xer_type_decoder_f FiveQI_decode_xer; xer_type_encoder_f FiveQI_encode_xer; +jer_type_encoder_f FiveQI_encode_jer; +oer_type_decoder_f FiveQI_decode_oer; +oer_type_encoder_f FiveQI_encode_oer; per_type_decoder_f FiveQI_decode_uper; per_type_encoder_f FiveQI_encode_uper; per_type_decoder_f FiveQI_decode_aper; diff --git a/e2sm/headers/FreqBandNrItem.h b/e2sm/headers/FreqBandNrItem.h index 662b272..10e4fff 100644 --- a/e2sm/headers/FreqBandNrItem.h +++ b/e2sm/headers/FreqBandNrItem.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _FreqBandNrItem_H_ @@ -33,6 +33,8 @@ typedef struct FreqBandNrItem { /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_FreqBandNrItem; +extern asn_SEQUENCE_specifics_t asn_SPC_FreqBandNrItem_specs_1; +extern asn_TYPE_member_t asn_MBR_FreqBandNrItem_1[1]; #ifdef __cplusplus } diff --git a/e2sm/headers/GNB-CU-CP-Name.h b/e2sm/headers/GNB-CU-CP-Name.h deleted file mode 100644 index 3458335..0000000 --- a/e2sm/headers/GNB-CU-CP-Name.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/GNB-CU-CP-UE-E1AP-ID.h b/e2sm/headers/GNB-CU-CP-UE-E1AP-ID.h index 1f6ae68..13b0e60 100644 --- a/e2sm/headers/GNB-CU-CP-UE-E1AP-ID.h +++ b/e2sm/headers/GNB-CU-CP-UE-E1AP-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GNB_CU_CP_UE_E1AP_ID_H_ @@ -32,6 +32,9 @@ ber_type_decoder_f GNB_CU_CP_UE_E1AP_ID_decode_ber; der_type_encoder_f GNB_CU_CP_UE_E1AP_ID_encode_der; xer_type_decoder_f GNB_CU_CP_UE_E1AP_ID_decode_xer; xer_type_encoder_f GNB_CU_CP_UE_E1AP_ID_encode_xer; +jer_type_encoder_f GNB_CU_CP_UE_E1AP_ID_encode_jer; +oer_type_decoder_f GNB_CU_CP_UE_E1AP_ID_decode_oer; +oer_type_encoder_f GNB_CU_CP_UE_E1AP_ID_encode_oer; per_type_decoder_f GNB_CU_CP_UE_E1AP_ID_decode_uper; per_type_encoder_f GNB_CU_CP_UE_E1AP_ID_encode_uper; per_type_decoder_f GNB_CU_CP_UE_E1AP_ID_decode_aper; diff --git a/e2sm/headers/GNB-CU-UE-F1AP-ID.h b/e2sm/headers/GNB-CU-UE-F1AP-ID.h index 0f92da8..7560280 100644 --- a/e2sm/headers/GNB-CU-UE-F1AP-ID.h +++ b/e2sm/headers/GNB-CU-UE-F1AP-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GNB_CU_UE_F1AP_ID_H_ @@ -32,6 +32,9 @@ ber_type_decoder_f GNB_CU_UE_F1AP_ID_decode_ber; der_type_encoder_f GNB_CU_UE_F1AP_ID_encode_der; xer_type_decoder_f GNB_CU_UE_F1AP_ID_decode_xer; xer_type_encoder_f GNB_CU_UE_F1AP_ID_encode_xer; +jer_type_encoder_f GNB_CU_UE_F1AP_ID_encode_jer; +oer_type_decoder_f GNB_CU_UE_F1AP_ID_decode_oer; +oer_type_encoder_f GNB_CU_UE_F1AP_ID_encode_oer; per_type_decoder_f GNB_CU_UE_F1AP_ID_decode_uper; per_type_encoder_f GNB_CU_UE_F1AP_ID_encode_uper; per_type_decoder_f GNB_CU_UE_F1AP_ID_decode_aper; diff --git a/e2sm/headers/GNB-CU-UP-ID.h b/e2sm/headers/GNB-CU-UP-ID.h index 2ed4c33..01ff4f4 100644 --- a/e2sm/headers/GNB-CU-UP-ID.h +++ b/e2sm/headers/GNB-CU-UP-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GNB_CU_UP_ID_H_ @@ -31,6 +31,9 @@ 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; +jer_type_encoder_f GNB_CU_UP_ID_encode_jer; +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; diff --git a/e2sm/headers/GNB-CU-UP-Name.h b/e2sm/headers/GNB-CU-UP-Name.h deleted file mode 100644 index a408dec..0000000 --- a/e2sm/headers/GNB-CU-UP-Name.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/GNB-DU-ID.h b/e2sm/headers/GNB-DU-ID.h index 4901345..eb9ac2d 100644 --- a/e2sm/headers/GNB-DU-ID.h +++ b/e2sm/headers/GNB-DU-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GNB_DU_ID_H_ @@ -31,6 +31,9 @@ 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; +jer_type_encoder_f GNB_DU_ID_encode_jer; +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; diff --git a/e2sm/headers/GNB-DU-Name.h b/e2sm/headers/GNB-DU-Name.h deleted file mode 100644 index e898011..0000000 --- a/e2sm/headers/GNB-DU-Name.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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_per_constraints_t asn_PER_type_GNB_DU_Name_constr_1; -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/e2sm/headers/GNB-ID-Choice.h b/e2sm/headers/GNB-ID-Choice.h deleted file mode 100644 index 353d1b4..0000000 --- a/e2sm/headers/GNB-ID-Choice.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/GNB-ID.h b/e2sm/headers/GNB-ID.h index 9ae9ee9..07b41c1 100644 --- a/e2sm/headers/GNB-ID.h +++ b/e2sm/headers/GNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GNB_ID_H_ diff --git a/e2sm/headers/GNB-Name.h b/e2sm/headers/GNB-Name.h deleted file mode 100644 index 51a2030..0000000 --- a/e2sm/headers/GNB-Name.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _GNB_Name_H_ -#define _GNB_Name_H_ - - -#include - -/* Including external dependencies */ -#include "GNB-DU-Name.h" -#include "GNB-CU-CP-Name.h" -#include "GNB-CU-UP-Name.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Dependencies */ -typedef enum GNB_Name_PR { - GNB_Name_PR_NOTHING, /* No components present */ - GNB_Name_PR_gNB_DU_Name, - GNB_Name_PR_gNB_CU_CP_Name, - GNB_Name_PR_gNB_CU_UP_Name - /* Extensions may appear below */ - -} GNB_Name_PR; - -/* GNB-Name */ -typedef struct GNB_Name { - GNB_Name_PR present; - union GNB_Name_u { - GNB_DU_Name_t gNB_DU_Name; - GNB_CU_CP_Name_t gNB_CU_CP_Name; - GNB_CU_UP_Name_t gNB_CU_UP_Name; - /* - * This type is extensible, - * possible extensions are below. - */ - } choice; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} GNB_Name_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_GNB_Name; -extern asn_CHOICE_specifics_t asn_SPC_GNB_Name_specs_1; -extern asn_TYPE_member_t asn_MBR_GNB_Name_1[3]; -extern asn_per_constraints_t asn_PER_type_GNB_Name_constr_1; - -#ifdef __cplusplus -} -#endif - -#endif /* _GNB_Name_H_ */ -#include diff --git a/e2sm/headers/GUAMI.h b/e2sm/headers/GUAMI.h index 2c96d62..110473f 100644 --- a/e2sm/headers/GUAMI.h +++ b/e2sm/headers/GUAMI.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GUAMI_H_ diff --git a/e2sm/headers/GUMMEI.h b/e2sm/headers/GUMMEI.h index 827a8c7..c3da985 100644 --- a/e2sm/headers/GUMMEI.h +++ b/e2sm/headers/GUMMEI.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GUMMEI_H_ diff --git a/e2sm/headers/GeneralString.h b/e2sm/headers/GeneralString.h deleted file mode 100644 index fb5de1c..0000000 --- a/e2sm/headers/GeneralString.h +++ /dev/null @@ -1,36 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _GeneralString_H_ -#define _GeneralString_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t GeneralString_t; /* Implemented via OCTET STRING */ - -extern asn_TYPE_descriptor_t asn_DEF_GeneralString; -extern asn_TYPE_operation_t asn_OP_GeneralString; - -#define GeneralString_free OCTET_STRING_free -#define GeneralString_print OCTET_STRING_print -#define GeneralString_compare OCTET_STRING_compare -#define GeneralString_constraint asn_generic_unknown_constraint -#define GeneralString_decode_ber OCTET_STRING_decode_ber -#define GeneralString_encode_der OCTET_STRING_encode_der -#define GeneralString_decode_xer OCTET_STRING_decode_xer_hex -#define GeneralString_encode_xer OCTET_STRING_encode_xer -#define GeneralString_decode_uper OCTET_STRING_decode_uper -#define GeneralString_encode_uper OCTET_STRING_encode_uper -#define GeneralString_decode_aper OCTET_STRING_decode_aper -#define GeneralString_encode_aper OCTET_STRING_encode_aper - -#ifdef __cplusplus -} -#endif - -#endif /* _GeneralString_H_ */ diff --git a/e2sm/headers/GeneralizedTime.h b/e2sm/headers/GeneralizedTime.h deleted file mode 100644 index 02bffe0..0000000 --- a/e2sm/headers/GeneralizedTime.h +++ /dev/null @@ -1,80 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _GeneralizedTime_H_ -#define _GeneralizedTime_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t GeneralizedTime_t; /* Implemented via OCTET STRING */ - -extern asn_TYPE_descriptor_t asn_DEF_GeneralizedTime; -extern asn_TYPE_operation_t asn_OP_GeneralizedTime; - -asn_struct_print_f GeneralizedTime_print; -asn_struct_compare_f GeneralizedTime_compare; -asn_constr_check_f GeneralizedTime_constraint; -der_type_encoder_f GeneralizedTime_encode_der; -xer_type_encoder_f GeneralizedTime_encode_xer; -asn_random_fill_f GeneralizedTime_random_fill; - -#define GeneralizedTime_free OCTET_STRING_free -#define GeneralizedTime_decode_ber OCTET_STRING_decode_ber -#define GeneralizedTime_decode_xer OCTET_STRING_decode_xer_utf8 -#define GeneralizedTime_decode_uper OCTET_STRING_decode_uper -#define GeneralizedTime_encode_uper OCTET_STRING_encode_uper -#define GeneralizedTime_decode_aper OCTET_STRING_decode_aper -#define GeneralizedTime_encode_aper OCTET_STRING_encode_aper - -/*********************** - * Some handy helpers. * - ***********************/ - -struct tm; /* */ - -/* - * Convert a GeneralizedTime structure into time_t - * and optionally into struct tm. - * If as_gmt is given, the resulting _optional_tm4fill will have a GMT zone, - * instead of default local one. - * On error returns -1 and errno set to EINVAL - */ -time_t asn_GT2time(const GeneralizedTime_t *, struct tm *_optional_tm4fill, - int as_gmt); - -/* A version of the above function also returning the fractions of seconds */ -time_t asn_GT2time_frac(const GeneralizedTime_t *, - int *frac_value, int *frac_digits, /* (value / (10 ^ digits)) */ - struct tm *_optional_tm4fill, int as_gmt); - -/* - * Another version returning fractions with defined precision - * For example, parsing of the time ending with ".1" seconds - * with frac_digits=3 (msec) would yield frac_value = 100. - */ -time_t asn_GT2time_prec(const GeneralizedTime_t *, - int *frac_value, int frac_digits, - struct tm *_optional_tm4fill, int as_gmt); - -/* - * Convert a struct tm into GeneralizedTime. - * If _optional_gt is not given, this function will try to allocate one. - * If force_gmt is given, the resulting GeneralizedTime will be forced - * into a GMT time zone (encoding ends with a "Z"). - * On error, this function returns 0 and sets errno. - */ -GeneralizedTime_t *asn_time2GT(GeneralizedTime_t *_optional_gt, - const struct tm *, int force_gmt); -GeneralizedTime_t *asn_time2GT_frac(GeneralizedTime_t *_optional_gt, - const struct tm *, int frac_value, int frac_digits, int force_gmt); - -#ifdef __cplusplus -} -#endif - -#endif /* _GeneralizedTime_H_ */ diff --git a/e2sm/headers/GlobalENB-ID.h b/e2sm/headers/GlobalENB-ID.h index 01f6117..86ee46f 100644 --- a/e2sm/headers/GlobalENB-ID.h +++ b/e2sm/headers/GlobalENB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalENB_ID_H_ diff --git a/e2sm/headers/GlobalGNB-ID.h b/e2sm/headers/GlobalGNB-ID.h index 9b14f3a..e261794 100644 --- a/e2sm/headers/GlobalGNB-ID.h +++ b/e2sm/headers/GlobalGNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalGNB_ID_H_ diff --git a/e2sm/headers/GlobalKPMnode-ID.h b/e2sm/headers/GlobalKPMnode-ID.h deleted file mode 100644 index 3661fd3..0000000 --- a/e2sm/headers/GlobalKPMnode-ID.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/GlobalKPMnode-eNB-ID.h b/e2sm/headers/GlobalKPMnode-eNB-ID.h deleted file mode 100644 index 51a17cd..0000000 --- a/e2sm/headers/GlobalKPMnode-eNB-ID.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/GlobalKPMnode-en-gNB-ID.h b/e2sm/headers/GlobalKPMnode-en-gNB-ID.h deleted file mode 100644 index 4c10fc3..0000000 --- a/e2sm/headers/GlobalKPMnode-en-gNB-ID.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/GlobalKPMnode-gNB-ID.h b/e2sm/headers/GlobalKPMnode-gNB-ID.h deleted file mode 100644 index 70e5f06..0000000 --- a/e2sm/headers/GlobalKPMnode-gNB-ID.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/GlobalKPMnode-ng-eNB-ID.h b/e2sm/headers/GlobalKPMnode-ng-eNB-ID.h deleted file mode 100644 index bf2582a..0000000 --- a/e2sm/headers/GlobalKPMnode-ng-eNB-ID.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/GlobalNGRANNodeID.h b/e2sm/headers/GlobalNGRANNodeID.h deleted file mode 100644 index bb34765..0000000 --- a/e2sm/headers/GlobalNGRANNodeID.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#ifndef _GlobalNGRANNodeID_H_ -#define _GlobalNGRANNodeID_H_ - - -#include "asn_application.h" - -/* Including external dependencies */ -#include "constr_CHOICE.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Dependencies */ -typedef enum GlobalNGRANNodeID_PR { - GlobalNGRANNodeID_PR_NOTHING, /* No components present */ - GlobalNGRANNodeID_PR_gNB, - GlobalNGRANNodeID_PR_ng_eNB - /* Extensions may appear below */ - -} GlobalNGRANNodeID_PR; - -/* Forward declarations */ -struct GlobalGNB_ID; -struct GlobalNgENB_ID; - -/* GlobalNGRANNodeID */ -typedef struct GlobalNGRANNodeID { - GlobalNGRANNodeID_PR present; - union GlobalNGRANNodeID_u { - struct GlobalGNB_ID *gNB; - struct GlobalNgENB_ID *ng_eNB; - /* - * This type is extensible, - * possible extensions are below. - */ - } choice; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} GlobalNGRANNodeID_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_GlobalNGRANNodeID; -extern asn_CHOICE_specifics_t asn_SPC_GlobalNGRANNodeID_specs_1; -extern asn_TYPE_member_t asn_MBR_GlobalNGRANNodeID_1[2]; -extern asn_per_constraints_t asn_PER_type_GlobalNGRANNodeID_constr_1; - -#ifdef __cplusplus -} -#endif - -#endif /* _GlobalNGRANNodeID_H_ */ -#include "asn_internal.h" diff --git a/e2sm/headers/GlobalNgENB-ID.h b/e2sm/headers/GlobalNgENB-ID.h index db01dd0..5c38c3a 100644 --- a/e2sm/headers/GlobalNgENB-ID.h +++ b/e2sm/headers/GlobalNgENB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalNgENB_ID_H_ diff --git a/e2sm/headers/GlobalRANNodeID.h b/e2sm/headers/GlobalRANNodeID.h new file mode 100644 index 0000000..cab3e1c --- /dev/null +++ b/e2sm/headers/GlobalRANNodeID.h @@ -0,0 +1,61 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-COMMON-IEs" + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#ifndef _GlobalRANNodeID_H_ +#define _GlobalRANNodeID_H_ + + +#include "asn_application.h" + +/* Including external dependencies */ +#include "constr_CHOICE.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum GlobalRANNodeID_PR { + GlobalRANNodeID_PR_NOTHING, /* No components present */ + GlobalRANNodeID_PR_globalGNB_ID, + GlobalRANNodeID_PR_globalNgENB_ID + /* Extensions may appear below */ + +} GlobalRANNodeID_PR; + +/* Forward declarations */ +struct GlobalGNB_ID; +struct GlobalNgENB_ID; + +/* GlobalRANNodeID */ +typedef struct GlobalRANNodeID { + GlobalRANNodeID_PR present; + union GlobalRANNodeID_u { + struct GlobalGNB_ID *globalGNB_ID; + struct GlobalNgENB_ID *globalNgENB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalRANNodeID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalRANNodeID; +extern asn_CHOICE_specifics_t asn_SPC_GlobalRANNodeID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalRANNodeID_1[2]; +extern asn_per_constraints_t asn_PER_type_GlobalRANNodeID_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalRANNodeID_H_ */ +#include "asn_internal.h" diff --git a/e2sm/headers/GlobalenGNB-ID.h b/e2sm/headers/GlobalenGNB-ID.h index 61e4d4c..286ba1c 100644 --- a/e2sm/headers/GlobalenGNB-ID.h +++ b/e2sm/headers/GlobalenGNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GlobalenGNB_ID_H_ diff --git a/e2sm/headers/GlobalgNB-ID.h b/e2sm/headers/GlobalgNB-ID.h deleted file mode 100644 index d2f8e6f..0000000 --- a/e2sm/headers/GlobalgNB-ID.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/GlobalngeNB-ID.h b/e2sm/headers/GlobalngeNB-ID.h deleted file mode 100644 index 1cc69c8..0000000 --- a/e2sm/headers/GlobalngeNB-ID.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/GranularityPeriod.h b/e2sm/headers/GranularityPeriod.h index 0c3b090..5fc01f4 100644 --- a/e2sm/headers/GranularityPeriod.h +++ b/e2sm/headers/GranularityPeriod.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GranularityPeriod_H_ @@ -32,6 +32,9 @@ ber_type_decoder_f GranularityPeriod_decode_ber; der_type_encoder_f GranularityPeriod_encode_der; xer_type_decoder_f GranularityPeriod_decode_xer; xer_type_encoder_f GranularityPeriod_encode_xer; +jer_type_encoder_f GranularityPeriod_encode_jer; +oer_type_decoder_f GranularityPeriod_decode_oer; +oer_type_encoder_f GranularityPeriod_encode_oer; per_type_decoder_f GranularityPeriod_decode_uper; per_type_encoder_f GranularityPeriod_encode_uper; per_type_decoder_f GranularityPeriod_decode_aper; diff --git a/e2sm/headers/GraphicString.h b/e2sm/headers/GraphicString.h index 19cac68..807e9d6 100644 --- a/e2sm/headers/GraphicString.h +++ b/e2sm/headers/GraphicString.h @@ -16,18 +16,38 @@ typedef OCTET_STRING_t GraphicString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_GraphicString; extern asn_TYPE_operation_t asn_OP_GraphicString; -#define GraphicString_free OCTET_STRING_free -#define GraphicString_print OCTET_STRING_print -#define GraphicString_compare OCTET_STRING_compare -#define GraphicString_constraint asn_generic_unknown_constraint -#define GraphicString_decode_ber OCTET_STRING_decode_ber -#define GraphicString_encode_der OCTET_STRING_encode_der -#define GraphicString_decode_xer OCTET_STRING_decode_xer_hex -#define GraphicString_encode_xer OCTET_STRING_encode_xer -#define GraphicString_decode_uper OCTET_STRING_decode_uper -#define GraphicString_encode_uper OCTET_STRING_encode_uper -#define GraphicString_decode_aper OCTET_STRING_decode_aper -#define GraphicString_encode_aper OCTET_STRING_encode_aper +#define GraphicString_free OCTET_STRING_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define GraphicString_print OCTET_STRING_print +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define GraphicString_compare OCTET_STRING_compare + +#define GraphicString_constraint asn_generic_unknown_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define GraphicString_decode_ber OCTET_STRING_decode_ber +#define GraphicString_encode_der OCTET_STRING_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define GraphicString_decode_xer OCTET_STRING_decode_xer_hex +#define GraphicString_encode_xer OCTET_STRING_encode_xer +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +#define GraphicString_encode_jer OCTET_STRING_encode_jer +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#define GraphicString_decode_uper OCTET_STRING_decode_uper +#define GraphicString_encode_uper OCTET_STRING_encode_uper +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define GraphicString_decode_aper OCTET_STRING_decode_aper +#define GraphicString_encode_aper OCTET_STRING_encode_aper +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2sm/headers/GroupID.h b/e2sm/headers/GroupID.h index 259d9cd..97ae462 100644 --- a/e2sm/headers/GroupID.h +++ b/e2sm/headers/GroupID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _GroupID_H_ diff --git a/e2sm/headers/IA5String.h b/e2sm/headers/IA5String.h deleted file mode 100644 index 321f0c7..0000000 --- a/e2sm/headers/IA5String.h +++ /dev/null @@ -1,40 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _IA5String_H_ -#define _IA5String_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t IA5String_t; /* Implemented via OCTET STRING */ - -/* - * IA5String ASN.1 type definition. - */ -extern asn_TYPE_descriptor_t asn_DEF_IA5String; -extern asn_TYPE_operation_t asn_OP_IA5String; - -asn_constr_check_f IA5String_constraint; - -#define IA5String_free OCTET_STRING_free -#define IA5String_print OCTET_STRING_print_utf8 -#define IA5String_compare OCTET_STRING_compare -#define IA5String_decode_ber OCTET_STRING_decode_ber -#define IA5String_encode_der OCTET_STRING_encode_der -#define IA5String_decode_xer OCTET_STRING_decode_xer_utf8 -#define IA5String_encode_xer OCTET_STRING_encode_xer_utf8 -#define IA5String_decode_uper OCTET_STRING_decode_uper -#define IA5String_encode_uper OCTET_STRING_encode_uper -#define IA5String_decode_aper OCTET_STRING_decode_aper -#define IA5String_encode_aper OCTET_STRING_encode_aper - -#ifdef __cplusplus -} -#endif - -#endif /* _IA5String_H_ */ diff --git a/e2sm/headers/INTEGER.h b/e2sm/headers/INTEGER.h index f776c07..1666e0b 100644 --- a/e2sm/headers/INTEGER.h +++ b/e2sm/headers/INTEGER.h @@ -35,21 +35,52 @@ typedef struct asn_INTEGER_specifics_s { 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 +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); + +#define INTEGER_free ASN__PRIMITIVE_TYPE_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f INTEGER_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f INTEGER_compare; + +#define INTEGER_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define INTEGER_decode_ber ber_decode_primitive der_type_encoder_f INTEGER_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f INTEGER_decode_xer; xer_type_encoder_f INTEGER_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f INTEGER_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f INTEGER_decode_oer; oer_type_encoder_f INTEGER_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f INTEGER_decode_uper; per_type_encoder_f INTEGER_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f INTEGER_decode_aper; per_type_encoder_f INTEGER_encode_aper; -asn_random_fill_f INTEGER_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f INTEGER_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ /*********************************** * Some handy conversion routines. * @@ -83,8 +114,8 @@ 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 */ + ASN_STRTOX_OK = 0, /* Conversion succeeded, number ends at (*end) */ + ASN_STRTOX_EXTRA_DATA = 1 /* Conversion succeeded, but the string has extra stuff */ }; enum asn_strtox_result_e asn_strtol_lim(const char *str, const char **end, long *l); diff --git a/e2sm/headers/ISO646String.h b/e2sm/headers/ISO646String.h deleted file mode 100644 index cd24a68..0000000 --- a/e2sm/headers/ISO646String.h +++ /dev/null @@ -1,37 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _ISO646String_H_ -#define _ISO646String_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef VisibleString_t ISO646String_t; /* Implemented using VisibleString */ - -extern asn_TYPE_descriptor_t asn_DEF_ISO646String; -extern asn_TYPE_operation_t asn_OP_ISO646String; - -#define ISO646String_free OCTET_STRING_free -#define ISO646String_print OCTET_STRING_print_utf8 -#define ISO646String_compare OCTET_STRING_compare -#define ISO646String_constraint VisibleString_constraint -#define ISO646String_decode_ber OCTET_STRING_decode_ber -#define ISO646String_encode_der OCTET_STRING_encode_der -#define ISO646String_decode_xer OCTET_STRING_decode_xer_utf8 -#define ISO646String_encode_xer OCTET_STRING_encode_xer_utf8 -#define ISO646String_decode_uper OCTET_STRING_decode_uper -#define ISO646String_encode_uper OCTET_STRING_encode_uper -#define ISO646String_decode_aper OCTET_STRING_decode_aper -#define ISO646String_encode_aper OCTET_STRING_encode_aper - -#ifdef __cplusplus -} -#endif - -#endif /* _ISO646String_H_ */ diff --git a/e2sm/headers/IndexToRFSP.h b/e2sm/headers/IndexToRFSP.h index 574825c..d897712 100644 --- a/e2sm/headers/IndexToRFSP.h +++ b/e2sm/headers/IndexToRFSP.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _IndexToRFSP_H_ @@ -30,6 +30,9 @@ ber_type_decoder_f IndexToRFSP_decode_ber; der_type_encoder_f IndexToRFSP_encode_der; xer_type_decoder_f IndexToRFSP_decode_xer; xer_type_encoder_f IndexToRFSP_encode_xer; +jer_type_encoder_f IndexToRFSP_encode_jer; +oer_type_decoder_f IndexToRFSP_decode_oer; +oer_type_encoder_f IndexToRFSP_encode_oer; per_type_decoder_f IndexToRFSP_decode_uper; per_type_encoder_f IndexToRFSP_encode_uper; per_type_decoder_f IndexToRFSP_decode_aper; diff --git a/e2sm/headers/Interface-MessageID.h b/e2sm/headers/Interface-MessageID.h index 2a31202..a0a80db 100644 --- a/e2sm/headers/Interface-MessageID.h +++ b/e2sm/headers/Interface-MessageID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _Interface_MessageID_H_ diff --git a/e2sm/headers/InterfaceID-E1.h b/e2sm/headers/InterfaceID-E1.h index 07e2dbd..5f737eb 100644 --- a/e2sm/headers/InterfaceID-E1.h +++ b/e2sm/headers/InterfaceID-E1.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _InterfaceID_E1_H_ @@ -12,7 +12,7 @@ #include "asn_application.h" /* Including external dependencies */ -#include "GlobalGNB-ID.h" +#include "GlobalRANNodeID.h" #include "GNB-CU-UP-ID.h" #include "constr_SEQUENCE.h" @@ -22,7 +22,7 @@ extern "C" { /* InterfaceID-E1 */ typedef struct InterfaceID_E1 { - GlobalGNB_ID_t globalGNB_ID; + GlobalRANNodeID_t global_NG_RAN_ID; GNB_CU_UP_ID_t gNB_CU_UP_ID; /* * This type is extensible, diff --git a/e2sm/headers/InterfaceID-F1.h b/e2sm/headers/InterfaceID-F1.h index 3c751a9..c46e834 100644 --- a/e2sm/headers/InterfaceID-F1.h +++ b/e2sm/headers/InterfaceID-F1.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _InterfaceID_F1_H_ @@ -12,7 +12,7 @@ #include "asn_application.h" /* Including external dependencies */ -#include "GlobalGNB-ID.h" +#include "GlobalRANNodeID.h" #include "GNB-DU-ID.h" #include "constr_SEQUENCE.h" @@ -22,7 +22,7 @@ extern "C" { /* InterfaceID-F1 */ typedef struct InterfaceID_F1 { - GlobalGNB_ID_t globalGNB_ID; + GlobalRANNodeID_t global_NG_RAN_ID; GNB_DU_ID_t gNB_DU_ID; /* * This type is extensible, diff --git a/e2sm/headers/InterfaceID-NG.h b/e2sm/headers/InterfaceID-NG.h index 714961e..213e45f 100644 --- a/e2sm/headers/InterfaceID-NG.h +++ b/e2sm/headers/InterfaceID-NG.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _InterfaceID_NG_H_ diff --git a/e2sm/headers/InterfaceID-S1.h b/e2sm/headers/InterfaceID-S1.h index 75e8463..81a76ce 100644 --- a/e2sm/headers/InterfaceID-S1.h +++ b/e2sm/headers/InterfaceID-S1.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _InterfaceID_S1_H_ diff --git a/e2sm/headers/InterfaceID-W1.h b/e2sm/headers/InterfaceID-W1.h index 7309df3..28d2828 100644 --- a/e2sm/headers/InterfaceID-W1.h +++ b/e2sm/headers/InterfaceID-W1.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _InterfaceID_W1_H_ diff --git a/e2sm/headers/InterfaceID-X2.h b/e2sm/headers/InterfaceID-X2.h index 8c86ef4..7cb3007 100644 --- a/e2sm/headers/InterfaceID-X2.h +++ b/e2sm/headers/InterfaceID-X2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _InterfaceID_X2_H_ diff --git a/e2sm/headers/InterfaceID-Xn.h b/e2sm/headers/InterfaceID-Xn.h index 976e504..5f7c3f0 100644 --- a/e2sm/headers/InterfaceID-Xn.h +++ b/e2sm/headers/InterfaceID-Xn.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _InterfaceID_Xn_H_ @@ -12,7 +12,7 @@ #include "asn_application.h" /* Including external dependencies */ -#include "GlobalNGRANNodeID.h" +#include "GlobalRANNodeID.h" #include "constr_SEQUENCE.h" #ifdef __cplusplus @@ -21,7 +21,7 @@ extern "C" { /* InterfaceID-Xn */ typedef struct InterfaceID_Xn { - GlobalNGRANNodeID_t global_NG_RAN_ID; + GlobalRANNodeID_t global_NG_RAN_ID; /* * This type is extensible, * possible extensions are below. diff --git a/e2sm/headers/InterfaceIdentifier.h b/e2sm/headers/InterfaceIdentifier.h index 5bcf1e4..a8f788c 100644 --- a/e2sm/headers/InterfaceIdentifier.h +++ b/e2sm/headers/InterfaceIdentifier.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _InterfaceIdentifier_H_ diff --git a/e2sm/headers/InterfaceType.h b/e2sm/headers/InterfaceType.h index 2c3679d..03a8f9d 100644 --- a/e2sm/headers/InterfaceType.h +++ b/e2sm/headers/InterfaceType.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _InterfaceType_H_ @@ -44,6 +44,9 @@ ber_type_decoder_f InterfaceType_decode_ber; der_type_encoder_f InterfaceType_encode_der; xer_type_decoder_f InterfaceType_decode_xer; xer_type_encoder_f InterfaceType_encode_xer; +jer_type_encoder_f InterfaceType_encode_jer; +oer_type_decoder_f InterfaceType_decode_oer; +oer_type_encoder_f InterfaceType_encode_oer; per_type_decoder_f InterfaceType_decode_uper; per_type_encoder_f InterfaceType_encode_uper; per_type_decoder_f InterfaceType_decode_aper; diff --git a/e2sm/headers/LabelInfoItem.h b/e2sm/headers/LabelInfoItem.h index 3761f10..df5d5d0 100644 --- a/e2sm/headers/LabelInfoItem.h +++ b/e2sm/headers/LabelInfoItem.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _LabelInfoItem_H_ diff --git a/e2sm/headers/LabelInfoList.h b/e2sm/headers/LabelInfoList.h index 5473fbd..0aa8132 100644 --- a/e2sm/headers/LabelInfoList.h +++ b/e2sm/headers/LabelInfoList.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _LabelInfoList_H_ diff --git a/e2sm/headers/MME-Code.h b/e2sm/headers/MME-Code.h index 7a1c912..d7e6e66 100644 --- a/e2sm/headers/MME-Code.h +++ b/e2sm/headers/MME-Code.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MME_Code_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f MME_Code_decode_ber; der_type_encoder_f MME_Code_encode_der; xer_type_decoder_f MME_Code_decode_xer; xer_type_encoder_f MME_Code_encode_xer; +jer_type_encoder_f MME_Code_encode_jer; +oer_type_decoder_f MME_Code_decode_oer; +oer_type_encoder_f MME_Code_encode_oer; per_type_decoder_f MME_Code_decode_uper; per_type_encoder_f MME_Code_encode_uper; per_type_decoder_f MME_Code_decode_aper; diff --git a/e2sm/headers/MME-Group-ID.h b/e2sm/headers/MME-Group-ID.h index 84eb3bf..51057d2 100644 --- a/e2sm/headers/MME-Group-ID.h +++ b/e2sm/headers/MME-Group-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MME_Group_ID_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f MME_Group_ID_decode_ber; der_type_encoder_f MME_Group_ID_encode_der; xer_type_decoder_f MME_Group_ID_decode_xer; xer_type_encoder_f MME_Group_ID_encode_xer; +jer_type_encoder_f MME_Group_ID_encode_jer; +oer_type_decoder_f MME_Group_ID_decode_oer; +oer_type_encoder_f MME_Group_ID_encode_oer; per_type_decoder_f MME_Group_ID_decode_uper; per_type_encoder_f MME_Group_ID_encode_uper; per_type_decoder_f MME_Group_ID_decode_aper; diff --git a/e2sm/headers/MME-UE-S1AP-ID.h b/e2sm/headers/MME-UE-S1AP-ID.h index 4b18e19..0ee7a9b 100644 --- a/e2sm/headers/MME-UE-S1AP-ID.h +++ b/e2sm/headers/MME-UE-S1AP-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MME_UE_S1AP_ID_H_ @@ -32,6 +32,9 @@ ber_type_decoder_f MME_UE_S1AP_ID_decode_ber; der_type_encoder_f MME_UE_S1AP_ID_encode_der; xer_type_decoder_f MME_UE_S1AP_ID_decode_xer; xer_type_encoder_f MME_UE_S1AP_ID_encode_xer; +jer_type_encoder_f MME_UE_S1AP_ID_encode_jer; +oer_type_decoder_f MME_UE_S1AP_ID_decode_oer; +oer_type_encoder_f MME_UE_S1AP_ID_encode_oer; per_type_decoder_f MME_UE_S1AP_ID_decode_uper; per_type_encoder_f MME_UE_S1AP_ID_encode_uper; per_type_decoder_f MME_UE_S1AP_ID_decode_aper; diff --git a/e2sm/headers/MatchingCondItem.h b/e2sm/headers/MatchingCondItem.h index 2391f42..ec702e0 100644 --- a/e2sm/headers/MatchingCondItem.h +++ b/e2sm/headers/MatchingCondItem.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MatchingCondItem_H_ diff --git a/e2sm/headers/MatchingCondList.h b/e2sm/headers/MatchingCondList.h index 4f42cc2..422a1f0 100644 --- a/e2sm/headers/MatchingCondList.h +++ b/e2sm/headers/MatchingCondList.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MatchingCondList_H_ diff --git a/e2sm/headers/MatchingUEidItem.h b/e2sm/headers/MatchingUEidItem.h index b3e304c..0ff8792 100644 --- a/e2sm/headers/MatchingUEidItem.h +++ b/e2sm/headers/MatchingUEidItem.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MatchingUEidItem_H_ diff --git a/e2sm/headers/MatchingUEidList.h b/e2sm/headers/MatchingUEidList.h index 4965f7d..478b51a 100644 --- a/e2sm/headers/MatchingUEidList.h +++ b/e2sm/headers/MatchingUEidList.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MatchingUEidList_H_ diff --git a/e2sm/headers/MeasurementCondItem.h b/e2sm/headers/MeasurementCondItem.h index 8f664aa..295ff9f 100644 --- a/e2sm/headers/MeasurementCondItem.h +++ b/e2sm/headers/MeasurementCondItem.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementCondItem_H_ diff --git a/e2sm/headers/MeasurementCondList.h b/e2sm/headers/MeasurementCondList.h index cccc4b8..5660bb3 100644 --- a/e2sm/headers/MeasurementCondList.h +++ b/e2sm/headers/MeasurementCondList.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementCondList_H_ diff --git a/e2sm/headers/MeasurementCondUEidItem.h b/e2sm/headers/MeasurementCondUEidItem.h index 2ea31d3..f3bc117 100644 --- a/e2sm/headers/MeasurementCondUEidItem.h +++ b/e2sm/headers/MeasurementCondUEidItem.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementCondUEidItem_H_ diff --git a/e2sm/headers/MeasurementCondUEidList.h b/e2sm/headers/MeasurementCondUEidList.h index 0480f92..d576767 100644 --- a/e2sm/headers/MeasurementCondUEidList.h +++ b/e2sm/headers/MeasurementCondUEidList.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementCondUEidList_H_ diff --git a/e2sm/headers/MeasurementData.h b/e2sm/headers/MeasurementData.h index e6c050d..a596009 100644 --- a/e2sm/headers/MeasurementData.h +++ b/e2sm/headers/MeasurementData.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementData_H_ diff --git a/e2sm/headers/MeasurementDataItem.h b/e2sm/headers/MeasurementDataItem.h index b9d1b21..2a70393 100644 --- a/e2sm/headers/MeasurementDataItem.h +++ b/e2sm/headers/MeasurementDataItem.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementDataItem_H_ diff --git a/e2sm/headers/MeasurementInfo-Action-Item.h b/e2sm/headers/MeasurementInfo-Action-Item.h index ef69a19..b869380 100644 --- a/e2sm/headers/MeasurementInfo-Action-Item.h +++ b/e2sm/headers/MeasurementInfo-Action-Item.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementInfo_Action_Item_H_ diff --git a/e2sm/headers/MeasurementInfo-Action-List.h b/e2sm/headers/MeasurementInfo-Action-List.h index 3faba93..499f17b 100644 --- a/e2sm/headers/MeasurementInfo-Action-List.h +++ b/e2sm/headers/MeasurementInfo-Action-List.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementInfo_Action_List_H_ diff --git a/e2sm/headers/MeasurementInfoItem.h b/e2sm/headers/MeasurementInfoItem.h index a9afa60..f25ef03 100644 --- a/e2sm/headers/MeasurementInfoItem.h +++ b/e2sm/headers/MeasurementInfoItem.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementInfoItem_H_ diff --git a/e2sm/headers/MeasurementInfoList.h b/e2sm/headers/MeasurementInfoList.h index a7adc44..2d0d424 100644 --- a/e2sm/headers/MeasurementInfoList.h +++ b/e2sm/headers/MeasurementInfoList.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementInfoList_H_ diff --git a/e2sm/headers/MeasurementLabel.h b/e2sm/headers/MeasurementLabel.h index 7fc3e5a..e24465b 100644 --- a/e2sm/headers/MeasurementLabel.h +++ b/e2sm/headers/MeasurementLabel.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementLabel_H_ diff --git a/e2sm/headers/MeasurementRecord.h b/e2sm/headers/MeasurementRecord.h index 59505c6..7410d9c 100644 --- a/e2sm/headers/MeasurementRecord.h +++ b/e2sm/headers/MeasurementRecord.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementRecord_H_ diff --git a/e2sm/headers/MeasurementRecordItem.h b/e2sm/headers/MeasurementRecordItem.h index cb06392..0ed48c6 100644 --- a/e2sm/headers/MeasurementRecordItem.h +++ b/e2sm/headers/MeasurementRecordItem.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementRecordItem_H_ diff --git a/e2sm/headers/MeasurementType.h b/e2sm/headers/MeasurementType.h index 9220004..0647137 100644 --- a/e2sm/headers/MeasurementType.h +++ b/e2sm/headers/MeasurementType.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementType_H_ diff --git a/e2sm/headers/MeasurementTypeID.h b/e2sm/headers/MeasurementTypeID.h index ed3384a..efc5105 100644 --- a/e2sm/headers/MeasurementTypeID.h +++ b/e2sm/headers/MeasurementTypeID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementTypeID_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f MeasurementTypeID_decode_ber; der_type_encoder_f MeasurementTypeID_encode_der; xer_type_decoder_f MeasurementTypeID_decode_xer; xer_type_encoder_f MeasurementTypeID_encode_xer; +jer_type_encoder_f MeasurementTypeID_encode_jer; +oer_type_decoder_f MeasurementTypeID_decode_oer; +oer_type_encoder_f MeasurementTypeID_encode_oer; per_type_decoder_f MeasurementTypeID_decode_uper; per_type_encoder_f MeasurementTypeID_encode_uper; per_type_decoder_f MeasurementTypeID_decode_aper; diff --git a/e2sm/headers/MeasurementTypeName.h b/e2sm/headers/MeasurementTypeName.h index 4f3b826..ae2de36 100644 --- a/e2sm/headers/MeasurementTypeName.h +++ b/e2sm/headers/MeasurementTypeName.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _MeasurementTypeName_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f MeasurementTypeName_decode_ber; der_type_encoder_f MeasurementTypeName_encode_der; xer_type_decoder_f MeasurementTypeName_decode_xer; xer_type_encoder_f MeasurementTypeName_encode_xer; +jer_type_encoder_f MeasurementTypeName_encode_jer; +oer_type_decoder_f MeasurementTypeName_decode_oer; +oer_type_encoder_f MeasurementTypeName_encode_oer; per_type_decoder_f MeasurementTypeName_decode_uper; per_type_encoder_f MeasurementTypeName_encode_uper; per_type_decoder_f MeasurementTypeName_decode_aper; diff --git a/e2sm/headers/NG-RANnodeUEXnAPID.h b/e2sm/headers/NG-RANnodeUEXnAPID.h index aedd06e..9b68099 100644 --- a/e2sm/headers/NG-RANnodeUEXnAPID.h +++ b/e2sm/headers/NG-RANnodeUEXnAPID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _NG_RANnodeUEXnAPID_H_ @@ -32,6 +32,9 @@ ber_type_decoder_f NG_RANnodeUEXnAPID_decode_ber; der_type_encoder_f NG_RANnodeUEXnAPID_encode_der; xer_type_decoder_f NG_RANnodeUEXnAPID_decode_xer; xer_type_encoder_f NG_RANnodeUEXnAPID_encode_xer; +jer_type_encoder_f NG_RANnodeUEXnAPID_encode_jer; +oer_type_decoder_f NG_RANnodeUEXnAPID_decode_oer; +oer_type_encoder_f NG_RANnodeUEXnAPID_encode_oer; per_type_decoder_f NG_RANnodeUEXnAPID_decode_uper; per_type_encoder_f NG_RANnodeUEXnAPID_encode_uper; per_type_decoder_f NG_RANnodeUEXnAPID_decode_aper; diff --git a/e2sm/headers/NGENB-CU-UE-W1AP-ID.h b/e2sm/headers/NGENB-CU-UE-W1AP-ID.h index d8f0110..1076b04 100644 --- a/e2sm/headers/NGENB-CU-UE-W1AP-ID.h +++ b/e2sm/headers/NGENB-CU-UE-W1AP-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _NGENB_CU_UE_W1AP_ID_H_ @@ -32,6 +32,9 @@ ber_type_decoder_f NGENB_CU_UE_W1AP_ID_decode_ber; der_type_encoder_f NGENB_CU_UE_W1AP_ID_encode_der; xer_type_decoder_f NGENB_CU_UE_W1AP_ID_decode_xer; xer_type_encoder_f NGENB_CU_UE_W1AP_ID_encode_xer; +jer_type_encoder_f NGENB_CU_UE_W1AP_ID_encode_jer; +oer_type_decoder_f NGENB_CU_UE_W1AP_ID_decode_oer; +oer_type_encoder_f NGENB_CU_UE_W1AP_ID_encode_oer; per_type_decoder_f NGENB_CU_UE_W1AP_ID_decode_uper; per_type_encoder_f NGENB_CU_UE_W1AP_ID_encode_uper; per_type_decoder_f NGENB_CU_UE_W1AP_ID_decode_aper; diff --git a/e2sm/headers/NGENB-DU-ID.h b/e2sm/headers/NGENB-DU-ID.h index 8620e6a..4f44f59 100644 --- a/e2sm/headers/NGENB-DU-ID.h +++ b/e2sm/headers/NGENB-DU-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _NGENB_DU_ID_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f NGENB_DU_ID_decode_ber; der_type_encoder_f NGENB_DU_ID_encode_der; xer_type_decoder_f NGENB_DU_ID_decode_xer; xer_type_encoder_f NGENB_DU_ID_encode_xer; +jer_type_encoder_f NGENB_DU_ID_encode_jer; +oer_type_decoder_f NGENB_DU_ID_decode_oer; +oer_type_encoder_f NGENB_DU_ID_encode_oer; per_type_decoder_f NGENB_DU_ID_decode_uper; per_type_encoder_f NGENB_DU_ID_encode_uper; per_type_decoder_f NGENB_DU_ID_decode_aper; diff --git a/e2sm/headers/NI-Type.h b/e2sm/headers/NI-Type.h deleted file mode 100644 index c9df7da..0000000 --- a/e2sm/headers/NI-Type.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/NR-ARFCN.h b/e2sm/headers/NR-ARFCN.h index 53b6e94..330c188 100644 --- a/e2sm/headers/NR-ARFCN.h +++ b/e2sm/headers/NR-ARFCN.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _NR_ARFCN_H_ @@ -13,15 +13,26 @@ /* Including external dependencies */ #include "NativeInteger.h" +#include "asn_SEQUENCE_OF.h" +#include "constr_SEQUENCE_OF.h" #include "constr_SEQUENCE.h" #ifdef __cplusplus extern "C" { #endif +/* Forward declarations */ +struct FreqBandNrItem; + /* NR-ARFCN */ typedef struct NR_ARFCN { long nRARFCN; + struct NR_ARFCN__freqBandListNr { + A_SEQUENCE_OF(struct FreqBandNrItem) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } freqBandListNr; /* * This type is extensible, * possible extensions are below. @@ -34,7 +45,7 @@ typedef struct NR_ARFCN { /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_NR_ARFCN; extern asn_SEQUENCE_specifics_t asn_SPC_NR_ARFCN_specs_1; -extern asn_TYPE_member_t asn_MBR_NR_ARFCN_1[1]; +extern asn_TYPE_member_t asn_MBR_NR_ARFCN_1[2]; #ifdef __cplusplus } diff --git a/e2sm/headers/NR-CGI.h b/e2sm/headers/NR-CGI.h index 79dac62..1d72cee 100644 --- a/e2sm/headers/NR-CGI.h +++ b/e2sm/headers/NR-CGI.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _NR_CGI_H_ diff --git a/e2sm/headers/NR-PCI.h b/e2sm/headers/NR-PCI.h index 14da2df..aeb89cb 100644 --- a/e2sm/headers/NR-PCI.h +++ b/e2sm/headers/NR-PCI.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _NR_PCI_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f NR_PCI_decode_ber; der_type_encoder_f NR_PCI_encode_der; xer_type_decoder_f NR_PCI_decode_xer; xer_type_encoder_f NR_PCI_encode_xer; +jer_type_encoder_f NR_PCI_encode_jer; +oer_type_decoder_f NR_PCI_decode_oer; +oer_type_encoder_f NR_PCI_encode_oer; per_type_decoder_f NR_PCI_decode_uper; per_type_encoder_f NR_PCI_encode_uper; per_type_decoder_f NR_PCI_decode_aper; diff --git a/e2sm/headers/NRCGI.h b/e2sm/headers/NRCGI.h deleted file mode 100644 index 2f80a5a..0000000 --- a/e2sm/headers/NRCGI.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/NRCellIdentity.h b/e2sm/headers/NRCellIdentity.h index 5e140d5..c23355a 100644 --- a/e2sm/headers/NRCellIdentity.h +++ b/e2sm/headers/NRCellIdentity.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _NRCellIdentity_H_ @@ -31,6 +31,9 @@ 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; +jer_type_encoder_f NRCellIdentity_encode_jer; +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; diff --git a/e2sm/headers/NRFrequencyBand-List.h b/e2sm/headers/NRFrequencyBand-List.h deleted file mode 100644 index 9bee34d..0000000 --- a/e2sm/headers/NRFrequencyBand-List.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#ifndef _NRFrequencyBand_List_H_ -#define _NRFrequencyBand_List_H_ - - -#include "asn_application.h" - -/* Including external dependencies */ -#include "asn_SEQUENCE_OF.h" -#include "constr_SEQUENCE_OF.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Forward declarations */ -struct NRFrequencyBandItem; - -/* NRFrequencyBand-List */ -typedef struct NRFrequencyBand_List { - A_SEQUENCE_OF(struct NRFrequencyBandItem) list; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} NRFrequencyBand_List_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_NRFrequencyBand_List; -extern asn_SET_OF_specifics_t asn_SPC_NRFrequencyBand_List_specs_1; -extern asn_TYPE_member_t asn_MBR_NRFrequencyBand_List_1[1]; -extern asn_per_constraints_t asn_PER_type_NRFrequencyBand_List_constr_1; - -#ifdef __cplusplus -} -#endif - -#endif /* _NRFrequencyBand_List_H_ */ -#include "asn_internal.h" diff --git a/e2sm/headers/NRFrequencyBandItem.h b/e2sm/headers/NRFrequencyBandItem.h deleted file mode 100644 index 0970b9b..0000000 --- a/e2sm/headers/NRFrequencyBandItem.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#ifndef _NRFrequencyBandItem_H_ -#define _NRFrequencyBandItem_H_ - - -#include "asn_application.h" - -/* Including external dependencies */ -#include "NativeInteger.h" -#include "SupportedSULBandList.h" -#include "constr_SEQUENCE.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* NRFrequencyBandItem */ -typedef struct NRFrequencyBandItem { - long freqBandIndicatorNr; - SupportedSULBandList_t supportedSULBandList; - /* - * This type is extensible, - * possible extensions are below. - */ - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} NRFrequencyBandItem_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_NRFrequencyBandItem; -extern asn_SEQUENCE_specifics_t asn_SPC_NRFrequencyBandItem_specs_1; -extern asn_TYPE_member_t asn_MBR_NRFrequencyBandItem_1[2]; - -#ifdef __cplusplus -} -#endif - -#endif /* _NRFrequencyBandItem_H_ */ -#include "asn_internal.h" diff --git a/e2sm/headers/NRFrequencyInfo.h b/e2sm/headers/NRFrequencyInfo.h deleted file mode 100644 index 80a8af5..0000000 --- a/e2sm/headers/NRFrequencyInfo.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#ifndef _NRFrequencyInfo_H_ -#define _NRFrequencyInfo_H_ - - -#include "asn_application.h" - -/* Including external dependencies */ -#include "NR-ARFCN.h" -#include "NRFrequencyBand-List.h" -#include "NRFrequencyShift7p5khz.h" -#include "constr_SEQUENCE.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* NRFrequencyInfo */ -typedef struct NRFrequencyInfo { - NR_ARFCN_t nrARFCN; - NRFrequencyBand_List_t frequencyBand_List; - NRFrequencyShift7p5khz_t *frequencyShift7p5khz; /* OPTIONAL */ - /* - * This type is extensible, - * possible extensions are below. - */ - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} NRFrequencyInfo_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_NRFrequencyInfo; - -#ifdef __cplusplus -} -#endif - -#endif /* _NRFrequencyInfo_H_ */ -#include "asn_internal.h" diff --git a/e2sm/headers/NRFrequencyShift7p5khz.h b/e2sm/headers/NRFrequencyShift7p5khz.h deleted file mode 100644 index a881515..0000000 --- a/e2sm/headers/NRFrequencyShift7p5khz.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#ifndef _NRFrequencyShift7p5khz_H_ -#define _NRFrequencyShift7p5khz_H_ - - -#include "asn_application.h" - -/* Including external dependencies */ -#include "NativeEnumerated.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Dependencies */ -typedef enum NRFrequencyShift7p5khz { - NRFrequencyShift7p5khz_false = 0, - NRFrequencyShift7p5khz_true = 1 - /* - * Enumeration is extensible - */ -} e_NRFrequencyShift7p5khz; - -/* NRFrequencyShift7p5khz */ -typedef long NRFrequencyShift7p5khz_t; - -/* Implementation */ -extern asn_per_constraints_t asn_PER_type_NRFrequencyShift7p5khz_constr_1; -extern asn_TYPE_descriptor_t asn_DEF_NRFrequencyShift7p5khz; -extern const asn_INTEGER_specifics_t asn_SPC_NRFrequencyShift7p5khz_specs_1; -asn_struct_free_f NRFrequencyShift7p5khz_free; -asn_struct_print_f NRFrequencyShift7p5khz_print; -asn_constr_check_f NRFrequencyShift7p5khz_constraint; -ber_type_decoder_f NRFrequencyShift7p5khz_decode_ber; -der_type_encoder_f NRFrequencyShift7p5khz_encode_der; -xer_type_decoder_f NRFrequencyShift7p5khz_decode_xer; -xer_type_encoder_f NRFrequencyShift7p5khz_encode_xer; -per_type_decoder_f NRFrequencyShift7p5khz_decode_uper; -per_type_encoder_f NRFrequencyShift7p5khz_encode_uper; -per_type_decoder_f NRFrequencyShift7p5khz_decode_aper; -per_type_encoder_f NRFrequencyShift7p5khz_encode_aper; - -#ifdef __cplusplus -} -#endif - -#endif /* _NRFrequencyShift7p5khz_H_ */ -#include "asn_internal.h" diff --git a/e2sm/headers/NULL.h b/e2sm/headers/NULL.h index 802d12c..7264475 100644 --- a/e2sm/headers/NULL.h +++ b/e2sm/headers/NULL.h @@ -6,37 +6,61 @@ #define ASN_TYPE_NULL_H #include -#include #ifdef __cplusplus extern "C" { #endif /* - * The value of the NULL type is meaningless: see BOOLEAN if you want to - * carry true/false semantics. + * The value of the NULL type is meaningless. + * Use the BOOLEAN type if you need to carry true/false semantics. */ typedef int NULL_t; extern asn_TYPE_descriptor_t asn_DEF_NULL; extern asn_TYPE_operation_t asn_OP_NULL; +asn_struct_free_f NULL_free; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f NULL_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f NULL_compare; + +#define NULL_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +ber_type_decoder_f NULL_decode_ber; der_type_encoder_f NULL_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f NULL_decode_xer; xer_type_encoder_f NULL_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f NULL_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f NULL_decode_oer; oer_type_encoder_f NULL_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f NULL_decode_uper; per_type_encoder_f NULL_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f NULL_decode_aper; per_type_encoder_f NULL_encode_aper; -asn_random_fill_f NULL_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ -#define NULL_free BOOLEAN_free -#define NULL_decode_ber BOOLEAN_decode_ber -#define NULL_constraint asn_generic_no_constraint +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f NULL_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2sm/headers/NativeEnumerated.h b/e2sm/headers/NativeEnumerated.h index 459f0e6..0c711e3 100644 --- a/e2sm/headers/NativeEnumerated.h +++ b/e2sm/headers/NativeEnumerated.h @@ -21,22 +21,53 @@ extern "C" { extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; extern asn_TYPE_operation_t asn_OP_NativeEnumerated; +#define NativeEnumerated_free NativeInteger_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define NativeEnumerated_print NativeInteger_print +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define NativeEnumerated_compare NativeInteger_compare + +#define NativeEnumerated_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define NativeEnumerated_decode_ber NativeInteger_decode_ber +#define NativeEnumerated_encode_der NativeInteger_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define NativeEnumerated_decode_xer NativeInteger_decode_xer xer_type_encoder_f NativeEnumerated_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f NativeEnumerated_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f NativeEnumerated_decode_oer; oer_type_encoder_f NativeEnumerated_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f NativeEnumerated_decode_uper; per_type_encoder_f NativeEnumerated_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f NativeEnumerated_decode_aper; per_type_encoder_f NativeEnumerated_encode_aper; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ -#define NativeEnumerated_free NativeInteger_free -#define NativeEnumerated_print NativeInteger_print -#define NativeEnumerated_compare NativeInteger_compare +#if !defined(ASN_DISABLE_RFILL_SUPPORT) #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 +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +int NativeEnumerated__compar_value2enum( + const void *ap, + const void *bp); +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2sm/headers/NativeInteger.h b/e2sm/headers/NativeInteger.h index c74406a..3a47c11 100644 --- a/e2sm/headers/NativeInteger.h +++ b/e2sm/headers/NativeInteger.h @@ -22,22 +22,47 @@ extern "C" { extern asn_TYPE_descriptor_t asn_DEF_NativeInteger; extern asn_TYPE_operation_t asn_OP_NativeInteger; -asn_struct_free_f NativeInteger_free; +asn_struct_free_f NativeInteger_free; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f NativeInteger_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f NativeInteger_compare; + +#define NativeInteger_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f NativeInteger_decode_ber; der_type_encoder_f NativeInteger_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f NativeInteger_decode_xer; xer_type_encoder_f NativeInteger_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f NativeInteger_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f NativeInteger_decode_oer; oer_type_encoder_f NativeInteger_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f NativeInteger_decode_uper; per_type_encoder_f NativeInteger_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f NativeInteger_decode_aper; per_type_encoder_f NativeInteger_encode_aper; -asn_random_fill_f NativeInteger_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ -#define NativeInteger_constraint asn_generic_no_constraint +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f NativeInteger_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2sm/headers/NativeReal.h b/e2sm/headers/NativeReal.h index 1bfdc96..513876e 100644 --- a/e2sm/headers/NativeReal.h +++ b/e2sm/headers/NativeReal.h @@ -24,22 +24,53 @@ typedef struct asn_NativeReal_specifics_s { extern asn_TYPE_descriptor_t asn_DEF_NativeReal; extern asn_TYPE_operation_t asn_OP_NativeReal; +size_t NativeReal__float_size(const asn_TYPE_descriptor_t *td); +double NativeReal__get_double(const asn_TYPE_descriptor_t *td, + const void *ptr); +ssize_t NativeReal__set(const asn_TYPE_descriptor_t *td, void **sptr, + double d); + asn_struct_free_f NativeReal_free; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f NativeReal_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f NativeReal_compare; + +#define NativeReal_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f NativeReal_decode_ber; der_type_encoder_f NativeReal_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +xer_type_decoder_f NativeReal_decode_xer; +xer_type_encoder_f NativeReal_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f NativeReal_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) +oer_type_decoder_f NativeReal_decode_oer; +oer_type_encoder_f NativeReal_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f NativeReal_decode_uper; per_type_encoder_f NativeReal_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f NativeReal_decode_aper; per_type_encoder_f NativeReal_encode_aper; -oer_type_decoder_f NativeReal_decode_oer; -oer_type_encoder_f NativeReal_encode_oer; -xer_type_decoder_f NativeReal_decode_xer; -xer_type_encoder_f NativeReal_encode_xer; -asn_random_fill_f NativeReal_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ -#define NativeReal_constraint asn_generic_no_constraint +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f NativeReal_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2sm/headers/NgENB-ID.h b/e2sm/headers/NgENB-ID.h index 5c9af18..8dce647 100644 --- a/e2sm/headers/NgENB-ID.h +++ b/e2sm/headers/NgENB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _NgENB_ID_H_ diff --git a/e2sm/headers/NumericString.h b/e2sm/headers/NumericString.h deleted file mode 100644 index 5f33484..0000000 --- a/e2sm/headers/NumericString.h +++ /dev/null @@ -1,37 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _NumericString_H_ -#define _NumericString_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t NumericString_t; /* Implemented via OCTET STRING */ - -extern asn_TYPE_descriptor_t asn_DEF_NumericString; -extern asn_TYPE_operation_t asn_OP_NumericString; - -asn_constr_check_f NumericString_constraint; - -#define NumericString_free OCTET_STRING_free -#define NumericString_print OCTET_STRING_print_utf8 -#define NumericString_compare OCTET_STRING_compare -#define NumericString_decode_ber OCTET_STRING_decode_ber -#define NumericString_encode_der OCTET_STRING_encode_der -#define NumericString_decode_xer OCTET_STRING_decode_xer_utf8 -#define NumericString_encode_xer OCTET_STRING_encode_xer_utf8 -#define NumericString_decode_uper OCTET_STRING_decode_uper -#define NumericString_encode_uper OCTET_STRING_encode_uper -#define NumericString_decode_aper OCTET_STRING_decode_aper -#define NumericString_encode_aper OCTET_STRING_encode_aper - -#ifdef __cplusplus -} -#endif - -#endif /* _NumericString_H_ */ diff --git a/e2sm/headers/OBJECT_IDENTIFIER.h b/e2sm/headers/OBJECT_IDENTIFIER.h index 087c6fd..f878055 100644 --- a/e2sm/headers/OBJECT_IDENTIFIER.h +++ b/e2sm/headers/OBJECT_IDENTIFIER.h @@ -21,23 +21,51 @@ typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t; extern asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER; extern asn_TYPE_operation_t asn_OP_OBJECT_IDENTIFIER; +ssize_t OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st, + asn_app_consume_bytes_f *cb, + void *app_key); + +#define OBJECT_IDENTIFIER_free ASN__PRIMITIVE_TYPE_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f OBJECT_IDENTIFIER_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define OBJECT_IDENTIFIER_compare OCTET_STRING_compare + asn_constr_check_f OBJECT_IDENTIFIER_constraint; -der_type_encoder_f OBJECT_IDENTIFIER_encode_der; + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define OBJECT_IDENTIFIER_decode_ber ber_decode_primitive +#define OBJECT_IDENTIFIER_encode_der der_encode_primitive +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f OBJECT_IDENTIFIER_decode_xer; xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f OBJECT_IDENTIFIER_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) +#define OBJECT_IDENTIFIER_decode_oer oer_decode_primitive +#define OBJECT_IDENTIFIER_encode_oer oer_encode_primitive +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#define OBJECT_IDENTIFIER_decode_uper OCTET_STRING_decode_uper +#define OBJECT_IDENTIFIER_encode_uper OCTET_STRING_encode_uper +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define OBJECT_IDENTIFIER_decode_aper OCTET_STRING_decode_aper +#define OBJECT_IDENTIFIER_encode_aper OCTET_STRING_encode_aper +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) asn_random_fill_f OBJECT_IDENTIFIER_random_fill; - -#define OBJECT_IDENTIFIER_free ASN__PRIMITIVE_TYPE_free -#define OBJECT_IDENTIFIER_compare OCTET_STRING_compare -#define OBJECT_IDENTIFIER_decode_ber ber_decode_primitive -#define OBJECT_IDENTIFIER_encode_der der_encode_primitive -#define OBJECT_IDENTIFIER_decode_oer oer_decode_primitive -#define OBJECT_IDENTIFIER_encode_oer oer_encode_primitive -#define OBJECT_IDENTIFIER_decode_uper OCTET_STRING_decode_uper -#define OBJECT_IDENTIFIER_encode_uper OCTET_STRING_encode_uper -#define OBJECT_IDENTIFIER_decode_aper OCTET_STRING_decode_aper -#define OBJECT_IDENTIFIER_encode_aper OCTET_STRING_encode_aper +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ /********************************** * Some handy conversion routines * diff --git a/e2sm/headers/OCTET_STRING.h b/e2sm/headers/OCTET_STRING.h index c2f8bae..b1ace14 100644 --- a/e2sm/headers/OCTET_STRING.h +++ b/e2sm/headers/OCTET_STRING.h @@ -22,27 +22,73 @@ 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; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f OCTET_STRING_print; asn_struct_print_f OCTET_STRING_print_utf8; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f OCTET_STRING_compare; + +#define OCTET_STRING_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) 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 */ +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +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; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f OCTET_STRING_encode_jer; +jer_type_encoder_f OCTET_STRING_encode_jer_utf8; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f OCTET_STRING_decode_oer; oer_type_encoder_f OCTET_STRING_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f OCTET_STRING_decode_uper; per_type_encoder_f OCTET_STRING_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) 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 +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f OCTET_STRING_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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); + +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); +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ /****************************** * Handy conversion routines. * ******************************/ @@ -95,6 +141,23 @@ size_t OCTET_STRING_random_length_constrained( const asn_TYPE_descriptor_t *, const asn_encoding_constraints_t *, size_t max_length); +#if !defined(ASN_DISABLE_BER_SUPPORT) +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; +}; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + #ifdef __cplusplus } #endif diff --git a/e2sm/headers/OCUCP-PF-Container.h b/e2sm/headers/OCUCP-PF-Container.h deleted file mode 100644 index d292be8..0000000 --- a/e2sm/headers/OCUCP-PF-Container.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/OCUUP-PF-Container.h b/e2sm/headers/OCUUP-PF-Container.h deleted file mode 100644 index 8c4ee06..0000000 --- a/e2sm/headers/OCUUP-PF-Container.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/ODU-PF-Container.h b/e2sm/headers/ODU-PF-Container.h deleted file mode 100644 index f6c1529..0000000 --- a/e2sm/headers/ODU-PF-Container.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/OPEN_TYPE.h b/e2sm/headers/OPEN_TYPE.h index b0d023c..5e97977 100644 --- a/e2sm/headers/OPEN_TYPE.h +++ b/e2sm/headers/OPEN_TYPE.h @@ -6,70 +6,110 @@ #define ASN_OPEN_TYPE_H #include +///////////#include #ifdef __cplusplus extern "C" { #endif +/* + * Decode an Open Type which is potentially constraiend + * by the other members of the parent structure. + */ + +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + #define OPEN_TYPE_free CHOICE_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) #define OPEN_TYPE_print CHOICE_print +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + #define OPEN_TYPE_compare CHOICE_compare + #define OPEN_TYPE_constraint CHOICE_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +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); #define OPEN_TYPE_decode_ber NULL #define OPEN_TYPE_encode_der CHOICE_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +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); #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 +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ -extern asn_TYPE_operation_t asn_OP_OPEN_TYPE; +#if !defined(ASN_DISABLE_JER_SUPPORT) +#define OPEN_TYPE_encode_jer CHOICE_encode_jer +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ -/* - * 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); +#if !defined(ASN_DISABLE_OER_SUPPORT) +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); +#define OPEN_TYPE_decode_oer NULL +#define OPEN_TYPE_encode_oer CHOICE_encode_oer +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) +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); +#define OPEN_TYPE_decode_uper NULL 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); - +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +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); +#define OPEN_TYPE_decode_aper NULL 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); +int OPEN_TYPE_aper_is_unknown_type( + const asn_TYPE_descriptor_t *td, + void *sptr, + const asn_TYPE_member_t *elm); + +asn_dec_rval_t OPEN_TYPE_aper_unknown_type_discard_bytes( + asn_per_data_t *pd); +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +extern asn_TYPE_operation_t asn_OP_OPEN_TYPE; + #ifdef __cplusplus } #endif diff --git a/e2sm/headers/ObjectDescriptor.h b/e2sm/headers/ObjectDescriptor.h index fa1c1fc..852c45d 100644 --- a/e2sm/headers/ObjectDescriptor.h +++ b/e2sm/headers/ObjectDescriptor.h @@ -16,17 +16,36 @@ typedef GraphicString_t ObjectDescriptor_t; /* Implemented via GraphicString */ extern asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor; extern asn_TYPE_operation_t asn_OP_ObjectDescriptor; -#define ObjectDescriptor_free OCTET_STRING_free -#define ObjectDescriptor_print OCTET_STRING_print_utf8 -#define ObjectDescriptor_constraint asn_generic_unknown_constraint -#define ObjectDescriptor_decode_ber OCTET_STRING_decode_ber -#define ObjectDescriptor_encode_der OCTET_STRING_encode_der -#define ObjectDescriptor_decode_xer OCTET_STRING_decode_xer_utf8 -#define ObjectDescriptor_encode_xer OCTET_STRING_encode_xer_utf8 -#define ObjectDescriptor_decode_uper OCTET_STRING_decode_uper -#define ObjectDescriptor_encode_uper OCTET_STRING_encode_uper -#define ObjectDescriptor_decode_aper OCTET_STRING_decode_aper -#define ObjectDescriptor_encode_aper OCTET_STRING_encode_aper +#define ObjectDescriptor_free OCTET_STRING_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define ObjectDescriptor_print OCTET_STRING_print_utf8 +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define ObjectDescriptor_constraint asn_generic_unknown_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define ObjectDescriptor_decode_ber OCTET_STRING_decode_ber +#define ObjectDescriptor_encode_der OCTET_STRING_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define ObjectDescriptor_decode_xer OCTET_STRING_decode_xer_utf8 +#define ObjectDescriptor_encode_xer OCTET_STRING_encode_xer_utf8 +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +#define ObjectDescriptor_encode_jer OCTET_STRING_encode_jer_utf8 +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#define ObjectDescriptor_decode_uper OCTET_STRING_decode_uper +#define ObjectDescriptor_encode_uper OCTET_STRING_encode_uper +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define ObjectDescriptor_decode_aper OCTET_STRING_decode_aper +#define ObjectDescriptor_encode_aper OCTET_STRING_encode_aper +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2sm/headers/PF-Container.h b/e2sm/headers/PF-Container.h deleted file mode 100644 index aa59c71..0000000 --- a/e2sm/headers/PF-Container.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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 - /* Extensions may appear below */ - -} 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; - /* - * This type is extensible, - * possible extensions are below. - */ - } 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/e2sm/headers/PF-ContainerListItem.h b/e2sm/headers/PF-ContainerListItem.h deleted file mode 100644 index b22eac2..0000000 --- a/e2sm/headers/PF-ContainerListItem.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/PLMN-Identity.h b/e2sm/headers/PLMN-Identity.h deleted file mode 100644 index cca2d19..0000000 --- a/e2sm/headers/PLMN-Identity.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/PLMNIdentity.h b/e2sm/headers/PLMNIdentity.h index b1950c6..5b8f141 100644 --- a/e2sm/headers/PLMNIdentity.h +++ b/e2sm/headers/PLMNIdentity.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _PLMNIdentity_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f PLMNIdentity_decode_ber; der_type_encoder_f PLMNIdentity_encode_der; xer_type_decoder_f PLMNIdentity_decode_xer; xer_type_encoder_f PLMNIdentity_encode_xer; +jer_type_encoder_f PLMNIdentity_encode_jer; +oer_type_decoder_f PLMNIdentity_decode_oer; +oer_type_encoder_f PLMNIdentity_encode_oer; per_type_decoder_f PLMNIdentity_decode_uper; per_type_encoder_f PLMNIdentity_encode_uper; per_type_decoder_f PLMNIdentity_decode_aper; diff --git a/e2sm/headers/PM-Containers-List.h b/e2sm/headers/PM-Containers-List.h deleted file mode 100644 index 9b392a5..0000000 --- a/e2sm/headers/PM-Containers-List.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _PM_Containers_List_H_ -#define _PM_Containers_List_H_ - - -#include - -/* Including external dependencies */ -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Forward declarations */ -struct PF_Container; -struct RAN_Container; - -/* PM-Containers-List */ -typedef struct PM_Containers_List { - struct PF_Container *performanceContainer; /* OPTIONAL */ - struct RAN_Container *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/e2sm/headers/PerQCIReportListItem.h b/e2sm/headers/PerQCIReportListItem.h deleted file mode 100644 index 3d135ca..0000000 --- a/e2sm/headers/PerQCIReportListItem.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/PerQCIReportListItemFormat.h b/e2sm/headers/PerQCIReportListItemFormat.h deleted file mode 100644 index b5c3481..0000000 --- a/e2sm/headers/PerQCIReportListItemFormat.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/PlmnID-List.h b/e2sm/headers/PlmnID-List.h deleted file mode 100644 index cba26f7..0000000 --- a/e2sm/headers/PlmnID-List.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/PrintableString.h b/e2sm/headers/PrintableString.h index 8c2b61a..c24861d 100644 --- a/e2sm/headers/PrintableString.h +++ b/e2sm/headers/PrintableString.h @@ -16,19 +16,38 @@ 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; +#define PrintableString_free OCTET_STRING_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define PrintableString_print OCTET_STRING_print_utf8 +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + +#define PrintableString_compare OCTET_STRING_compare + 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 +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define PrintableString_decode_ber OCTET_STRING_decode_ber +#define PrintableString_encode_der OCTET_STRING_encode_der +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define PrintableString_decode_xer OCTET_STRING_decode_xer_utf8 +#define PrintableString_encode_xer OCTET_STRING_encode_xer_utf8 +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +#define PrintableString_encode_jer OCTET_STRING_encode_jer_utf8 +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#define PrintableString_decode_uper OCTET_STRING_decode_uper +#define PrintableString_encode_uper OCTET_STRING_encode_uper +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define PrintableString_decode_aper OCTET_STRING_decode_aper +#define PrintableString_encode_aper OCTET_STRING_encode_aper +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2sm/headers/QCI.h b/e2sm/headers/QCI.h index 4738a97..6e07e6b 100644 --- a/e2sm/headers/QCI.h +++ b/e2sm/headers/QCI.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _QCI_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f QCI_decode_ber; der_type_encoder_f QCI_encode_der; xer_type_decoder_f QCI_decode_xer; xer_type_encoder_f QCI_encode_xer; +jer_type_encoder_f QCI_encode_jer; +oer_type_decoder_f QCI_decode_oer; +oer_type_encoder_f QCI_encode_oer; per_type_decoder_f QCI_decode_uper; per_type_encoder_f QCI_encode_uper; per_type_decoder_f QCI_decode_aper; diff --git a/e2sm/headers/QoSID.h b/e2sm/headers/QoSID.h index 4ec28a4..e1eacf8 100644 --- a/e2sm/headers/QoSID.h +++ b/e2sm/headers/QoSID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _QoSID_H_ diff --git a/e2sm/headers/QosFlowIdentifier.h b/e2sm/headers/QosFlowIdentifier.h index 8e8c709..560e39e 100644 --- a/e2sm/headers/QosFlowIdentifier.h +++ b/e2sm/headers/QosFlowIdentifier.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _QosFlowIdentifier_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f QosFlowIdentifier_decode_ber; der_type_encoder_f QosFlowIdentifier_encode_der; xer_type_decoder_f QosFlowIdentifier_decode_xer; xer_type_encoder_f QosFlowIdentifier_encode_xer; +jer_type_encoder_f QosFlowIdentifier_encode_jer; +oer_type_decoder_f QosFlowIdentifier_decode_oer; +oer_type_encoder_f QosFlowIdentifier_encode_oer; per_type_decoder_f QosFlowIdentifier_decode_uper; per_type_encoder_f QosFlowIdentifier_encode_uper; per_type_decoder_f QosFlowIdentifier_decode_aper; diff --git a/e2sm/headers/RAN-Container.h b/e2sm/headers/RAN-Container.h deleted file mode 100644 index 259c2d5..0000000 --- a/e2sm/headers/RAN-Container.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _RAN_Container_H_ -#define _RAN_Container_H_ - - -#include - -/* Including external dependencies */ -#include "Timestamp.h" -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Dependencies */ -typedef enum RAN_Container__reportContainer_PR { - RAN_Container__reportContainer_PR_NOTHING, /* No components present */ - RAN_Container__reportContainer_PR_oDU_UE, - RAN_Container__reportContainer_PR_oCU_CP_UE, - RAN_Container__reportContainer_PR_oCU_UP_UE - /* Extensions may appear below */ - -} RAN_Container__reportContainer_PR; - -/* Forward declarations */ -struct DU_Usage_Report_Per_UE; -struct CU_CP_Usage_Report_Per_UE; -struct CU_UP_Usage_Report_Per_UE; - -/* RAN-Container */ -typedef struct RAN_Container { - Timestamp_t timestamp; - struct RAN_Container__reportContainer { - RAN_Container__reportContainer_PR present; - union RAN_Container__reportContainer_u { - struct DU_Usage_Report_Per_UE *oDU_UE; - struct CU_CP_Usage_Report_Per_UE *oCU_CP_UE; - struct CU_UP_Usage_Report_Per_UE *oCU_UP_UE; - /* - * This type is extensible, - * possible extensions are below. - */ - } choice; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; - } reportContainer; - /* - * This type is extensible, - * possible extensions are below. - */ - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} RAN_Container_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_RAN_Container; -extern asn_SEQUENCE_specifics_t asn_SPC_RAN_Container_specs_1; -extern asn_TYPE_member_t asn_MBR_RAN_Container_1[2]; - -#ifdef __cplusplus -} -#endif - -#endif /* _RAN_Container_H_ */ -#include diff --git a/e2sm/headers/RANUEID.h b/e2sm/headers/RANUEID.h index 1ef8b24..76c517d 100644 --- a/e2sm/headers/RANUEID.h +++ b/e2sm/headers/RANUEID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RANUEID_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f RANUEID_decode_ber; der_type_encoder_f RANUEID_encode_der; xer_type_decoder_f RANUEID_decode_xer; xer_type_encoder_f RANUEID_encode_xer; +jer_type_encoder_f RANUEID_encode_jer; +oer_type_decoder_f RANUEID_decode_oer; +oer_type_encoder_f RANUEID_encode_oer; per_type_decoder_f RANUEID_decode_uper; per_type_encoder_f RANUEID_encode_uper; per_type_decoder_f RANUEID_decode_aper; diff --git a/e2sm/headers/RANcallProcess-ID-string.h b/e2sm/headers/RANcallProcess-ID-string.h deleted file mode 100644 index 1a8aad0..0000000 --- a/e2sm/headers/RANcallProcess-ID-string.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/RANfunction-Name.h b/e2sm/headers/RANfunction-Name.h index 970d4fb..24a895d 100644 --- a/e2sm/headers/RANfunction-Name.h +++ b/e2sm/headers/RANfunction-Name.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RANfunction_Name_H_ diff --git a/e2sm/headers/REAL.h b/e2sm/headers/REAL.h index fce6714..2f8bf47 100644 --- a/e2sm/headers/REAL.h +++ b/e2sm/headers/REAL.h @@ -8,31 +8,86 @@ #include #include +#define _ISOC99_SOURCE /* For ilogb() and quiet NAN */ +#ifndef _BSD_SOURCE +#define _BSD_SOURCE /* To reintroduce finite(3) */ +#endif +#if defined(__alpha) +#include /* For INFINITY */ +#endif +#include + +#if !(defined(NAN) || defined(INFINITY)) +static volatile double real_zero CC_NOTUSED = 0.0; +#endif +#ifndef NAN +#define NAN (0.0/0.0) +#endif +#ifndef INFINITY +#define INFINITY (1.0/0.0) +#endif + #ifdef __cplusplus extern "C" { #endif +typedef enum specialRealValue { + SRV__NOT_A_NUMBER, + SRV__MINUS_INFINITY, + SRV__PLUS_INFINITY +} specialRealValue_e; +extern struct specialRealValue_s { + char *string; + size_t length; + long dv; +} specialRealValue[3]; + typedef ASN__PRIMITIVE_TYPE_t REAL_t; extern asn_TYPE_descriptor_t asn_DEF_REAL; extern asn_TYPE_operation_t asn_OP_REAL; +#define REAL_free ASN__PRIMITIVE_TYPE_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f REAL_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f REAL_compare; + +#define REAL_constraint asn_generic_no_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define REAL_decode_ber ber_decode_primitive +#define REAL_encode_der der_encode_primitive +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +xer_type_decoder_f REAL_decode_xer; +xer_type_encoder_f REAL_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f REAL_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f REAL_decode_oer; oer_type_encoder_f REAL_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f REAL_decode_uper; per_type_encoder_f REAL_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f REAL_decode_aper; per_type_encoder_f REAL_encode_aper; -xer_type_decoder_f REAL_decode_xer; -xer_type_encoder_f REAL_encode_xer; -asn_random_fill_f REAL_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ -#define REAL_free ASN__PRIMITIVE_TYPE_free, -#define REAL_constraint asn_generic_no_constraint -#define REAL_decode_ber ber_decode_primitive -#define REAL_encode_der der_encode_primitive +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f REAL_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ /*********************************** * Some handy conversion routines. * @@ -44,7 +99,7 @@ ssize_t REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *a * Convert between native double type and REAL representation (DER). * RETURN VALUES: * 0: Value converted successfully - * -1: An error occured while converting the value: invalid format. + * -1: An error occurred while converting the value: invalid format. */ int asn_REAL2double(const REAL_t *real_ptr, double *d); int asn_double2REAL(REAL_t *real_ptr, double d); diff --git a/e2sm/headers/RELATIVE-OID.h b/e2sm/headers/RELATIVE-OID.h deleted file mode 100644 index a51bf51..0000000 --- a/e2sm/headers/RELATIVE-OID.h +++ /dev/null @@ -1,53 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _RELATIVE_OID_H_ -#define _RELATIVE_OID_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Implemented via OBJECT IDENTIFIER */ -typedef OBJECT_IDENTIFIER_t RELATIVE_OID_t; - -extern asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID; -extern asn_TYPE_operation_t asn_OP_RELATIVE_OID; - -asn_struct_print_f RELATIVE_OID_print; -xer_type_decoder_f RELATIVE_OID_decode_xer; -xer_type_encoder_f RELATIVE_OID_encode_xer; -asn_random_fill_f RELATIVE_OID_random_fill; - -#define RELATIVE_OID_free ASN__PRIMITIVE_TYPE_free -#define RELATIVE_OID_compare OCTET_STRING_compare -#define RELATIVE_OID_constraint asn_generic_no_constraint -#define RELATIVE_OID_decode_ber ber_decode_primitive -#define RELATIVE_OID_encode_der der_encode_primitive -#define RELATIVE_OID_decode_oer oer_decode_primitive -#define RELATIVE_OID_encode_oer oer_encode_primitive -#define RELATIVE_OID_decode_uper OCTET_STRING_decode_uper -#define RELATIVE_OID_encode_uper OCTET_STRING_encode_uper -#define RELATIVE_OID_decode_aper OCTET_STRING_decode_aper -#define RELATIVE_OID_encode_aper OCTET_STRING_encode_aper - -/********************************** - * Some handy conversion routines * - **********************************/ - -/* See OBJECT_IDENTIFIER_get_arcs() function in OBJECT_IDENTIFIER.h */ -ssize_t RELATIVE_OID_get_arcs(const RELATIVE_OID_t *, asn_oid_arc_t *arcs, - size_t arcs_count); - -/* See OBJECT_IDENTIFIER_set_arcs() function in OBJECT_IDENTIFIER.h */ -int RELATIVE_OID_set_arcs(RELATIVE_OID_t *, const asn_oid_arc_t *arcs, - size_t arcs_count); - -#ifdef __cplusplus -} -#endif - -#endif /* _RELATIVE_OID_H_ */ diff --git a/e2sm/headers/RIC-EventTriggerStyle-Item.h b/e2sm/headers/RIC-EventTriggerStyle-Item.h index 25b20cd..ff8c370 100644 --- a/e2sm/headers/RIC-EventTriggerStyle-Item.h +++ b/e2sm/headers/RIC-EventTriggerStyle-Item.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RIC_EventTriggerStyle_Item_H_ diff --git a/e2sm/headers/RIC-EventTriggerStyle-List.h b/e2sm/headers/RIC-EventTriggerStyle-List.h deleted file mode 100644 index 543edfb..0000000 --- a/e2sm/headers/RIC-EventTriggerStyle-List.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/RIC-Format-Type.h b/e2sm/headers/RIC-Format-Type.h index d145ebf..9d8db7a 100644 --- a/e2sm/headers/RIC-Format-Type.h +++ b/e2sm/headers/RIC-Format-Type.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RIC_Format_Type_H_ @@ -30,6 +30,9 @@ 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; +jer_type_encoder_f RIC_Format_Type_encode_jer; +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; diff --git a/e2sm/headers/RIC-ReportStyle-Item.h b/e2sm/headers/RIC-ReportStyle-Item.h index 80194fb..f2ff012 100644 --- a/e2sm/headers/RIC-ReportStyle-Item.h +++ b/e2sm/headers/RIC-ReportStyle-Item.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RIC_ReportStyle_Item_H_ diff --git a/e2sm/headers/RIC-ReportStyle-List.h b/e2sm/headers/RIC-ReportStyle-List.h deleted file mode 100644 index accc531..0000000 --- a/e2sm/headers/RIC-ReportStyle-List.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/RIC-Style-Name.h b/e2sm/headers/RIC-Style-Name.h index 351a9db..252b043 100644 --- a/e2sm/headers/RIC-Style-Name.h +++ b/e2sm/headers/RIC-Style-Name.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RIC_Style_Name_H_ @@ -31,6 +31,9 @@ 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; +jer_type_encoder_f RIC_Style_Name_encode_jer; +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; diff --git a/e2sm/headers/RIC-Style-Type.h b/e2sm/headers/RIC-Style-Type.h index 66835d5..386dde7 100644 --- a/e2sm/headers/RIC-Style-Type.h +++ b/e2sm/headers/RIC-Style-Type.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RIC_Style_Type_H_ @@ -30,6 +30,9 @@ 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; +jer_type_encoder_f RIC_Style_Type_encode_jer; +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; diff --git a/e2sm/headers/RRC-MessageID.h b/e2sm/headers/RRC-MessageID.h index ca236a1..a306396 100644 --- a/e2sm/headers/RRC-MessageID.h +++ b/e2sm/headers/RRC-MessageID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RRC_MessageID_H_ diff --git a/e2sm/headers/RRCclass-LTE.h b/e2sm/headers/RRCclass-LTE.h index bad6ee7..485f1d0 100644 --- a/e2sm/headers/RRCclass-LTE.h +++ b/e2sm/headers/RRCclass-LTE.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RRCclass_LTE_H_ @@ -51,6 +51,9 @@ ber_type_decoder_f RRCclass_LTE_decode_ber; der_type_encoder_f RRCclass_LTE_encode_der; xer_type_decoder_f RRCclass_LTE_decode_xer; xer_type_encoder_f RRCclass_LTE_encode_xer; +jer_type_encoder_f RRCclass_LTE_encode_jer; +oer_type_decoder_f RRCclass_LTE_decode_oer; +oer_type_encoder_f RRCclass_LTE_encode_oer; per_type_decoder_f RRCclass_LTE_decode_uper; per_type_encoder_f RRCclass_LTE_encode_uper; per_type_decoder_f RRCclass_LTE_decode_aper; diff --git a/e2sm/headers/RRCclass-NR.h b/e2sm/headers/RRCclass-NR.h index 5af8e62..22f730a 100644 --- a/e2sm/headers/RRCclass-NR.h +++ b/e2sm/headers/RRCclass-NR.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _RRCclass_NR_H_ @@ -47,6 +47,9 @@ ber_type_decoder_f RRCclass_NR_decode_ber; der_type_encoder_f RRCclass_NR_encode_der; xer_type_decoder_f RRCclass_NR_decode_xer; xer_type_encoder_f RRCclass_NR_encode_xer; +jer_type_encoder_f RRCclass_NR_encode_jer; +oer_type_decoder_f RRCclass_NR_decode_oer; +oer_type_encoder_f RRCclass_NR_encode_oer; per_type_decoder_f RRCclass_NR_decode_uper; per_type_encoder_f RRCclass_NR_encode_uper; per_type_decoder_f RRCclass_NR_decode_aper; diff --git a/e2sm/headers/RT-Period-IE.h b/e2sm/headers/RT-Period-IE.h deleted file mode 100644 index a52a304..0000000 --- a/e2sm/headers/RT-Period-IE.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/S-NSSAI.h b/e2sm/headers/S-NSSAI.h index 70caa55..a3ee7e4 100644 --- a/e2sm/headers/S-NSSAI.h +++ b/e2sm/headers/S-NSSAI.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _S_NSSAI_H_ diff --git a/e2sm/headers/SD.h b/e2sm/headers/SD.h index 93603db..5921094 100644 --- a/e2sm/headers/SD.h +++ b/e2sm/headers/SD.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _SD_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f SD_decode_ber; der_type_encoder_f SD_encode_der; xer_type_decoder_f SD_decode_xer; xer_type_encoder_f SD_encode_xer; +jer_type_encoder_f SD_encode_jer; +oer_type_decoder_f SD_decode_oer; +oer_type_encoder_f SD_encode_oer; per_type_decoder_f SD_decode_uper; per_type_encoder_f SD_encode_uper; per_type_decoder_f SD_decode_aper; diff --git a/e2sm/headers/SNSSAI.h b/e2sm/headers/SNSSAI.h deleted file mode 100644 index 7a99e03..0000000 --- a/e2sm/headers/SNSSAI.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/SST.h b/e2sm/headers/SST.h index 28ee41d..d710837 100644 --- a/e2sm/headers/SST.h +++ b/e2sm/headers/SST.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _SST_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f SST_decode_ber; der_type_encoder_f SST_encode_der; xer_type_decoder_f SST_decode_xer; xer_type_encoder_f SST_encode_xer; +jer_type_encoder_f SST_encode_jer; +oer_type_decoder_f SST_decode_oer; +oer_type_encoder_f SST_encode_oer; per_type_decoder_f SST_decode_uper; per_type_encoder_f SST_encode_uper; per_type_decoder_f SST_decode_aper; diff --git a/e2sm/headers/ServedPlmnPerCellListItem.h b/e2sm/headers/ServedPlmnPerCellListItem.h deleted file mode 100644 index a435cc8..0000000 --- a/e2sm/headers/ServedPlmnPerCellListItem.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/ServingCell-ARFCN.h b/e2sm/headers/ServingCell-ARFCN.h index 7071ddb..4306e47 100644 --- a/e2sm/headers/ServingCell-ARFCN.h +++ b/e2sm/headers/ServingCell-ARFCN.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ServingCell_ARFCN_H_ diff --git a/e2sm/headers/ServingCell-PCI.h b/e2sm/headers/ServingCell-PCI.h index 46ef093..df26d0e 100644 --- a/e2sm/headers/ServingCell-PCI.h +++ b/e2sm/headers/ServingCell-PCI.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _ServingCell_PCI_H_ diff --git a/e2sm/headers/SlicePerPlmnPerCellListItem.h b/e2sm/headers/SlicePerPlmnPerCellListItem.h deleted file mode 100644 index abe34bb..0000000 --- a/e2sm/headers/SlicePerPlmnPerCellListItem.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/SliceToReportListItem.h b/e2sm/headers/SliceToReportListItem.h deleted file mode 100644 index 74a2a1d..0000000 --- a/e2sm/headers/SliceToReportListItem.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/SubscriberProfileIDforRFP.h b/e2sm/headers/SubscriberProfileIDforRFP.h index edc5595..742b98b 100644 --- a/e2sm/headers/SubscriberProfileIDforRFP.h +++ b/e2sm/headers/SubscriberProfileIDforRFP.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _SubscriberProfileIDforRFP_H_ @@ -30,6 +30,9 @@ ber_type_decoder_f SubscriberProfileIDforRFP_decode_ber; der_type_encoder_f SubscriberProfileIDforRFP_encode_der; xer_type_decoder_f SubscriberProfileIDforRFP_decode_xer; xer_type_encoder_f SubscriberProfileIDforRFP_encode_xer; +jer_type_encoder_f SubscriberProfileIDforRFP_encode_jer; +oer_type_decoder_f SubscriberProfileIDforRFP_decode_oer; +oer_type_encoder_f SubscriberProfileIDforRFP_encode_oer; per_type_decoder_f SubscriberProfileIDforRFP_decode_uper; per_type_encoder_f SubscriberProfileIDforRFP_encode_uper; per_type_decoder_f SubscriberProfileIDforRFP_decode_aper; diff --git a/e2sm/headers/SupportedSULBandList.h b/e2sm/headers/SupportedSULBandList.h deleted file mode 100644 index df4763d..0000000 --- a/e2sm/headers/SupportedSULBandList.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#ifndef _SupportedSULBandList_H_ -#define _SupportedSULBandList_H_ - - -#include "asn_application.h" - -/* Including external dependencies */ -#include "asn_SEQUENCE_OF.h" -#include "constr_SEQUENCE_OF.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Forward declarations */ -struct SupportedSULFreqBandItem; - -/* SupportedSULBandList */ -typedef struct SupportedSULBandList { - A_SEQUENCE_OF(struct SupportedSULFreqBandItem) list; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} SupportedSULBandList_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_SupportedSULBandList; -extern asn_SET_OF_specifics_t asn_SPC_SupportedSULBandList_specs_1; -extern asn_TYPE_member_t asn_MBR_SupportedSULBandList_1[1]; -extern asn_per_constraints_t asn_PER_type_SupportedSULBandList_constr_1; - -#ifdef __cplusplus -} -#endif - -#endif /* _SupportedSULBandList_H_ */ -#include "asn_internal.h" diff --git a/e2sm/headers/SupportedSULFreqBandItem.h b/e2sm/headers/SupportedSULFreqBandItem.h deleted file mode 100644 index e550541..0000000 --- a/e2sm/headers/SupportedSULFreqBandItem.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#ifndef _SupportedSULFreqBandItem_H_ -#define _SupportedSULFreqBandItem_H_ - - -#include "asn_application.h" - -/* Including external dependencies */ -#include "NativeInteger.h" -#include "constr_SEQUENCE.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* SupportedSULFreqBandItem */ -typedef struct SupportedSULFreqBandItem { - long freqBandIndicatorNr; - /* - * This type is extensible, - * possible extensions are below. - */ - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} SupportedSULFreqBandItem_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_SupportedSULFreqBandItem; -extern asn_SEQUENCE_specifics_t asn_SPC_SupportedSULFreqBandItem_specs_1; -extern asn_TYPE_member_t asn_MBR_SupportedSULFreqBandItem_1[1]; - -#ifdef __cplusplus -} -#endif - -#endif /* _SupportedSULFreqBandItem_H_ */ -#include "asn_internal.h" diff --git a/e2sm/headers/T61String.h b/e2sm/headers/T61String.h deleted file mode 100644 index 9e9e380..0000000 --- a/e2sm/headers/T61String.h +++ /dev/null @@ -1,36 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _T61String_H_ -#define _T61String_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t T61String_t; /* Implemented via OCTET STRING */ - -extern asn_TYPE_descriptor_t asn_DEF_T61String; -extern asn_TYPE_operation_t asn_OP_T61String; - -#define T61String_free OCTET_STRING_free -#define T61String_print OCTET_STRING_print -#define T61String_compare OCTET_STRING_compare -#define T61String_constraint asn_generic_unknown_constraint -#define T61String_decode_ber OCTET_STRING_decode_ber -#define T61String_encode_der OCTET_STRING_encode_der -#define T61String_decode_xer OCTET_STRING_decode_xer_hex -#define T61String_encode_xer OCTET_STRING_encode_xer -#define T61String_decode_uper OCTET_STRING_decode_uper -#define T61String_encode_uper OCTET_STRING_encode_uper -#define T61String_decode_aper OCTET_STRING_decode_aper -#define T61String_encode_aper OCTET_STRING_encode_aper - -#ifdef __cplusplus -} -#endif - -#endif /* _T61String_H_ */ diff --git a/e2sm/headers/TeletexString.h b/e2sm/headers/TeletexString.h deleted file mode 100644 index 9f04aef..0000000 --- a/e2sm/headers/TeletexString.h +++ /dev/null @@ -1,36 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _TeletexString_H_ -#define _TeletexString_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t TeletexString_t; /* Implemented via OCTET STRING */ - -extern asn_TYPE_descriptor_t asn_DEF_TeletexString; -extern asn_TYPE_operation_t asn_OP_TeletexString; - -#define TeletexString_free OCTET_STRING_free -#define TeletexString_print OCTET_STRING_print -#define TeletexString_compare OCTET_STRING_compare -#define TeletexString_constraint asn_generic_unknown_constraint -#define TeletexString_decode_ber OCTET_STRING_decode_ber -#define TeletexString_encode_der OCTET_STRING_encode_der -#define TeletexString_decode_xer OCTET_STRING_decode_xer_hex -#define TeletexString_encode_xer OCTET_STRING_encode_xer -#define TeletexString_decode_uper OCTET_STRING_decode_uper -#define TeletexString_encode_uper OCTET_STRING_encode_uper -#define TeletexString_decode_aper OCTET_STRING_decode_aper -#define TeletexString_encode_aper OCTET_STRING_encode_aper - -#ifdef __cplusplus -} -#endif - -#endif /* _TeletexString_H_ */ diff --git a/e2sm/headers/TestCond-Expression.h b/e2sm/headers/TestCond-Expression.h index fa4d2e5..11fc807 100644 --- a/e2sm/headers/TestCond-Expression.h +++ b/e2sm/headers/TestCond-Expression.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _TestCond_Expression_H_ @@ -44,6 +44,9 @@ ber_type_decoder_f TestCond_Expression_decode_ber; der_type_encoder_f TestCond_Expression_encode_der; xer_type_decoder_f TestCond_Expression_decode_xer; xer_type_encoder_f TestCond_Expression_encode_xer; +jer_type_encoder_f TestCond_Expression_encode_jer; +oer_type_decoder_f TestCond_Expression_decode_oer; +oer_type_encoder_f TestCond_Expression_encode_oer; per_type_decoder_f TestCond_Expression_decode_uper; per_type_encoder_f TestCond_Expression_encode_uper; per_type_decoder_f TestCond_Expression_decode_aper; diff --git a/e2sm/headers/TestCond-Type.h b/e2sm/headers/TestCond-Type.h index 028d211..30eaa54 100644 --- a/e2sm/headers/TestCond-Type.h +++ b/e2sm/headers/TestCond-Type.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _TestCond_Type_H_ diff --git a/e2sm/headers/TestCond-Value.h b/e2sm/headers/TestCond-Value.h index 8c41320..d0f91a3 100644 --- a/e2sm/headers/TestCond-Value.h +++ b/e2sm/headers/TestCond-Value.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _TestCond_Value_H_ diff --git a/e2sm/headers/TestCondInfo.h b/e2sm/headers/TestCondInfo.h index 0262e20..07d4f90 100644 --- a/e2sm/headers/TestCondInfo.h +++ b/e2sm/headers/TestCondInfo.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _TestCondInfo_H_ diff --git a/e2sm/headers/TimeStamp.h b/e2sm/headers/TimeStamp.h index e2d3c57..6e58643 100644 --- a/e2sm/headers/TimeStamp.h +++ b/e2sm/headers/TimeStamp.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _TimeStamp_H_ @@ -31,6 +31,9 @@ ber_type_decoder_f TimeStamp_decode_ber; der_type_encoder_f TimeStamp_encode_der; xer_type_decoder_f TimeStamp_decode_xer; xer_type_encoder_f TimeStamp_encode_xer; +jer_type_encoder_f TimeStamp_encode_jer; +oer_type_decoder_f TimeStamp_decode_oer; +oer_type_encoder_f TimeStamp_encode_oer; per_type_decoder_f TimeStamp_decode_uper; per_type_encoder_f TimeStamp_encode_uper; per_type_decoder_f TimeStamp_decode_aper; diff --git a/e2sm/headers/Timestamp.h b/e2sm/headers/Timestamp.h deleted file mode 100644 index dafc566..0000000 --- a/e2sm/headers/Timestamp.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _Timestamp_H_ -#define _Timestamp_H_ - - -#include - -/* Including external dependencies */ -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Timestamp */ -typedef OCTET_STRING_t Timestamp_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_Timestamp; -asn_struct_free_f Timestamp_free; -asn_struct_print_f Timestamp_print; -asn_constr_check_f Timestamp_constraint; -ber_type_decoder_f Timestamp_decode_ber; -der_type_encoder_f Timestamp_encode_der; -xer_type_decoder_f Timestamp_decode_xer; -xer_type_encoder_f Timestamp_encode_xer; -oer_type_decoder_f Timestamp_decode_oer; -oer_type_encoder_f Timestamp_encode_oer; -per_type_decoder_f Timestamp_decode_uper; -per_type_encoder_f Timestamp_encode_uper; -per_type_decoder_f Timestamp_decode_aper; -per_type_encoder_f Timestamp_encode_aper; - -#ifdef __cplusplus -} -#endif - -#endif /* _Timestamp_H_ */ -#include diff --git a/e2sm/headers/Trigger-ConditionIE-Item.h b/e2sm/headers/Trigger-ConditionIE-Item.h deleted file mode 100644 index fc43153..0000000 --- a/e2sm/headers/Trigger-ConditionIE-Item.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/headers/UE-Report-Type.h b/e2sm/headers/UE-Report-Type.h deleted file mode 100644 index 25a76d5..0000000 --- a/e2sm/headers/UE-Report-Type.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#ifndef _UE_Report_Type_H_ -#define _UE_Report_Type_H_ - - -#include - -/* Including external dependencies */ -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Dependencies */ -typedef enum UE_Report_Type { - UE_Report_Type_oDU_Report_Per_UE = 0, - UE_Report_Type_oCU_CP_Report_Per_UE = 1, - UE_Report_Type_oCU_UP_Report_Per_UE = 2 - /* - * Enumeration is extensible - */ -} e_UE_Report_Type; - -/* UE-Report-Type */ -typedef long UE_Report_Type_t; - -/* Implementation */ -extern asn_per_constraints_t asn_PER_type_UE_Report_Type_constr_1; -extern asn_TYPE_descriptor_t asn_DEF_UE_Report_Type; -extern const asn_INTEGER_specifics_t asn_SPC_UE_Report_Type_specs_1; -asn_struct_free_f UE_Report_Type_free; -asn_struct_print_f UE_Report_Type_print; -asn_constr_check_f UE_Report_Type_constraint; -ber_type_decoder_f UE_Report_Type_decode_ber; -der_type_encoder_f UE_Report_Type_encode_der; -xer_type_decoder_f UE_Report_Type_decode_xer; -xer_type_encoder_f UE_Report_Type_encode_xer; -oer_type_decoder_f UE_Report_Type_decode_oer; -oer_type_encoder_f UE_Report_Type_encode_oer; -per_type_decoder_f UE_Report_Type_decode_uper; -per_type_encoder_f UE_Report_Type_encode_uper; -per_type_decoder_f UE_Report_Type_decode_aper; -per_type_encoder_f UE_Report_Type_encode_aper; - -#ifdef __cplusplus -} -#endif - -#endif /* _UE_Report_Type_H_ */ -#include diff --git a/e2sm/headers/UEID-EN-GNB.h b/e2sm/headers/UEID-EN-GNB.h index c0c4760..6890b62 100644 --- a/e2sm/headers/UEID-EN-GNB.h +++ b/e2sm/headers/UEID-EN-GNB.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_EN_GNB_H_ diff --git a/e2sm/headers/UEID-ENB.h b/e2sm/headers/UEID-ENB.h index ac06374..21332fc 100644 --- a/e2sm/headers/UEID-ENB.h +++ b/e2sm/headers/UEID-ENB.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_ENB_H_ diff --git a/e2sm/headers/UEID-GNB-CU-CP-E1AP-ID-Item.h b/e2sm/headers/UEID-GNB-CU-CP-E1AP-ID-Item.h index 2e7abac..538869e 100644 --- a/e2sm/headers/UEID-GNB-CU-CP-E1AP-ID-Item.h +++ b/e2sm/headers/UEID-GNB-CU-CP-E1AP-ID-Item.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_GNB_CU_CP_E1AP_ID_Item_H_ diff --git a/e2sm/headers/UEID-GNB-CU-CP-E1AP-ID-List.h b/e2sm/headers/UEID-GNB-CU-CP-E1AP-ID-List.h index 234a586..8975e95 100644 --- a/e2sm/headers/UEID-GNB-CU-CP-E1AP-ID-List.h +++ b/e2sm/headers/UEID-GNB-CU-CP-E1AP-ID-List.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_GNB_CU_CP_E1AP_ID_List_H_ diff --git a/e2sm/headers/UEID-GNB-CU-CP-F1AP-ID-Item.h b/e2sm/headers/UEID-GNB-CU-CP-F1AP-ID-Item.h index d5760cd..c2ea8b6 100644 --- a/e2sm/headers/UEID-GNB-CU-CP-F1AP-ID-Item.h +++ b/e2sm/headers/UEID-GNB-CU-CP-F1AP-ID-Item.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_GNB_CU_CP_F1AP_ID_Item_H_ diff --git a/e2sm/headers/UEID-GNB-CU-F1AP-ID-List.h b/e2sm/headers/UEID-GNB-CU-F1AP-ID-List.h index 7c1da53..6ae84e0 100644 --- a/e2sm/headers/UEID-GNB-CU-F1AP-ID-List.h +++ b/e2sm/headers/UEID-GNB-CU-F1AP-ID-List.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_GNB_CU_F1AP_ID_List_H_ diff --git a/e2sm/headers/UEID-GNB-CU-UP.h b/e2sm/headers/UEID-GNB-CU-UP.h index 8d7ee50..b629301 100644 --- a/e2sm/headers/UEID-GNB-CU-UP.h +++ b/e2sm/headers/UEID-GNB-CU-UP.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_GNB_CU_UP_H_ diff --git a/e2sm/headers/UEID-GNB-DU.h b/e2sm/headers/UEID-GNB-DU.h index e82d119..da3fa03 100644 --- a/e2sm/headers/UEID-GNB-DU.h +++ b/e2sm/headers/UEID-GNB-DU.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_GNB_DU_H_ diff --git a/e2sm/headers/UEID-GNB.h b/e2sm/headers/UEID-GNB.h index e2bfcf1..906b3af 100644 --- a/e2sm/headers/UEID-GNB.h +++ b/e2sm/headers/UEID-GNB.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_GNB_H_ @@ -26,7 +26,6 @@ extern "C" { struct UEID_GNB_CU_F1AP_ID_List; struct UEID_GNB_CU_CP_E1AP_ID_List; struct GlobalGNB_ID; -struct GlobalNGRANNodeID; /* UEID-GNB */ typedef struct UEID_GNB { @@ -41,7 +40,6 @@ typedef struct UEID_GNB { * This type is extensible, * possible extensions are below. */ - struct GlobalNGRANNodeID *globalNG_RANNode_ID; /* OPTIONAL */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; @@ -50,7 +48,7 @@ typedef struct UEID_GNB { /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_UEID_GNB; extern asn_SEQUENCE_specifics_t asn_SPC_UEID_GNB_specs_1; -extern asn_TYPE_member_t asn_MBR_UEID_GNB_1[8]; +extern asn_TYPE_member_t asn_MBR_UEID_GNB_1[7]; #ifdef __cplusplus } diff --git a/e2sm/headers/UEID-NG-ENB-DU.h b/e2sm/headers/UEID-NG-ENB-DU.h index 549513d..ecdf1b3 100644 --- a/e2sm/headers/UEID-NG-ENB-DU.h +++ b/e2sm/headers/UEID-NG-ENB-DU.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_NG_ENB_DU_H_ diff --git a/e2sm/headers/UEID-NG-ENB.h b/e2sm/headers/UEID-NG-ENB.h index fda548b..387639c 100644 --- a/e2sm/headers/UEID-NG-ENB.h +++ b/e2sm/headers/UEID-NG-ENB.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_NG_ENB_H_ @@ -24,7 +24,6 @@ extern "C" { /* Forward declarations */ struct GlobalNgENB_ID; -struct GlobalNGRANNodeID; /* UEID-NG-ENB */ typedef struct UEID_NG_ENB { @@ -37,7 +36,6 @@ typedef struct UEID_NG_ENB { * This type is extensible, * possible extensions are below. */ - struct GlobalNGRANNodeID *globalNG_RANNode_ID; /* OPTIONAL */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; @@ -46,7 +44,7 @@ typedef struct UEID_NG_ENB { /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_UEID_NG_ENB; extern asn_SEQUENCE_specifics_t asn_SPC_UEID_NG_ENB_specs_1; -extern asn_TYPE_member_t asn_MBR_UEID_NG_ENB_1[6]; +extern asn_TYPE_member_t asn_MBR_UEID_NG_ENB_1[5]; #ifdef __cplusplus } diff --git a/e2sm/headers/UEID.h b/e2sm/headers/UEID.h index 8e4714c..18914c6 100644 --- a/e2sm/headers/UEID.h +++ b/e2sm/headers/UEID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #ifndef _UEID_H_ diff --git a/e2sm/headers/UTCTime.h b/e2sm/headers/UTCTime.h deleted file mode 100644 index 295f156..0000000 --- a/e2sm/headers/UTCTime.h +++ /dev/null @@ -1,50 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _UTCTime_H_ -#define _UTCTime_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t UTCTime_t; /* Implemented via OCTET STRING */ - -extern asn_TYPE_descriptor_t asn_DEF_UTCTime; -extern asn_TYPE_operation_t asn_OP_UTCTime; - -asn_struct_print_f UTCTime_print; -asn_struct_compare_f UTCTime_compare; -asn_constr_check_f UTCTime_constraint; -xer_type_encoder_f UTCTime_encode_xer; -asn_random_fill_f UTCTime_random_fill; - -#define UTCTime_free OCTET_STRING_free -#define UTCTime_decode_ber OCTET_STRING_decode_ber -#define UTCTime_encode_der OCTET_STRING_encode_der -#define UTCTime_decode_xer OCTET_STRING_decode_xer_utf8 -#define UTCTime_decode_uper OCTET_STRING_decode_uper -#define UTCTime_encode_uper OCTET_STRING_encode_uper -#define UTCTime_decode_aper OCTET_STRING_decode_aper -#define UTCTime_encode_aper OCTET_STRING_encode_aper - -/*********************** - * Some handy helpers. * - ***********************/ - -struct tm; /* */ - -/* See asn_GT2time() in GeneralizedTime.h */ -time_t asn_UT2time(const UTCTime_t *, struct tm *_optional_tm4fill, int as_gmt); - -/* See asn_time2GT() in GeneralizedTime.h */ -UTCTime_t *asn_time2UT(UTCTime_t *__opt_ut, const struct tm *, int force_gmt); - -#ifdef __cplusplus -} -#endif - -#endif /* _UTCTime_H_ */ diff --git a/e2sm/headers/UTF8String.h b/e2sm/headers/UTF8String.h deleted file mode 100644 index 7ad9c82..0000000 --- a/e2sm/headers/UTF8String.h +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _UTF8String_H_ -#define _UTF8String_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t UTF8String_t; /* Implemented via OCTET STRING */ - -extern asn_TYPE_descriptor_t asn_DEF_UTF8String; -extern asn_TYPE_operation_t asn_OP_UTF8String; - -asn_struct_print_f UTF8String_print; -asn_constr_check_f UTF8String_constraint; -asn_random_fill_f UTF8String_random_fill; - -#define UTF8String_free OCTET_STRING_free -#define UTF8String_compare OCTET_STRING_compare -#define UTF8String_constraint UTF8String_constraint -#define UTF8String_decode_ber OCTET_STRING_decode_ber -#define UTF8String_encode_der OCTET_STRING_encode_der -#define UTF8String_decode_xer OCTET_STRING_decode_xer_utf8 -#define UTF8String_encode_xer OCTET_STRING_encode_xer_utf8 -#define UTF8String_decode_uper OCTET_STRING_decode_uper -#define UTF8String_encode_uper OCTET_STRING_encode_uper -#define UTF8String_decode_aper OCTET_STRING_decode_aper -#define UTF8String_encode_aper OCTET_STRING_encode_aper - -/* - * Returns length of the given UTF-8 string in characters, - * or a negative error code: - * -1: UTF-8 sequence truncated - * -2: Illegal UTF-8 sequence start - * -3: Continuation expectation failed - * -4: Not minimal length encoding - * -5: Invalid arguments - */ -ssize_t UTF8String_length(const UTF8String_t *st); - -/* - * Convert the UTF-8 string into a sequence of wide characters. - * Returns the number of characters necessary. - * Returned value might be greater than dstlen. - * In case of conversion error, 0 is returned. - * - * If st points to a valid UTF-8 string, calling - * UTF8String_to_wcs(st, 0, 0); - * is equivalent to - * UTF8String_length(const UTF8String_t *st); - */ -size_t UTF8String_to_wcs(const UTF8String_t *st, uint32_t *dst, size_t dstlen); - -#ifdef __cplusplus -} -#endif - -#endif /* _UTF8String_H_ */ diff --git a/e2sm/headers/UniversalString.h b/e2sm/headers/UniversalString.h deleted file mode 100644 index 510807a..0000000 --- a/e2sm/headers/UniversalString.h +++ /dev/null @@ -1,38 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _UniversalString_H_ -#define _UniversalString_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t UniversalString_t; /* Implemented via OCTET STRING */ - -extern asn_TYPE_descriptor_t asn_DEF_UniversalString; -extern asn_TYPE_operation_t asn_OP_UniversalString; -extern asn_OCTET_STRING_specifics_t asn_SPC_UniversalString_specs; - -asn_struct_print_f UniversalString_print; /* Human-readable output */ -asn_constr_check_f UniversalString_constraint; -xer_type_decoder_f UniversalString_decode_xer; -xer_type_encoder_f UniversalString_encode_xer; - -#define UniversalString_free OCTET_STRING_free -#define UniversalString_compare OCTET_STRING_compare -#define UniversalString_decode_ber OCTET_STRING_decode_ber -#define UniversalString_encode_der OCTET_STRING_encode_der -#define UniversalString_decode_uper OCTET_STRING_decode_uper -#define UniversalString_encode_uper OCTET_STRING_encode_uper -#define UniversalString_decode_aper OCTET_STRING_decode_aper -#define UniversalString_encode_aper OCTET_STRING_encode_aper - -#ifdef __cplusplus -} -#endif - -#endif /* _UniversalString_H_ */ diff --git a/e2sm/headers/VideotexString.h b/e2sm/headers/VideotexString.h deleted file mode 100644 index b535389..0000000 --- a/e2sm/headers/VideotexString.h +++ /dev/null @@ -1,36 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _VideotexString_H_ -#define _VideotexString_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t VideotexString_t; /* Implemented via OCTET STRING */ - -extern asn_TYPE_descriptor_t asn_DEF_VideotexString; -extern asn_TYPE_operation_t asn_OP_VideotexString; - -#define VideotexString_free OCTET_STRING_free -#define VideotexString_print OCTET_STRING_print -#define VideotexString_compare OCTET_STRING_compare -#define VideotexString_constraint asn_generic_unknown_constraint -#define VideotexString_decode_ber OCTET_STRING_decode_ber -#define VideotexString_encode_der OCTET_STRING_encode_der -#define VideotexString_decode_xer OCTET_STRING_decode_xer_hex -#define VideotexString_encode_xer OCTET_STRING_encode_xer -#define VideotexString_decode_uper OCTET_STRING_decode_uper -#define VideotexString_encode_uper OCTET_STRING_encode_uper -#define VideotexString_decode_aper OCTET_STRING_decode_aper -#define VideotexString_encode_aper OCTET_STRING_encode_aper - -#ifdef __cplusplus -} -#endif - -#endif /* _VideotexString_H_ */ diff --git a/e2sm/headers/VisibleString.h b/e2sm/headers/VisibleString.h deleted file mode 100644 index ad5f713..0000000 --- a/e2sm/headers/VisibleString.h +++ /dev/null @@ -1,38 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _VisibleString_H_ -#define _VisibleString_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef OCTET_STRING_t VisibleString_t; /* Implemented via OCTET STRING */ - -extern asn_TYPE_descriptor_t asn_DEF_VisibleString; -extern asn_TYPE_operation_t asn_OP_VisibleString; - -asn_constr_check_f VisibleString_constraint; - -#define VisibleString_free OCTET_STRING_free -#define VisibleString_print OCTET_STRING_print -#define VisibleString_compare OCTET_STRING_compare -#define VisibleString_constraint VisibleString_constraint -#define VisibleString_decode_ber OCTET_STRING_decode_ber -#define VisibleString_encode_der OCTET_STRING_encode_der -#define VisibleString_decode_xer OCTET_STRING_decode_xer_hex -#define VisibleString_encode_xer OCTET_STRING_encode_xer -#define VisibleString_decode_uper OCTET_STRING_decode_uper -#define VisibleString_encode_uper OCTET_STRING_encode_uper -#define VisibleString_decode_aper OCTET_STRING_decode_aper -#define VisibleString_encode_aper OCTET_STRING_encode_aper - -#ifdef __cplusplus -} -#endif - -#endif /* _VisibleString_H_ */ diff --git a/e2sm/headers/aper_decoder.h b/e2sm/headers/aper_decoder.h new file mode 100644 index 0000000..10352c7 --- /dev/null +++ b/e2sm/headers/aper_decoder.h @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _APER_DECODER_H_ +#define _APER_DECODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * 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 */ + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _APER_DECODER_H_ */ diff --git a/e2sm/headers/aper_encoder.h b/e2sm/headers/aper_encoder.h new file mode 100644 index 0000000..957b0bd --- /dev/null +++ b/e2sm/headers/aper_encoder.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 2006-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _APER_ENCODER_H_ +#define _APER_ENCODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Aligned 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 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 aper_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 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 aper_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 aper_encode() and aper_encode_to_buffer(). + */ +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 +); + +#ifdef __cplusplus +} +#endif + +#endif /* _APER_ENCODER_H_ */ diff --git a/e2sm/headers/aper_opentype.h b/e2sm/headers/aper_opentype.h new file mode 100644 index 0000000..451b01c --- /dev/null +++ b/e2sm/headers/aper_opentype.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2007-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _APER_OPENTYPE_H_ +#define _APER_OPENTYPE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +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 /* _APER_OPENTYPE_H_ */ diff --git a/e2sm/headers/aper_support.h b/e2sm/headers/aper_support.h new file mode 100644 index 0000000..a372445 --- /dev/null +++ b/e2sm/headers/aper_support.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _APER_SUPPORT_H_ +#define _APER_SUPPORT_H_ + +#include /* Platform-specific types */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * X.691 (08/2015) #11.9 "General rules for encoding a length determinant" + * Get the length "n" from the Aligned PER stream. + */ +ssize_t aper_get_length(asn_per_data_t *pd, ssize_t lb, ssize_t ub, + int effective_bound_bits, int *repeat); + +/* + * Get the normally small length "n". + */ +ssize_t aper_get_nslength(asn_per_data_t *pd); + +/* + * Get the normally small non-negative whole number. + */ +ssize_t aper_get_nsnnwn(asn_per_data_t *pd, int range); + +/* + * X.691 (08/2015) #11.9 "General rules for encoding a length determinant" + * Put the length "n" to the Aligned PER stream. + * If (opt_need_eom) is given, it will be set to 1 if final 0-n is needed. + * In that case, invoke aper_put_length(po, -1, -1, 0, NULL) after encoding the + * last block. + * This function returns the number of units which may be flushed + * in the next units saving iteration. + */ +ssize_t aper_put_length(asn_per_outp_t *po, ssize_t lb, ssize_t ub, size_t n, + int *opt_need_eom); + +/* 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 aper_put_nslength(asn_per_outp_t *po, size_t length); + +/* + * Put the normally small non-negative whole number. + */ +int aper_put_nsnnwn(asn_per_outp_t *po, int range, int number); + +#ifdef __cplusplus +} +#endif + +#endif /* _APER_SUPPORT_H_ */ diff --git a/e2sm/headers/asn_application.h b/e2sm/headers/asn_application.h index 034f646..bf10cd3 100644 --- a/e2sm/headers/asn_application.h +++ b/e2sm/headers/asn_application.h @@ -10,6 +10,7 @@ #include "asn_system.h" /* for platform-dependent types */ #include "asn_codecs.h" /* for ASN.1 codecs specifics */ +#include "asn_config.h" #ifdef __cplusplus extern "C" { @@ -59,7 +60,8 @@ enum asn_transfer_syntax { * CANONICAL-XER is a more strict variant of BASIC-XER. */ ATS_BASIC_XER, - ATS_CANONICAL_XER + ATS_CANONICAL_XER, + ATS_JER, }; /* diff --git a/e2sm/headers/asn_bit_data.h b/e2sm/headers/asn_bit_data.h index 59de7af..f14714b 100644 --- a/e2sm/headers/asn_bit_data.h +++ b/e2sm/headers/asn_bit_data.h @@ -36,7 +36,7 @@ asn_bit_data_t *asn_bit_data_new_contiguous(const void *data, size_t size_bits); */ int32_t asn_get_few_bits(asn_bit_data_t *, int get_nbits); -/* Undo the immediately preceeding "get_few_bits" operation */ +/* Undo the immediately preceding "get_few_bits" operation */ void asn_get_undo(asn_bit_data_t *, int get_nbits); /* diff --git a/e2sm/headers/asn_codecs_prim.h b/e2sm/headers/asn_codecs_prim.h index fbc5576..5bbd9cf 100644 --- a/e2sm/headers/asn_codecs_prim.h +++ b/e2sm/headers/asn_codecs_prim.h @@ -12,23 +12,27 @@ 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! */ + 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; + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f ber_decode_primitive; der_type_encoder_f der_encode_primitive; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) /* * 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 */ + 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, @@ -43,6 +47,7 @@ asn_dec_rval_t xer_decode_primitive( 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); +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ #ifdef __cplusplus } diff --git a/e2sm/headers/asn_config.h b/e2sm/headers/asn_config.h new file mode 100644 index 0000000..551bcc7 --- /dev/null +++ b/e2sm/headers/asn_config.h @@ -0,0 +1,2 @@ +// Generated automatically. Don't edit manually! + diff --git a/e2sm/headers/asn_constant.h b/e2sm/headers/asn_constant.h index 1a26b7a..a95657f 100644 --- a/e2sm/headers/asn_constant.h +++ b/e2sm/headers/asn_constant.h @@ -14,6 +14,36 @@ extern "C" { #define maxEARFCN (65535) #define maxNRARFCN (3279165) #define maxnoofNrCellBands (32) +#define min_val_MME_UE_S1AP_ID (0) +#define max_val_MME_UE_S1AP_ID (4294967295) +#define min_val_QCI (0) +#define max_val_QCI (255) +#define min_val_SubscriberProfileIDforRFP (1) +#define max_val_SubscriberProfileIDforRFP (256) +#define min_val_ENB_UE_X2AP_ID (0) +#define max_val_ENB_UE_X2AP_ID (4095) +#define min_val_E_UTRA_ARFCN (0) +#define max_val_E_UTRA_ARFCN (65535) +#define min_val_NGENB_CU_UE_W1AP_ID (0) +#define max_val_NGENB_CU_UE_W1AP_ID (4294967295) +#define min_val_NGENB_DU_ID (0) +#define max_val_NGENB_DU_ID (68719476735) +#define min_val_AMF_UE_NGAP_ID (0) +#define max_val_AMF_UE_NGAP_ID (1099511627775) +#define min_val_NG_RANnodeUEXnAPID (0) +#define max_val_NG_RANnodeUEXnAPID (4294967295) +#define min_val_GNB_CU_CP_UE_E1AP_ID (0) +#define max_val_GNB_CU_CP_UE_E1AP_ID (4294967295) +#define min_val_GNB_CU_UP_ID (0) +#define max_val_GNB_CU_UP_ID (68719476735) +#define min_val_GNB_CU_UE_F1AP_ID (0) +#define max_val_GNB_CU_UE_F1AP_ID (4294967295) +#define min_val_GNB_DU_ID (0) +#define max_val_GNB_DU_ID (68719476735) +#define min_val_NR_PCI (0) +#define max_val_NR_PCI (1007) +#define min_val_GranularityPeriod (1) +#define max_val_GranularityPeriod (4294967295) #define maxnoofCells (16384) #define maxnoofRICStyles (63) #define maxnoofMeasurementInfo (65535) diff --git a/e2sm/headers/asn_internal.h b/e2sm/headers/asn_internal.h index c4105ad..d6ce619 100644 --- a/e2sm/headers/asn_internal.h +++ b/e2sm/headers/asn_internal.h @@ -7,7 +7,9 @@ */ #ifndef ASN_INTERNAL_H #define ASN_INTERNAL_H +#ifndef __EXTENSIONS__ #define __EXTENSIONS__ /* for Sun */ +#endif #include "asn_application.h" /* Application-visible API */ @@ -19,6 +21,15 @@ extern "C" { #endif +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#include +#include +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#include +#include +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + /* 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 */ @@ -42,8 +53,7 @@ int get_asn1c_environment_version(void); /* Run-time version */ */ #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 +#if __STDC_VERSION__ >= 199901L #ifdef ASN_THREAD_SAFE /* Thread safety requires sacrifice in output indentation: * Retain empty definition of ASN_DEBUG_INDENT_ADD. */ @@ -53,12 +63,6 @@ int get_asn1c_environment_version(void); /* Run-time version */ 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, " "); \ @@ -66,7 +70,6 @@ extern int logAsn1c(const char *filename, int linenumber, const char *format, .. 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 @@ -133,7 +136,31 @@ asn__format_to_callback( /* * Check stack against overflow, if limit is set. */ + +/* Since GCC 13, AddressSanitizer started defaulting to +* ASAN_OPTIONS="detect_stack_use_after_return=1", which makes this check +* fail due to apparently jumping stack pointers. +* Hence, disable this check if building with ASan, as documented in: +* GCC: https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html +* Clang: https://clang.llvm.org/docs/AddressSanitizer.html#conditional-compilation-with-has-feature-address-sanitizer +*/ +#if defined(__SANITIZE_ADDRESS__) + #define ASN__SANITIZE_ENABLED 1 +#elif defined(__has_feature) +#if __has_feature(address_sanitizer) + #define ASN__SANITIZE_ENABLED 1 +#endif +#endif + #define ASN__DEFAULT_STACK_MAX (30000) + +#if defined(ASN__SANITIZE_ENABLED) || defined(ASN_DISABLE_STACK_OVERFLOW_CHECK) +static int CC_NOTUSED +ASN__STACK_OVERFLOW_CHECK(const asn_codec_ctx_t *ctx) { + (void)ctx; + return 0; +} +#else static int CC_NOTUSED ASN__STACK_OVERFLOW_CHECK(const asn_codec_ctx_t *ctx) { if(ctx && ctx->max_stack_size) { @@ -151,6 +178,7 @@ ASN__STACK_OVERFLOW_CHECK(const asn_codec_ctx_t *ctx) { } return 0; } +#endif #ifdef __cplusplus } diff --git a/e2sm/headers/asn_system.h b/e2sm/headers/asn_system.h index fa8cf11..0f0d495 100644 --- a/e2sm/headers/asn_system.h +++ b/e2sm/headers/asn_system.h @@ -27,12 +27,15 @@ #include /* For LONG_MAX */ #include /* For va_start */ #include /* for offsetof and ptrdiff_t */ +#include /* for PRIdMAX */ #ifdef _WIN32 #include +#ifndef __MINGW32__ #define snprintf _snprintf #define vsnprintf _vsnprintf +#endif /* To avoid linking with ws2_32.lib, here's the definition of ntohl() */ #define sys_ntohl(l) ((((l) << 24) & 0xff000000) \ @@ -75,7 +78,9 @@ typedef unsigned int uint32_t; #else /* !defined(__vxworks) */ #include /* C99 specifies this file */ +#ifdef HAVE_NETINET_IN_H #include /* for ntohl() */ +#endif #define sys_ntohl(foo) ntohl(foo) #endif /* defined(__vxworks) */ @@ -86,11 +91,25 @@ typedef unsigned int uint32_t; #else #define CC_ATTRIBUTE(attr) #endif -#define CC_PRINTFLIKE(fmt, var) CC_ATTRIBUTE(format(printf, fmt, var)) +#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__>= 4) || __GNUC__ > 4) +#define CC_PRINTFLIKE(fmt, var) CC_ATTRIBUTE(format(gnu_printf, fmt, var)) +#elif defined(__GNUC__) +#if defined(ANDROID) +#define CC_PRINTFLIKE(fmt, var) CC_ATTRIBUTE(__format__(__printf__, fmt, var)) +#else +#define CC_PRINTFLIKE(fmt, var) CC_ATTRIBUTE(format(printf, fmt, var)) +#endif +#else +#define CC_PRINTFLIKE(fmt, var) +#endif #define CC_NOTUSED CC_ATTRIBUTE(unused) #ifndef CC_ATTR_NO_SANITIZE +#if __GNUC__ < 8 +#define CC_ATTR_NO_SANITIZE(what) +#else #define CC_ATTR_NO_SANITIZE(what) CC_ATTRIBUTE(no_sanitize(what)) #endif +#endif /* Figure out if thread safety is requested */ #if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || defined(_REENTRANT)) diff --git a/e2sm/headers/constr_CHOICE.h b/e2sm/headers/constr_CHOICE.h index a1999ed..03d606c 100644 --- a/e2sm/headers/constr_CHOICE.h +++ b/e2sm/headers/constr_CHOICE.h @@ -40,23 +40,62 @@ typedef struct asn_CHOICE_specifics_s { * A set specialized functions dealing with the CHOICE type. */ asn_struct_free_f CHOICE_free; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f CHOICE_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f CHOICE_compare; + asn_constr_check_f CHOICE_constraint; + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f CHOICE_decode_ber; der_type_encoder_f CHOICE_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f CHOICE_decode_xer; xer_type_encoder_f CHOICE_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f CHOICE_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f CHOICE_decode_oer; oer_type_encoder_f CHOICE_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f CHOICE_decode_uper; per_type_encoder_f CHOICE_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f CHOICE_decode_aper; per_type_encoder_f CHOICE_encode_aper; -asn_outmost_tag_f CHOICE_outmost_tag; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) asn_random_fill_f CHOICE_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +asn_outmost_tag_f CHOICE_outmost_tag; + extern asn_TYPE_operation_t asn_OP_CHOICE; +unsigned _fetch_present_idx( + const void *struct_ptr, + unsigned off, + unsigned size); + +void _set_present_idx( + void *sptr, + unsigned offset, + unsigned size, + unsigned present); + /* * Return the 1-based choice variant presence index. * Returns 0 in case of error. diff --git a/e2sm/headers/constr_SEQUENCE.h b/e2sm/headers/constr_SEQUENCE.h index a22ed3a..5ecfd8f 100644 --- a/e2sm/headers/constr_SEQUENCE.h +++ b/e2sm/headers/constr_SEQUENCE.h @@ -45,20 +45,47 @@ typedef struct asn_SEQUENCE_specifics_s { * A set specialized functions dealing with the SEQUENCE type. */ asn_struct_free_f SEQUENCE_free; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f SEQUENCE_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f SEQUENCE_compare; + asn_constr_check_f SEQUENCE_constraint; + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f SEQUENCE_decode_ber; der_type_encoder_f SEQUENCE_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f SEQUENCE_decode_xer; xer_type_encoder_f SEQUENCE_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f SEQUENCE_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f SEQUENCE_decode_oer; oer_type_encoder_f SEQUENCE_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f SEQUENCE_decode_uper; per_type_encoder_f SEQUENCE_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f SEQUENCE_decode_aper; per_type_encoder_f SEQUENCE_encode_aper; -asn_random_fill_f SEQUENCE_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f SEQUENCE_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + extern asn_TYPE_operation_t asn_OP_SEQUENCE; #ifdef __cplusplus diff --git a/e2sm/headers/constr_SEQUENCE_OF.h b/e2sm/headers/constr_SEQUENCE_OF.h index 6857f0f..1768582 100644 --- a/e2sm/headers/constr_SEQUENCE_OF.h +++ b/e2sm/headers/constr_SEQUENCE_OF.h @@ -16,23 +16,49 @@ extern "C" { * A set specialized functions dealing with the SEQUENCE OF type. * Generally implemented using SET OF. */ +#define SEQUENCE_OF_free SET_OF_free + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) +#define SEQUENCE_OF_print SET_OF_print +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f SEQUENCE_OF_compare; + +#define SEQUENCE_OF_constraint SET_OF_constraint + +#if !defined(ASN_DISABLE_BER_SUPPORT) +#define SEQUENCE_OF_decode_ber SET_OF_decode_ber der_type_encoder_f SEQUENCE_OF_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#define SEQUENCE_OF_decode_xer SET_OF_decode_xer xer_type_encoder_f SEQUENCE_OF_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f SEQUENCE_OF_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) +#define SEQUENCE_OF_decode_oer SET_OF_decode_oer +#define SEQUENCE_OF_encode_oer SET_OF_encode_oer +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) +#define SEQUENCE_OF_decode_uper SET_OF_decode_uper per_type_encoder_f SEQUENCE_OF_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) +#define SEQUENCE_OF_decode_aper SET_OF_decode_aper per_type_encoder_f SEQUENCE_OF_encode_aper; -extern asn_TYPE_operation_t asn_OP_SEQUENCE_OF; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ -#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 +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +#define SEQUENCE_OF_random_fill SET_OF_random_fill +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +extern asn_TYPE_operation_t asn_OP_SEQUENCE_OF; #ifdef __cplusplus } diff --git a/e2sm/headers/constr_SET.h b/e2sm/headers/constr_SET.h deleted file mode 100644 index d64a00f..0000000 --- a/e2sm/headers/constr_SET.h +++ /dev/null @@ -1,87 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _CONSTR_SET_H_ -#define _CONSTR_SET_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct asn_SET_specifics_s { - /* - * Target structure description. - */ - unsigned struct_size; /* Size of the target structure. */ - unsigned ctx_offset; /* Offset of the asn_struct_ctx_t member */ - unsigned pres_offset; /* Offset of _presence_map member */ - - /* - * Tags to members mapping table (sorted). - * Sometimes suitable for DER encoding (untagged CHOICE is present); - * if so, tag2el_count will be greater than td->elements_count. - */ - const asn_TYPE_tag2member_t *tag2el; - unsigned tag2el_count; - - /* - * Tags to members mapping table, second edition. - * Suitable for CANONICAL-XER encoding. - */ - const asn_TYPE_tag2member_t *tag2el_cxer; - unsigned tag2el_cxer_count; - - /* - * Extensions-related stuff. - */ - int extensible; /* Whether SET is extensible */ - const unsigned int *_mandatory_elements; /* Bitmask of mandatory ones */ -} asn_SET_specifics_t; - -/* - * A set specialized functions dealing with the SET type. - */ -asn_struct_free_f SET_free; -asn_struct_print_f SET_print; -asn_struct_compare_f SET_compare; -asn_constr_check_f SET_constraint; -ber_type_decoder_f SET_decode_ber; -der_type_encoder_f SET_encode_der; -xer_type_decoder_f SET_decode_xer; -xer_type_encoder_f SET_encode_xer; -per_type_decoder_f SET_decode_uper; -per_type_encoder_f SET_encode_uper; -asn_random_fill_f SET_random_fill; -extern asn_TYPE_operation_t asn_OP_SET; - -/*********************** - * Some handy helpers. * - ***********************/ - -/* - * Figure out whether the SET member indicated by PR_x has already been decoded. - * It is very simple bitfield test, despite its visual complexity. - */ -#define ASN_SET_ISPRESENT(set_ptr, PR_x) \ - ASN_SET_ISPRESENT2(&((set_ptr)->_presence_map), PR_x) -#define ASN_SET_ISPRESENT2(map_ptr, PR_x) \ - (((unsigned int *)(map_ptr)) \ - [(PR_x) / (8 * sizeof(unsigned int))] \ - & (1u << ((8 * sizeof(unsigned int)) - 1 \ - - ((PR_x) % (8 * sizeof(unsigned int)))))) - -#define ASN_SET_MKPRESENT(map_ptr, PR_x) \ - (((unsigned int *)(map_ptr)) \ - [(PR_x) / (8 * sizeof(unsigned int))] \ - |= (1u << ((8 * sizeof(unsigned int)) - 1 \ - - ((PR_x) % (8 * sizeof(unsigned int)))))) - -#ifdef __cplusplus -} -#endif - -#endif /* _CONSTR_SET_H_ */ diff --git a/e2sm/headers/constr_SET_OF.h b/e2sm/headers/constr_SET_OF.h index 7681062..0e9dd39 100644 --- a/e2sm/headers/constr_SET_OF.h +++ b/e2sm/headers/constr_SET_OF.h @@ -6,6 +6,7 @@ #define CONSTR_SET_OF_H #include +#include #ifdef __cplusplus extern "C" { @@ -26,22 +27,74 @@ typedef struct asn_SET_OF_specifics_s { * A set specialized functions dealing with the SET OF type. */ asn_struct_free_f SET_OF_free; + +#if !defined(ASN_DISABLE_PRINT_SUPPORT) asn_struct_print_f SET_OF_print; +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + asn_struct_compare_f SET_OF_compare; + asn_constr_check_f SET_OF_constraint; + +#if !defined(ASN_DISABLE_BER_SUPPORT) ber_type_decoder_f SET_OF_decode_ber; der_type_encoder_f SET_OF_encode_der; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) xer_type_decoder_f SET_OF_decode_xer; xer_type_encoder_f SET_OF_encode_xer; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +jer_type_encoder_f SET_OF_encode_jer; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) oer_type_decoder_f SET_OF_decode_oer; oer_type_encoder_f SET_OF_encode_oer; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) per_type_decoder_f SET_OF_decode_uper; per_type_encoder_f SET_OF_encode_uper; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) per_type_decoder_f SET_OF_decode_aper; per_type_encoder_f SET_OF_encode_aper; -asn_random_fill_f SET_OF_random_fill; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +asn_random_fill_f SET_OF_random_fill; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + extern asn_TYPE_operation_t asn_OP_SET_OF; +/* + * Internally visible buffer holding a single encoded element. + */ +struct _el_buffer { + uint8_t *buf; + size_t length; + size_t allocated_size; + unsigned bits_unused; +}; + +enum SET_OF__encode_method { + SOES_DER, /* Distinguished Encoding Rules */ + SOES_CUPER, /* Canonical Unaligned Packed Encoding Rules */ + SOES_CAPER /* Canonical Aligned Packed Encoding Rules */ +}; + +struct _el_buffer * SET_OF__encode_sorted( + const asn_TYPE_member_t *elm, + const asn_anonymous_set_ *list, + enum SET_OF__encode_method method); + +void SET_OF__encode_sorted_free( + struct _el_buffer *el_buf, + size_t count); + #ifdef __cplusplus } #endif diff --git a/e2sm/headers/constr_TYPE.h b/e2sm/headers/constr_TYPE.h index d80dea5..55c2574 100644 --- a/e2sm/headers/constr_TYPE.h +++ b/e2sm/headers/constr_TYPE.h @@ -34,23 +34,51 @@ typedef struct asn_struct_ctx_s { 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 +#if !defined(ASN_DISABLE_BER_SUPPORT) +#include /* Basic Encoding Rules decoder */ +#include /* Distinguished Encoding Rules encoder */ +#else +typedef void (ber_type_decoder_f)(void); +typedef void (der_type_encoder_f)(void); +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_XER_SUPPORT) +#include /* Decoder of XER (XML, text) */ +#include /* Encoder into XER (XML, text) */ +#else +typedef void (xer_type_decoder_f)(void); +typedef void (xer_type_encoder_f)(void); +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ + +#if !defined(ASN_DISABLE_JER_SUPPORT) +#include /* Encoder into JER (JSON, text) */ +#else +typedef void (jer_type_encoder_f)(void); +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +#include /* Packet Encoding Rules decoder */ +#include /* Packet Encoding Rules encoder */ +#else +typedef void (per_type_decoder_f)(void); +typedef void (per_type_encoder_f)(void); +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + +#include /* Subtype constraints support */ + +#if !defined(ASN_DISABLE_RFILL_SUPPORT) +#include /* Random structures support */ +#else +typedef void (asn_random_fill_f)(void); +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) +#include /* Octet Encoding Rules encoder */ +#include /* Octet Encoding Rules encoder */ +#else 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 +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ /* * Free the structure according to its specification. @@ -149,6 +177,7 @@ typedef struct asn_TYPE_operation_s { 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 */ + jer_type_encoder_f *jer_encoder; /* Generic JER 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 */ @@ -163,8 +192,12 @@ typedef struct asn_TYPE_operation_s { * A constraints tuple specifying both the OER and PER constraints. */ typedef struct asn_encoding_constraints_s { +#if !defined(ASN_DISABLE_OER_SUPPORT) const struct asn_oer_constraints_s *oer_constraints; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) const struct asn_per_constraints_s *per_constraints; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_constr_check_f *general_constraints; } asn_encoding_constraints_t; @@ -239,8 +272,8 @@ typedef struct asn_TYPE_member_s { 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 */ + int toff_first; /* First occurrence of the el_tag, relative */ + int toff_last; /* Last occurrence of the el_tag, relative */ } asn_TYPE_tag2member_t; /* diff --git a/e2sm/headers/constraints.h b/e2sm/headers/constraints.h index 0bd86a9..0c093fa 100644 --- a/e2sm/headers/constraints.h +++ b/e2sm/headers/constraints.h @@ -6,6 +6,7 @@ #define ASN1_CONSTRAINTS_VALIDATOR_H #include /* Platform-dependent types */ +#include #ifdef __cplusplus extern "C" { diff --git a/e2sm/headers/jer_encoder.h b/e2sm/headers/jer_encoder.h new file mode 100644 index 0000000..672976d --- /dev/null +++ b/e2sm/headers/jer_encoder.h @@ -0,0 +1,86 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _JER_ENCODER_H_ +#define _JER_ENCODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* Flags used by the jer_encode() and (*jer_type_encoder_f), defined below + * + * This isn't actually used, it might be used in the future to support + * both normal JSON and prettified JSON output or removed. + * It came from XER + */ +enum jer_encoder_flags_e { + /* Mode of encoding */ + JER_F = 0x01, /* JER (pretty-printing) */ +}; + +/* + * The JER encoder of any type. May be invoked by the application. + * Produces JER output. + */ +asn_enc_rval_t jer_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 */ +); + +/* + * The variant of the above function which dumps the JER + * 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 jer_fprint(FILE *stream, const struct asn_TYPE_descriptor_s *td, + const void *struct_ptr); + +/* + * A helper function that uses JER encoding/decoding to verify that: + * - Both structures encode into the same JER. + * - Both resulting JER byte streams can be decoded back. + * - Both decoded structures encode into the same JER (round-trip). + * All of this verifies equivalence between structures and a round-trip. + * ARGUMENTS: + * (opt_debug_stream) - If specified, prints ongoing details. + */ +enum jer_equivalence_e { + JEQ_SUCCESS, /* The only completely positive return value */ + JEQ_FAILURE, /* General failure */ + JEQ_ENCODE1_FAILED, /* First structure JER encoding failed */ + JEQ_ENCODE2_FAILED, /* Second structure JER encoding failed */ + JEQ_DIFFERENT, /* Structures encoded into different JER */ + JEQ_DECODE_FAILED, /* Decode of the JER data failed */ + JEQ_ROUND_TRIP_FAILED /* Bad round-trip */ +}; +enum jer_equivalence_e jer_equivalent( + const struct asn_TYPE_descriptor_s *type_descriptor, const void *struct1, + const void *struct2, FILE *opt_debug_stream); + +/* + * Type of the generic JER encoder. + */ +typedef asn_enc_rval_t(jer_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 jer_encoder_flags_e jer_flags, + asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ +); + +#ifdef __cplusplus +} +#endif + +#endif /* _JER_ENCODER_H_ */ diff --git a/e2sm/headers/per_decoder.h b/e2sm/headers/per_decoder.h index eea474a..3cc0c6b 100644 --- a/e2sm/headers/per_decoder.h +++ b/e2sm/headers/per_decoder.h @@ -14,58 +14,6 @@ extern "C" { 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. */ diff --git a/e2sm/headers/per_encoder.h b/e2sm/headers/per_encoder.h index b615ef0..8bb0771 100644 --- a/e2sm/headers/per_encoder.h +++ b/e2sm/headers/per_encoder.h @@ -14,70 +14,6 @@ extern "C" { 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. */ @@ -86,6 +22,15 @@ typedef asn_enc_rval_t(per_type_encoder_f)( const asn_per_constraints_t *constraints, const void *struct_ptr, asn_per_outp_t *per_output); +int ignore_output(const void *data, size_t size, void *app_key); + +typedef struct enc_dyn_arg { + void *buffer; + size_t length; + size_t allocated; +} enc_dyn_arg; +int encode_dyn_cb(const void *buffer, size_t size, void *key); + #ifdef __cplusplus } #endif diff --git a/e2sm/headers/per_opentype.h b/e2sm/headers/per_opentype.h index 1493b2d..fc37855 100644 --- a/e2sm/headers/per_opentype.h +++ b/e2sm/headers/per_opentype.h @@ -5,37 +5,17 @@ #ifndef _PER_OPENTYPE_H_ #define _PER_OPENTYPE_H_ +#include + #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); +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); #ifdef __cplusplus } diff --git a/e2sm/headers/per_support.h b/e2sm/headers/per_support.h index 23079c9..b3056a2 100644 --- a/e2sm/headers/per_support.h +++ b/e2sm/headers/per_support.h @@ -24,8 +24,8 @@ typedef struct asn_per_constraint_s { } 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 */ + intmax_t lower_bound; /* "lb" value */ + intmax_t upper_bound; /* "ub" value */ } asn_per_constraint_t; typedef struct asn_per_constraints_s { asn_per_constraint_t value; @@ -41,85 +41,12 @@ typedef struct asn_bit_data_s asn_per_data_t; #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 diff --git a/e2sm/headers/uper_decoder.h b/e2sm/headers/uper_decoder.h new file mode 100644 index 0000000..ded8515 --- /dev/null +++ b/e2sm/headers/uper_decoder.h @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _UPER_DECODER_H_ +#define _UPER_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 */ +); + +#ifdef __cplusplus +} +#endif + +#endif /* _UPER_DECODER_H_ */ diff --git a/e2sm/headers/uper_encoder.h b/e2sm/headers/uper_encoder.h new file mode 100644 index 0000000..8f73980 --- /dev/null +++ b/e2sm/headers/uper_encoder.h @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2006-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _UPER_ENCODER_H_ +#define _UPER_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 */ +); + +/* + * 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) */ +); + +/* + * 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 */ +); + +#ifdef __cplusplus +} +#endif + +#endif /* _UPER_ENCODER_H_ */ diff --git a/e2sm/headers/uper_opentype.h b/e2sm/headers/uper_opentype.h new file mode 100644 index 0000000..3a24822 --- /dev/null +++ b/e2sm/headers/uper_opentype.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2007-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _UPER_OPENTYPE_H_ +#define _UPER_OPENTYPE_H_ + +#include + +#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); + +#ifdef __cplusplus +} +#endif + +#endif /* _UPER_OPENTYPE_H_ */ diff --git a/e2sm/headers/uper_support.h b/e2sm/headers/uper_support.h new file mode 100644 index 0000000..6c9d4ea --- /dev/null +++ b/e2sm/headers/uper_support.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _UPER_SUPPORT_H_ +#define _UPER_SUPPORT_H_ + +#include /* Platform-specific types */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * 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); + +/* + * Get the normally small length "n". + */ +ssize_t uper_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); + +/* X.691-2008/11, #11.5.6 */ +int uper_get_constrained_whole_number(asn_per_data_t *pd, uintmax_t *v, int nbits); + +/* + * 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, intmax_t lb, intmax_t ub, unsigned long *output); +int per_imax_range_rebase(intmax_t v, intmax_t lb, intmax_t ub, uintmax_t *output); +/* The inverse operation: restores the value by the offset and its bounds. */ +int per_long_range_unrebase(unsigned long inp, intmax_t lb, intmax_t ub, long *outp); +int per_imax_range_unrebase(uintmax_t inp, intmax_t lb, intmax_t ub, intmax_t *outp); + +/* X.691-2008/11, #11.5 */ +int uper_put_constrained_whole_number_u(asn_per_outp_t *po, uintmax_t 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); + +/* + * 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); + +/* + * Put the normally small non-negative whole number. + */ +int uper_put_nsnnwn(asn_per_outp_t *po, int n); + +#ifdef __cplusplus +} +#endif + +#endif /* _UPER_SUPPORT_H_ */ diff --git a/e2sm/headers/xer_encoder.h b/e2sm/headers/xer_encoder.h index 9d75922..6cfc505 100644 --- a/e2sm/headers/xer_encoder.h +++ b/e2sm/headers/xer_encoder.h @@ -54,7 +54,7 @@ int xer_fprint(FILE *stream, const struct asn_TYPE_descriptor_s *td, 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_ENCODE1_FAILED, /* First structure 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 */ diff --git a/e2sm/headers/xer_support.h b/e2sm/headers/xer_support.h index c3a36e7..2c3f369 100644 --- a/e2sm/headers/xer_support.h +++ b/e2sm/headers/xer_support.h @@ -40,8 +40,8 @@ typedef int (pxml_callback_f)(pxml_chunk_type_e _type, /* * 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. + * Invoke the specified callback each time the meaningful data is found. + * This function returns number of bytes consumed from the buffer. * It will always be lesser than or equal to the specified _size. * The next invocation of this function must account the difference. */ diff --git a/e2sm/lib/AMF-UE-NGAP-ID.c b/e2sm/lib/AMF-UE-NGAP-ID.c index 13fe8aa..f12a33c 100644 --- a/e2sm/lib/AMF-UE-NGAP-ID.c +++ b/e2sm/lib/AMF-UE-NGAP-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "AMF-UE-NGAP-ID.h" @@ -27,7 +27,7 @@ AMF_UE_NGAP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if((value >= 0 && value <= 1099511627775)) { + if((value >= 0L && value <= 1099511627775L)) { /* Constraint check succeeded */ return 0; } else { @@ -42,11 +42,18 @@ AMF_UE_NGAP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using INTEGER, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_AMF_UE_NGAP_ID_constr_1 CC_NOTUSED = { + { 8, 1 } /* (0..1099511627775) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_AMF_UE_NGAP_ID_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 40, -1, 0, 1099511627775 } /* (0..1099511627775) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_AMF_UE_NGAP_ID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -60,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_AMF_UE_NGAP_ID = { asn_DEF_AMF_UE_NGAP_ID_tags_1, /* Same as above */ sizeof(asn_DEF_AMF_UE_NGAP_ID_tags_1) /sizeof(asn_DEF_AMF_UE_NGAP_ID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_AMF_UE_NGAP_ID_constr_1, AMF_UE_NGAP_ID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_AMF_UE_NGAP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_AMF_UE_NGAP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + AMF_UE_NGAP_ID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/AMFPointer.c b/e2sm/lib/AMFPointer.c index 99212c4..605d1cb 100644 --- a/e2sm/lib/AMFPointer.c +++ b/e2sm/lib/AMFPointer.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "AMFPointer.h" @@ -27,7 +27,7 @@ AMFPointer_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size == 6)) { + if((size == 6UL)) { /* Constraint check succeeded */ return 0; } else { @@ -42,11 +42,18 @@ AMFPointer_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_AMFPointer_constr_1 CC_NOTUSED = { + { 0, 0 }, + 6 /* (SIZE(6..6)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_AMFPointer_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 6, 6 } /* (SIZE(6..6)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_AMFPointer_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; @@ -60,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_AMFPointer = { asn_DEF_AMFPointer_tags_1, /* Same as above */ sizeof(asn_DEF_AMFPointer_tags_1) /sizeof(asn_DEF_AMFPointer_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_AMFPointer_constr_1, AMFPointer_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_AMFPointer_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_AMFPointer_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + AMFPointer_constraint + }, 0, 0, /* No members */ &asn_SPC_BIT_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/AMFRegionID.c b/e2sm/lib/AMFRegionID.c index 94e19ba..6205a4b 100644 --- a/e2sm/lib/AMFRegionID.c +++ b/e2sm/lib/AMFRegionID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "AMFRegionID.h" @@ -27,7 +27,7 @@ AMFRegionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size == 8)) { + if((size == 8UL)) { /* Constraint check succeeded */ return 0; } else { @@ -42,11 +42,18 @@ AMFRegionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_AMFRegionID_constr_1 CC_NOTUSED = { + { 0, 0 }, + 8 /* (SIZE(8..8)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_AMFRegionID_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 8, 8 } /* (SIZE(8..8)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_AMFRegionID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; @@ -60,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_AMFRegionID = { asn_DEF_AMFRegionID_tags_1, /* Same as above */ sizeof(asn_DEF_AMFRegionID_tags_1) /sizeof(asn_DEF_AMFRegionID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_AMFRegionID_constr_1, AMFRegionID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_AMFRegionID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_AMFRegionID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + AMFRegionID_constraint + }, 0, 0, /* No members */ &asn_SPC_BIT_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/AMFSetID.c b/e2sm/lib/AMFSetID.c index f56a4c5..6680460 100644 --- a/e2sm/lib/AMFSetID.c +++ b/e2sm/lib/AMFSetID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "AMFSetID.h" @@ -27,7 +27,7 @@ AMFSetID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size == 10)) { + if((size == 10UL)) { /* Constraint check succeeded */ return 0; } else { @@ -42,11 +42,18 @@ AMFSetID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_AMFSetID_constr_1 CC_NOTUSED = { + { 0, 0 }, + 10 /* (SIZE(10..10)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_AMFSetID_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 10, 10 } /* (SIZE(10..10)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_AMFSetID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; @@ -60,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_AMFSetID = { asn_DEF_AMFSetID_tags_1, /* Same as above */ sizeof(asn_DEF_AMFSetID_tags_1) /sizeof(asn_DEF_AMFSetID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_AMFSetID_constr_1, AMFSetID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_AMFSetID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_AMFSetID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + AMFSetID_constraint + }, 0, 0, /* No members */ &asn_SPC_BIT_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/ANY.c b/e2sm/lib/ANY.c index 0b81557..bf988db 100644 --- a/e2sm/lib/ANY.c +++ b/e2sm/lib/ANY.c @@ -4,447 +4,77 @@ */ #include #include -#include asn_OCTET_STRING_specifics_t asn_SPC_ANY_specs = { - sizeof(ANY_t), - offsetof(ANY_t, _asn_ctx), - ASN_OSUBV_ANY + sizeof(ANY_t), + offsetof(ANY_t, _asn_ctx), + ASN_OSUBV_ANY }; asn_TYPE_operation_t asn_OP_ANY = { - OCTET_STRING_free, - OCTET_STRING_print, - OCTET_STRING_compare, - OCTET_STRING_decode_ber, - OCTET_STRING_encode_der, - OCTET_STRING_decode_xer_hex, - ANY_encode_xer, -#ifdef ASN_DISABLE_OER_SUPPORT - 0, - 0, + OCTET_STRING_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OCTET_STRING_print, #else - 0, - 0, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, 0, 0, 0, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, + OCTET_STRING_encode_der, #else - ANY_decode_uper, - ANY_encode_uper, - ANY_decode_aper, - ANY_encode_aper, -#endif /* ASN_DISABLE_PER_SUPPORT */ - 0, /* Random fill is not defined for ANY type */ - 0 /* Use generic outmost tag fetcher */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_hex, + ANY_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + ANY_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, + 0, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + ANY_decode_uper, + ANY_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + ANY_decode_aper, + ANY_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + 0, /* Random fill is not defined for ANY type */ + 0 /* Use generic outmost tag fetcher */ }; asn_TYPE_descriptor_t asn_DEF_ANY = { - "ANY", - "ANY", - &asn_OP_ANY, - 0, 0, 0, 0, - { 0, 0, asn_generic_no_constraint }, /* No constraints */ - 0, 0, /* No members */ - &asn_SPC_ANY_specs, + "ANY", + "ANY", + &asn_OP_ANY, + 0, 0, 0, 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_no_constraint + }, /* No constraints */ + 0, 0, /* No members */ + &asn_SPC_ANY_specs, }; - -#undef RETURN -#define RETURN(_code) \ - do { \ - asn_dec_rval_t tmprval; \ - tmprval.code = _code; \ - tmprval.consumed = consumed_myself; \ - return tmprval; \ - } while(0) - -asn_enc_rval_t -ANY_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) { - if(flags & XER_F_CANONICAL) { - /* - * Canonical XER-encoding of ANY type is not supported. - */ - ASN__ENCODE_FAILED; - } - - /* Dump as binary */ - return OCTET_STRING_encode_xer(td, sptr, ilevel, flags, cb, app_key); -} - -struct _callback_arg { - uint8_t *buffer; - size_t offset; - size_t size; -}; - -static int ANY__consume_bytes(const void *buffer, size_t size, void *key); - -int -ANY_fromType(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr) { - struct _callback_arg arg; - asn_enc_rval_t erval = {0,0,0}; - - if(!st || !td) { - errno = EINVAL; - return -1; - } - - if(!sptr) { - if(st->buf) FREEMEM(st->buf); - st->size = 0; - return 0; - } - - arg.offset = arg.size = 0; - arg.buffer = 0; - - erval = der_encode(td, sptr, ANY__consume_bytes, &arg); - if(erval.encoded == -1) { - if(arg.buffer) FREEMEM(arg.buffer); - return -1; - } - assert((size_t)erval.encoded == arg.offset); - - if(st->buf) FREEMEM(st->buf); - st->buf = arg.buffer; - st->size = arg.offset; - - return 0; -} - -int -ANY_fromType_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr) { - uint8_t *buffer = NULL; - ssize_t erval; - - if(!st || !td) { - errno = EINVAL; - return -1; - } - - if(!sptr) { - if(st->buf) FREEMEM(st->buf); - st->size = 0; - return 0; - } - - erval = aper_encode_to_new_buffer(td, td->encoding_constraints.per_constraints, sptr, (void**)&buffer); - - if(erval == -1) { - if(buffer) FREEMEM(buffer); - return -1; - } - assert((size_t)erval > 0); - - if(st->buf) FREEMEM(st->buf); - st->buf = buffer; - st->size = erval; - - return 0; -} - -ANY_t * -ANY_new_fromType(asn_TYPE_descriptor_t *td, void *sptr) { - ANY_t tmp; - ANY_t *st; - - if(!td || !sptr) { - errno = EINVAL; - return 0; - } - - memset(&tmp, 0, sizeof(tmp)); - - if(ANY_fromType(&tmp, td, sptr)) return 0; - - st = (ANY_t *)CALLOC(1, sizeof(ANY_t)); - if(st) { - *st = tmp; - return st; - } else { - FREEMEM(tmp.buf); - return 0; - } -} - -ANY_t * -ANY_new_fromType_aper(asn_TYPE_descriptor_t *td, void *sptr) { - ANY_t tmp; - ANY_t *st; - - if(!td || !sptr) { - errno = EINVAL; - return 0; - } - - memset(&tmp, 0, sizeof(tmp)); - - if(ANY_fromType_aper(&tmp, td, sptr)) return 0; - - st = (ANY_t *)CALLOC(1, sizeof(ANY_t)); - if(st) { - *st = tmp; - return st; - } else { - FREEMEM(tmp.buf); - return 0; - } -} - -int -ANY_to_type(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) { - asn_dec_rval_t rval; - void *newst = 0; - - if(!st || !td || !struct_ptr) { - errno = EINVAL; - return -1; - } - - if(st->buf == 0) { - /* Nothing to convert, make it empty. */ - *struct_ptr = (void *)0; - return 0; - } - - rval = ber_decode(0, td, (void **)&newst, st->buf, st->size); - if(rval.code == RC_OK) { - *struct_ptr = newst; - return 0; - } else { - /* Remove possibly partially decoded data. */ - ASN_STRUCT_FREE(*td, newst); - return -1; - } -} - -int -ANY_to_type_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) { - asn_dec_rval_t rval; - void *newst = 0; - - if(!st || !td || !struct_ptr) { - errno = EINVAL; - return -1; - } - - if(st->buf == 0) { - /* Nothing to convert, make it empty. */ - *struct_ptr = (void *)0; - return 0; - } - - rval = aper_decode(0, td, (void **)&newst, st->buf, st->size, 0, 0); - if(rval.code == RC_OK) { - *struct_ptr = newst; - return 0; - } else { - /* Remove possibly partially decoded data. */ - ASN_STRUCT_FREE(*td, newst); - return -1; - } -} - -static int ANY__consume_bytes(const void *buffer, size_t size, void *key) { - struct _callback_arg *arg = (struct _callback_arg *)key; - - if((arg->offset + size) >= arg->size) { - size_t nsize = (arg->size ? arg->size << 2 : 16) + size; - void *p = REALLOC(arg->buffer, nsize); - if(!p) return -1; - arg->buffer = (uint8_t *)p; - arg->size = nsize; - } - - memcpy(arg->buffer + arg->offset, buffer, size); - arg->offset += size; - assert(arg->offset < arg->size); - - return 0; -} - -#ifndef ASN_DISABLE_PER_SUPPORT - -asn_dec_rval_t -ANY_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_ANY_specs; - size_t consumed_myself = 0; - int repeat; - ANY_t *st = (ANY_t *)*sptr; - - (void)opt_codec_ctx; - (void)constraints; - - /* - * Allocate the structure. - */ - if(!st) { - st = (ANY_t *)(*sptr = CALLOC(1, specs->struct_size)); - if(!st) RETURN(RC_FAIL); - } - - ASN_DEBUG("UPER Decoding ANY type"); - - 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, -1, 0, &repeat); - if(raw_len < 0) RETURN(RC_WMORE); - if(raw_len == 0 && st->buf) break; - - ASN_DEBUG("Got PER length len %" ASN_PRI_SIZE ", %s (%s)", raw_len, - repeat ? "repeat" : "once", td->name); - len_bytes = raw_len; - len_bits = len_bytes * 8; - - 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); - consumed_myself += len_bits; - st->size += len_bytes; - } while(repeat); - st->buf[st->size] = 0; /* nul-terminate */ - - RETURN(RC_OK); -} - -asn_enc_rval_t -ANY_encode_uper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, const void *sptr, - asn_per_outp_t *po) { - const ANY_t *st = (const ANY_t *)sptr; - asn_enc_rval_t er = {0, 0, 0}; - const uint8_t *buf; - size_t size; - int ret; - - (void)constraints; - - if(!st || (!st->buf && st->size)) ASN__ENCODE_FAILED; - - buf = st->buf; - size = st->size; - do { - int need_eom = 0; - ssize_t may_save = uper_put_length(po, size, &need_eom); - if(may_save < 0) ASN__ENCODE_FAILED; - - ret = per_put_many_bits(po, buf, may_save * 8); - if(ret) ASN__ENCODE_FAILED; - - buf += may_save; - size -= may_save; - assert(!(may_save & 0x07) || !size); - if(need_eom && uper_put_length(po, 0, 0)) - ASN__ENCODE_FAILED; /* End of Message length */ - } while(size); - - ASN__ENCODED_OK(er); -} - -asn_dec_rval_t -ANY_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_ANY_specs; - size_t consumed_myself = 0; - int repeat; - ANY_t *st = (ANY_t *)*sptr; - - (void)opt_codec_ctx; - (void)constraints; - - /* - * Allocate the structure. - */ - if(!st) { - st = (ANY_t *)(*sptr = CALLOC(1, specs->struct_size)); - if(!st) RETURN(RC_FAIL); - } - - ASN_DEBUG("APER Decoding ANY type"); - - 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 = aper_get_length(pd, -1, 0, &repeat); - if(raw_len < 0) RETURN(RC_WMORE); - if(raw_len == 0 && st->buf) break; - - ASN_DEBUG("Got PER length len %" ASN_PRI_SIZE ", %s (%s)", raw_len, - repeat ? "repeat" : "once", td->name); - len_bytes = raw_len; - len_bits = len_bytes * 8; - - 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); - consumed_myself += len_bits; - st->size += len_bytes; - } while(repeat); - st->buf[st->size] = 0; /* nul-terminate */ - - RETURN(RC_OK); -} - -asn_enc_rval_t -ANY_encode_aper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, const void *sptr, - asn_per_outp_t *po) { - const ANY_t *st = (const ANY_t *)sptr; - asn_enc_rval_t er = {0, 0, 0}; - const uint8_t *buf; - size_t size; - int ret; - - (void)constraints; - - if(!st || (!st->buf && st->size)) ASN__ENCODE_FAILED; - - buf = st->buf; - size = st->size; - do { - int need_eom = 0; - ssize_t may_save = uper_put_length(po, size, &need_eom); - if(may_save < 0) ASN__ENCODE_FAILED; - - ret = per_put_many_bits(po, buf, may_save * 8); - if(ret) ASN__ENCODE_FAILED; - - buf += may_save; - size -= may_save; - assert(!(may_save & 0x07) || !size); - if(need_eom && uper_put_length(po, 0, 0)) - ASN__ENCODE_FAILED; /* End of Message length */ - } while(size); - - ASN__ENCODED_OK(er); -} -#endif /* ASN_DISABLE_PER_SUPPORT */ - diff --git a/e2sm/lib/ANY_aper.c b/e2sm/lib/ANY_aper.c new file mode 100644 index 0000000..91d7277 --- /dev/null +++ b/e2sm/lib/ANY_aper.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +#undef RETURN +#define RETURN(_code) \ + do { \ + asn_dec_rval_t tmprval; \ + tmprval.code = _code; \ + tmprval.consumed = consumed_myself; \ + return tmprval; \ + } while(0) + +int +ANY_fromType_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr) { + uint8_t *buffer = NULL; + ssize_t erval; + + if(!st || !td) { + errno = EINVAL; + return -1; + } + + if(!sptr) { + if(st->buf) FREEMEM(st->buf); + st->size = 0; + return 0; + } + + erval = aper_encode_to_new_buffer(td, td->encoding_constraints.per_constraints, sptr, (void**)&buffer); + + if(erval == -1) { + if(buffer) FREEMEM(buffer); + return -1; + } + assert((size_t)erval > 0); + + if(st->buf) FREEMEM(st->buf); + st->buf = buffer; + st->size = erval; + + return 0; +} + +ANY_t * +ANY_new_fromType_aper(asn_TYPE_descriptor_t *td, void *sptr) { + ANY_t tmp; + ANY_t *st; + + if(!td || !sptr) { + errno = EINVAL; + return 0; + } + + memset(&tmp, 0, sizeof(tmp)); + + if(ANY_fromType_aper(&tmp, td, sptr)) return 0; + + st = (ANY_t *)CALLOC(1, sizeof(ANY_t)); + if(st) { + *st = tmp; + return st; + } else { + FREEMEM(tmp.buf); + return 0; + } +} + +int +ANY_to_type_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) { + asn_dec_rval_t rval; + void *newst = 0; + + if(!st || !td || !struct_ptr) { + errno = EINVAL; + return -1; + } + + if(st->buf == 0) { + /* Nothing to convert, make it empty. */ + *struct_ptr = (void *)0; + return 0; + } + + rval = aper_decode(0, td, (void **)&newst, st->buf, st->size, 0, 0); + if(rval.code == RC_OK) { + *struct_ptr = newst; + return 0; + } else { + /* Remove possibly partially decoded data. */ + ASN_STRUCT_FREE(*td, newst); + return -1; + } +} + +asn_dec_rval_t +ANY_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_ANY_specs; + size_t consumed_myself = 0; + int repeat; + ANY_t *st = (ANY_t *)*sptr; + + (void)opt_codec_ctx; + (void)constraints; + + /* + * Allocate the structure. + */ + if(!st) { + st = (ANY_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) RETURN(RC_FAIL); + } + + ASN_DEBUG("APER Decoding ANY type"); + + 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 = aper_get_length(pd, -1, -1, 0, &repeat); + if(raw_len < 0) RETURN(RC_WMORE); + if(raw_len == 0 && st->buf) break; + + ASN_DEBUG("Got PER length len %" ASN_PRI_SIZE ", %s (%s)", raw_len, + repeat ? "repeat" : "once", td->name); + len_bytes = raw_len; + len_bits = len_bytes * 8; + + 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); + consumed_myself += len_bits; + st->size += len_bytes; + } while(repeat); + st->buf[st->size] = 0; /* nul-terminate */ + + RETURN(RC_OK); +} + +asn_enc_rval_t +ANY_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const ANY_t *st = (const ANY_t *)sptr; + asn_enc_rval_t er = {0, 0, 0}; + const uint8_t *buf; + size_t size; + int ret; + + (void)constraints; + + if(!st || (!st->buf && st->size)) ASN__ENCODE_FAILED; + + buf = st->buf; + size = st->size; + do { + int need_eom = 0; + ssize_t may_save = aper_put_length(po, -1, -1, size, &need_eom); + if(may_save < 0) ASN__ENCODE_FAILED; + + ret = per_put_many_bits(po, buf, may_save * 8); + if(ret) ASN__ENCODE_FAILED; + + buf += may_save; + size -= may_save; + assert(!(may_save & 0x07) || !size); + if(need_eom && aper_put_length(po, -1, -1, 0, NULL)) + ASN__ENCODE_FAILED; /* End of Message length */ + } while(size); + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/ANY_ber.c b/e2sm/lib/ANY_ber.c new file mode 100644 index 0000000..2ebe45b --- /dev/null +++ b/e2sm/lib/ANY_ber.c @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +struct _callback_arg { + uint8_t *buffer; + size_t offset; + size_t size; +}; + +static int ANY__consume_bytes(const void *buffer, size_t size, void *key) { + struct _callback_arg *arg = (struct _callback_arg *)key; + + if((arg->offset + size) >= arg->size) { + size_t nsize = (arg->size ? arg->size << 2 : 16) + size; + void *p = REALLOC(arg->buffer, nsize); + if(!p) return -1; + arg->buffer = (uint8_t *)p; + arg->size = nsize; + } + + memcpy(arg->buffer + arg->offset, buffer, size); + arg->offset += size; + assert(arg->offset < arg->size); + + return 0; +} + +int +ANY_fromType(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr) { + struct _callback_arg arg; + asn_enc_rval_t erval = {0,0,0}; + + if(!st || !td) { + errno = EINVAL; + return -1; + } + + if(!sptr) { + if(st->buf) FREEMEM(st->buf); + st->size = 0; + return 0; + } + + arg.offset = arg.size = 0; + arg.buffer = 0; + + erval = der_encode(td, sptr, ANY__consume_bytes, &arg); + if(erval.encoded == -1) { + if(arg.buffer) FREEMEM(arg.buffer); + return -1; + } + assert((size_t)erval.encoded == arg.offset); + + if(st->buf) FREEMEM(st->buf); + st->buf = arg.buffer; + st->size = arg.offset; + + return 0; +} + +ANY_t * +ANY_new_fromType(asn_TYPE_descriptor_t *td, void *sptr) { + ANY_t tmp; + ANY_t *st; + + if(!td || !sptr) { + errno = EINVAL; + return 0; + } + + memset(&tmp, 0, sizeof(tmp)); + + if(ANY_fromType(&tmp, td, sptr)) return 0; + + st = (ANY_t *)CALLOC(1, sizeof(ANY_t)); + if(st) { + *st = tmp; + return st; + } else { + FREEMEM(tmp.buf); + return 0; + } +} + +int +ANY_to_type(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) { + asn_dec_rval_t rval; + void *newst = 0; + + if(!st || !td || !struct_ptr) { + errno = EINVAL; + return -1; + } + + if(st->buf == 0) { + /* Nothing to convert, make it empty. */ + *struct_ptr = (void *)0; + return 0; + } + + rval = ber_decode(0, td, (void **)&newst, st->buf, st->size); + if(rval.code == RC_OK) { + *struct_ptr = newst; + return 0; + } else { + /* Remove possibly partially decoded data. */ + ASN_STRUCT_FREE(*td, newst); + return -1; + } +} diff --git a/e2sm/lib/ANY_jer.c b/e2sm/lib/ANY_jer.c new file mode 100644 index 0000000..a86db9c --- /dev/null +++ b/e2sm/lib/ANY_jer.c @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +ANY_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum jer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, + void *app_key) { + ASN__ENCODE_FAILED; + + /* Dump as binary */ + return OCTET_STRING_encode_jer(td, sptr, ilevel, flags, cb, app_key); +} diff --git a/e2sm/lib/ANY_uper.c b/e2sm/lib/ANY_uper.c new file mode 100644 index 0000000..65f1519 --- /dev/null +++ b/e2sm/lib/ANY_uper.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +#undef RETURN +#define RETURN(_code) \ + do { \ + asn_dec_rval_t tmprval; \ + tmprval.code = _code; \ + tmprval.consumed = consumed_myself; \ + return tmprval; \ + } while(0) + +asn_dec_rval_t +ANY_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_ANY_specs; + size_t consumed_myself = 0; + int repeat; + ANY_t *st = (ANY_t *)*sptr; + + (void)opt_codec_ctx; + (void)constraints; + + /* + * Allocate the structure. + */ + if(!st) { + st = (ANY_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) RETURN(RC_FAIL); + } + + ASN_DEBUG("UPER Decoding ANY type"); + + 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, -1, 0, &repeat); + if(raw_len < 0) RETURN(RC_WMORE); + if(raw_len == 0 && st->buf) break; + + ASN_DEBUG("Got PER length len %" ASN_PRI_SIZE ", %s (%s)", raw_len, + repeat ? "repeat" : "once", td->name); + len_bytes = raw_len; + len_bits = len_bytes * 8; + + 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); + consumed_myself += len_bits; + st->size += len_bytes; + } while(repeat); + st->buf[st->size] = 0; /* nul-terminate */ + + RETURN(RC_OK); +} + +asn_enc_rval_t +ANY_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const ANY_t *st = (const ANY_t *)sptr; + asn_enc_rval_t er = {0, 0, 0}; + const uint8_t *buf; + size_t size; + int ret; + + (void)constraints; + + if(!st || (!st->buf && st->size)) ASN__ENCODE_FAILED; + + buf = st->buf; + size = st->size; + do { + int need_eom = 0; + ssize_t may_save = uper_put_length(po, size, &need_eom); + if(may_save < 0) ASN__ENCODE_FAILED; + + ret = per_put_many_bits(po, buf, may_save * 8); + if(ret) ASN__ENCODE_FAILED; + + buf += may_save; + size -= may_save; + assert(!(may_save & 0x07) || !size); + if(need_eom && uper_put_length(po, 0, 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + } while(size); + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/ANY_xer.c b/e2sm/lib/ANY_xer.c new file mode 100644 index 0000000..112c213 --- /dev/null +++ b/e2sm/lib/ANY_xer.c @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +ANY_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) { + if(flags & XER_F_CANONICAL) { + /* + * Canonical XER-encoding of ANY type is not supported. + */ + ASN__ENCODE_FAILED; + } + + /* Dump as binary */ + return OCTET_STRING_encode_xer(td, sptr, ilevel, flags, cb, app_key); +} diff --git a/e2sm/lib/BIT_STRING.c b/e2sm/lib/BIT_STRING.c index e8d7354..b5ba940 100644 --- a/e2sm/lib/BIT_STRING.c +++ b/e2sm/lib/BIT_STRING.c @@ -4,61 +4,94 @@ */ #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_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 + 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, + OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + BIT_STRING_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + BIT_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_binary, + BIT_STRING_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + BIT_STRING_encode_jer, #else - BIT_STRING_decode_oer, - BIT_STRING_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + BIT_STRING_decode_oer, + BIT_STRING_encode_oer, #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + BIT_STRING_decode_uper, /* Unaligned PER decoder */ + BIT_STRING_encode_uper, /* Unaligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, /* Aligned PER decoder */ + OCTET_STRING_encode_aper, /* Aligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + BIT_STRING_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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", + "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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + BIT_STRING_constraint + }, + 0, 0, /* No members */ + &asn_SPC_BIT_STRING_specs }; /* @@ -87,136 +120,10 @@ BIT_STRING_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, 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 * +const BIT_STRING_t * BIT_STRING__compactify(const BIT_STRING_t *st, BIT_STRING_t *tmp) { const uint8_t *b; union { @@ -271,6 +178,7 @@ BIT_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const BIT_STRING_t *b = BIT_STRING__compactify(bptr, &compact_b); const asn_OCTET_STRING_specifics_t *specs = td->specifics; + (void)specs; assert(specs && specs->subvariant == ASN_OSUBV_BIT); if(a && b) { @@ -303,354 +211,3 @@ BIT_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, 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/e2sm/lib/BIT_STRING_jer.c b/e2sm/lib/BIT_STRING_jer.c new file mode 100644 index 0000000..f66238d --- /dev/null +++ b/e2sm/lib/BIT_STRING_jer.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +BIT_STRING_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = {0, 0, 0}; + const char * const h2c = "0123456789ABCDEF"; + char scratch[16 * 3 + 4]; + char *p = scratch; + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + 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 */ + + /* + * Hex dump + */ + *p++ = '"'; + for(int i = 0; buf < end; buf++, i++) { + if(!(i % 16) && (i || st->size > 16)) { + ASN__CALLBACK(scratch, p-scratch); + p = scratch; + } + *p++ = h2c[*buf >> 4]; + *p++ = h2c[*buf & 0x0F]; + } + + ASN__CALLBACK(scratch, p - scratch); + p = scratch; + + if(buf == end) { + int ubits = st->bits_unused; + uint8_t v = *buf & (0xff << ubits); + *p++ = h2c[v >> 4]; + *p++ = h2c[v & 0x0F]; + ASN__CALLBACK(scratch, p - scratch); + p = scratch; + } + *p++ = '"'; + ASN__CALLBACK(scratch, p - scratch); + ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} diff --git a/e2sm/lib/BIT_STRING_oer.c b/e2sm/lib/BIT_STRING_oer.c index aff5075..95c9558 100644 --- a/e2sm/lib/BIT_STRING_oer.c +++ b/e2sm/lib/BIT_STRING_oer.c @@ -3,11 +3,8 @@ * 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, @@ -169,6 +166,3 @@ BIT_STRING_encode_oer(const asn_TYPE_descriptor_t *td, return erval; } - - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2sm/lib/BIT_STRING_print.c b/e2sm/lib/BIT_STRING_print.c new file mode 100644 index 0000000..bab1ea5 --- /dev/null +++ b/e2sm/lib/BIT_STRING_print.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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; +} diff --git a/e2sm/lib/BIT_STRING_rfill.c b/e2sm/lib/BIT_STRING_rfill.c new file mode 100644 index 0000000..a6e6a95 --- /dev/null +++ b/e2sm/lib/BIT_STRING_rfill.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 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 { +#else + if(!constraints) constraints = &td->encoding_constraints; + { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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/e2sm/lib/BIT_STRING_uper.c b/e2sm/lib/BIT_STRING_uper.c new file mode 100644 index 0000000..d82349e --- /dev/null +++ b/e2sm/lib/BIT_STRING_uper.c @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +#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); +} diff --git a/e2sm/lib/BIT_STRING_xer.c b/e2sm/lib/BIT_STRING_xer.c new file mode 100644 index 0000000..67d5cb8 --- /dev/null +++ b/e2sm/lib/BIT_STRING_xer.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2sm/lib/BMPString.c b/e2sm/lib/BMPString.c deleted file mode 100644 index 6b80ae7..0000000 --- a/e2sm/lib/BMPString.c +++ /dev/null @@ -1,233 +0,0 @@ -/*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include -#include - -/* - * BMPString basic type description. - */ -static const ber_tlv_tag_t asn_DEF_BMPString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (30 << 2)), /* [UNIVERSAL 30] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ -}; -asn_OCTET_STRING_specifics_t asn_SPC_BMPString_specs = { - sizeof(BMPString_t), - offsetof(BMPString_t, _asn_ctx), - ASN_OSUBV_U16 /* 16-bits character */ -}; -static asn_per_constraints_t asn_DEF_BMPString_per_constraints = { - { APC_CONSTRAINED, 16, 16, 0, 65535 }, - { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, - 0, 0 -}; -asn_TYPE_operation_t asn_OP_BMPString = { - OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ - BMPString_print, - OCTET_STRING_compare, - OCTET_STRING_decode_ber, - OCTET_STRING_encode_der, - BMPString_decode_xer, /* Convert from UTF-8 */ - BMPString_encode_xer, /* Convert to UTF-8 */ -#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_BMPString = { - "BMPString", - "BMPString", - &asn_OP_BMPString, - asn_DEF_BMPString_tags, - sizeof(asn_DEF_BMPString_tags) - / sizeof(asn_DEF_BMPString_tags[0]) - 1, - asn_DEF_BMPString_tags, - sizeof(asn_DEF_BMPString_tags) - / sizeof(asn_DEF_BMPString_tags[0]), - { 0, &asn_DEF_BMPString_per_constraints, BMPString_constraint }, - 0, 0, /* No members */ - &asn_SPC_BMPString_specs -}; - -int -BMPString_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, - asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const BMPString_t *st = (const BMPString_t *)sptr; - - if(st && st->buf) { - if(st->size & 1) { - ASN__CTFAIL(app_key, td, sptr, - "%s: invalid size %" ASN_PRI_SIZE " not divisible by 2 (%s:%d)", - td->name, st->size, __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; -} - -/* - * BMPString specific contents printer. - */ -static ssize_t -BMPString__dump(const BMPString_t *st, - asn_app_consume_bytes_f *cb, void *app_key) { - char scratch[128]; /* Scratchpad buffer */ - char *p = scratch; - ssize_t wrote = 0; - uint8_t *ch; - uint8_t *end; - - ch = st->buf; - end = (st->buf + st->size); - for(end--; ch < end; ch += 2) { - uint16_t wc = (ch[0] << 8) | ch[1]; /* 2 bytes */ - if(sizeof(scratch) - (p - scratch) < 3) { - wrote += p - scratch; - if(cb(scratch, p - scratch, app_key) < 0) - return -1; - p = scratch; - } - if(wc < 0x80) { - *p++ = (char)wc; - } else if(wc < 0x800) { - *p++ = 0xc0 | ((wc >> 6)); - *p++ = 0x80 | ((wc & 0x3f)); - } else { - *p++ = 0xe0 | ((wc >> 12)); - *p++ = 0x80 | ((wc >> 6) & 0x3f); - *p++ = 0x80 | ((wc & 0x3f)); - } - } - - wrote += p - scratch; - if(cb(scratch, p - scratch, app_key) < 0) - return -1; - - return wrote; -} - -asn_dec_rval_t -BMPString_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) { - asn_dec_rval_t rc; - - rc = OCTET_STRING_decode_xer_utf8(opt_codec_ctx, td, sptr, opt_mname, - buf_ptr, size); - if(rc.code == RC_OK) { - /* - * Now we have a whole string in UTF-8 format. - * Convert it into UCS-2. - */ - uint32_t *wcs; - size_t wcs_len; - UTF8String_t *st; - - assert(*sptr); - st = (UTF8String_t *)*sptr; - assert(st->buf); - wcs_len = UTF8String_to_wcs(st, 0, 0); - - wcs = (uint32_t *)MALLOC(4 * (wcs_len + 1)); - if(wcs == 0 || UTF8String_to_wcs(st, wcs, wcs_len) != wcs_len) { - rc.code = RC_FAIL; - rc.consumed = 0; - return rc; - } else { - wcs[wcs_len] = 0; /* nul-terminate */ - } - - if(1) { - /* Swap byte order and trim encoding to 2 bytes */ - uint32_t *wc = wcs; - uint32_t *wc_end = wcs + wcs_len; - uint16_t *dstwc = (uint16_t *)wcs; - for(; wc < wc_end; wc++, dstwc++) { - uint32_t wch = *wc; - if(wch > 0xffff) { - FREEMEM(wcs); - rc.code = RC_FAIL; - rc.consumed = 0; - return rc; - } - *((uint8_t *)dstwc + 0) = wch >> 8; - *((uint8_t *)dstwc + 1) = wch; - } - dstwc = (uint16_t *)REALLOC(wcs, 2 * (wcs_len + 1)); - if(!dstwc) { - FREEMEM(wcs); - rc.code = RC_FAIL; - rc.consumed = 0; - return rc; - } else { - dstwc[wcs_len] = 0; /* nul-terminate */ - wcs = (uint32_t *)(void *)dstwc; /* Alignment OK */ - } - } - - FREEMEM(st->buf); - st->buf = (uint8_t *)wcs; - st->size = 2 * wcs_len; - } - return rc; -} - -asn_enc_rval_t -BMPString_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 BMPString_t *st = (const BMPString_t *)sptr; - asn_enc_rval_t er = {0,0,0}; - - (void)ilevel; - (void)flags; - - if(!st || !st->buf) - ASN__ENCODE_FAILED; - - er.encoded = BMPString__dump(st, cb, app_key); - if(er.encoded < 0) ASN__ENCODE_FAILED; - - ASN__ENCODED_OK(er); -} - -int -BMPString_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, - asn_app_consume_bytes_f *cb, void *app_key) { - const BMPString_t *st = (const BMPString_t *)sptr; - - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(!st || !st->buf) - return (cb("", 8, app_key) < 0) ? -1 : 0; - - if(BMPString__dump(st, cb, app_key) < 0) - return -1; - - return 0; -} - diff --git a/e2sm/lib/BOOLEAN.c b/e2sm/lib/BOOLEAN.c index 25831e2..1373a6f 100644 --- a/e2sm/lib/BOOLEAN.c +++ b/e2sm/lib/BOOLEAN.c @@ -3,247 +3,90 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include #include /* * BOOLEAN basic type description. */ static const ber_tlv_tag_t asn_DEF_BOOLEAN_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)) }; asn_TYPE_operation_t asn_OP_BOOLEAN = { - BOOLEAN_free, - BOOLEAN_print, - BOOLEAN_compare, - BOOLEAN_decode_ber, - BOOLEAN_encode_der, - BOOLEAN_decode_xer, - BOOLEAN_encode_xer, -#ifdef ASN_DISABLE_OER_SUPPORT - 0, - 0, + BOOLEAN_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + BOOLEAN_print, #else - BOOLEAN_decode_oer, - BOOLEAN_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + BOOLEAN_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + BOOLEAN_decode_ber, + BOOLEAN_encode_der, #else - BOOLEAN_decode_uper, /* Unaligned PER decoder */ - BOOLEAN_encode_uper, /* Unaligned PER encoder */ - BOOLEAN_decode_aper, /* Aligned PER decoder */ - BOOLEAN_encode_aper, /* Aligned PER encoder */ -#endif /* ASN_DISABLE_PER_SUPPORT */ - BOOLEAN_random_fill, - 0 /* Use generic outmost tag fetcher */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + BOOLEAN_decode_xer, + BOOLEAN_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + BOOLEAN_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + BOOLEAN_decode_oer, + BOOLEAN_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + BOOLEAN_decode_uper, /* Unaligned PER decoder */ + BOOLEAN_encode_uper, /* Unaligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + BOOLEAN_decode_aper, /* Aligned PER decoder */ + BOOLEAN_encode_aper, /* Aligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + BOOLEAN_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ }; asn_TYPE_descriptor_t asn_DEF_BOOLEAN = { - "BOOLEAN", - "BOOLEAN", - &asn_OP_BOOLEAN, - asn_DEF_BOOLEAN_tags, - sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), - asn_DEF_BOOLEAN_tags, /* Same as above */ - sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), - { 0, 0, asn_generic_no_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ + "BOOLEAN", + "BOOLEAN", + &asn_OP_BOOLEAN, + asn_DEF_BOOLEAN_tags, + sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), + asn_DEF_BOOLEAN_tags, /* Same as above */ + sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_no_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ }; -/* - * Decode BOOLEAN type. - */ -asn_dec_rval_t -BOOLEAN_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, - const asn_TYPE_descriptor_t *td, void **bool_value, - const void *buf_ptr, size_t size, int tag_mode) { - BOOLEAN_t *st = (BOOLEAN_t *)*bool_value; - asn_dec_rval_t rval; - ber_tlv_len_t length; - ber_tlv_len_t lidx; - - if(st == NULL) { - st = (BOOLEAN_t *)(*bool_value = CALLOC(1, sizeof(*st))); - if(st == NULL) { - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } - } - - ASN_DEBUG("Decoding %s as BOOLEAN (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("Boolean length is %d bytes", (int)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; - } - - /* - * Compute boolean value. - */ - for(*st = 0, lidx = 0; - (lidx < length) && *st == 0; lidx++) { - /* - * Very simple approach: read bytes until the end or - * value is already TRUE. - * BOOLEAN is not supposed to contain meaningful data anyway. - */ - *st |= ((const uint8_t *)buf_ptr)[lidx]; - } - - rval.code = RC_OK; - rval.consumed += length; - - ASN_DEBUG("Took %ld/%ld bytes to encode %s, value=%d", - (long)rval.consumed, (long)length, - td->name, *st); - - return rval; -} - -asn_enc_rval_t -BOOLEAN_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 erval = {0,0,0}; - const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; - - erval.encoded = der_write_tags(td, 1, tag_mode, 0, tag, cb, app_key); - if(erval.encoded == -1) { - erval.failed_type = td; - erval.structure_ptr = sptr; - return erval; - } - - if(cb) { - uint8_t bool_value; - - bool_value = *st ? 0xff : 0; /* 0xff mandated by DER */ - - if(cb(&bool_value, 1, app_key) < 0) { - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = sptr; - return erval; - } - } - - erval.encoded += 1; - - ASN__ENCODED_OK(erval); -} - - -/* - * Decode the chunk of XML text encoding INTEGER. - */ -static enum xer_pbd_rval -BOOLEAN__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, - const void *chunk_buf, size_t chunk_size) { - BOOLEAN_t *st = (BOOLEAN_t *)sptr; - const char *p = (const char *)chunk_buf; - - (void)td; - - if(chunk_size && p[0] == 0x3c /* '<' */) { - switch(xer_check_tag(chunk_buf, chunk_size, "false")) { - case XCT_BOTH: - /* "" */ - *st = 0; - break; - case XCT_UNKNOWN_BO: - if(xer_check_tag(chunk_buf, chunk_size, "true") - != XCT_BOTH) - return XPBD_BROKEN_ENCODING; - /* "" */ - *st = 1; /* Or 0xff as in DER?.. */ - break; - default: - return XPBD_BROKEN_ENCODING; - } - return XPBD_BODY_CONSUMED; - } else { - return XPBD_BROKEN_ENCODING; - } -} - - -asn_dec_rval_t -BOOLEAN_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(BOOLEAN_t), opt_mname, buf_ptr, size, - BOOLEAN__xer_body_decode); -} - -asn_enc_rval_t -BOOLEAN_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 BOOLEAN_t *st = (const BOOLEAN_t *)sptr; - asn_enc_rval_t er = {0, 0, 0}; - - (void)ilevel; - (void)flags; - - if(!st) ASN__ENCODE_FAILED; - - if(*st) { - ASN__CALLBACK("", 7); - } else { - ASN__CALLBACK("", 8); - } - - ASN__ENCODED_OK(er); -cb_failed: - ASN__ENCODE_FAILED; -} - -int -BOOLEAN_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, - asn_app_consume_bytes_f *cb, void *app_key) { - const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; - const char *buf; - size_t buflen; - - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(st) { - if(*st) { - buf = "TRUE"; - buflen = 4; - } else { - buf = "FALSE"; - buflen = 5; - } - } else { - buf = ""; - buflen = 8; - } - - return (cb(buf, buflen, app_key) < 0) ? -1 : 0; -} - void BOOLEAN_free(const asn_TYPE_descriptor_t *td, void *ptr, enum asn_struct_free_method method) { @@ -261,168 +104,6 @@ BOOLEAN_free(const asn_TYPE_descriptor_t *td, void *ptr, } } -#ifndef ASN_DISABLE_PER_SUPPORT - -asn_dec_rval_t -BOOLEAN_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; - BOOLEAN_t *st = (BOOLEAN_t *)*sptr; - - (void)opt_codec_ctx; - (void)td; - (void)constraints; - - if(!st) { - st = (BOOLEAN_t *)(*sptr = MALLOC(sizeof(*st))); - if(!st) ASN__DECODE_FAILED; - } - - /* - * Extract a single bit - */ - switch(per_get_few_bits(pd, 1)) { - case 1: *st = 1; break; - case 0: *st = 0; break; - case -1: default: ASN__DECODE_STARVED; - } - - ASN_DEBUG("%s decoded as %s", td->name, *st ? "TRUE" : "FALSE"); - - rv.code = RC_OK; - rv.consumed = 1; - return rv; -} - - -asn_enc_rval_t -BOOLEAN_encode_uper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, const void *sptr, - asn_per_outp_t *po) { - const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; - asn_enc_rval_t er = { 0, 0, 0 }; - - (void)constraints; - - if(!st) ASN__ENCODE_FAILED; - - if(per_put_few_bits(po, *st ? 1 : 0, 1)) - ASN__ENCODE_FAILED; - - ASN__ENCODED_OK(er); -} - -asn_dec_rval_t -BOOLEAN_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; - BOOLEAN_t *st = (BOOLEAN_t *)*sptr; - - (void)opt_codec_ctx; - (void)constraints; - (void)td; - - if(!st) { - st = (BOOLEAN_t *)(*sptr = MALLOC(sizeof(*st))); - if(!st) ASN__DECODE_FAILED; - } - - /* - * Extract a single bit - */ - switch(per_get_few_bits(pd, 1)) { - case 1: - *st = 1; - break; - case 0: - *st = 0; - break; - case -1: - default: - ASN__DECODE_STARVED; - } - - ASN_DEBUG("%s decoded as %s", td->name, *st ? "TRUE" : "FALSE"); - - rv.code = RC_OK; - rv.consumed = 1; - return rv; -} - -asn_enc_rval_t -BOOLEAN_encode_aper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, - const void *sptr, asn_per_outp_t *po) { - const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; - asn_enc_rval_t er = { 0, 0, 0 }; - - (void)constraints; - - if(!st) ASN__ENCODE_FAILED; - - if(per_put_few_bits(po, *st ? 1 : 0, 1)) - ASN__ENCODE_FAILED; - - ASN__ENCODED_OK(er); -} - -#endif /* ASN_DISABLE_PER_SUPPORT */ - -#ifndef ASN_DISABLE_OER_SUPPORT - -/* - * Encode as Canonical OER. - */ -asn_enc_rval_t -BOOLEAN_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 = { 1, 0, 0 }; - const BOOLEAN_t *st = sptr; - uint8_t bool_value = *st ? 0xff : 0; /* 0xff mandated by OER */ - - (void)td; - (void)constraints; /* Constraints are unused in OER */ - - if(cb(&bool_value, 1, app_key) < 0) { - ASN__ENCODE_FAILED; - } else { - ASN__ENCODED_OK(er); - } -} - -asn_dec_rval_t -BOOLEAN_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) { - asn_dec_rval_t ok = {RC_OK, 1}; - BOOLEAN_t *st; - - (void)opt_codec_ctx; - (void)td; - (void)constraints; /* Constraints are unused in OER */ - - if(size < 1) { - ASN__DECODE_STARVED; - } - - if(!(st = *sptr)) { - st = (BOOLEAN_t *)(*sptr = CALLOC(1, sizeof(*st))); - if(!st) ASN__DECODE_FAILED; - } - - *st = *(const uint8_t *)ptr; - - return ok; -} - - - -#endif - int BOOLEAN_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bptr) { @@ -445,48 +126,3 @@ BOOLEAN_compare(const asn_TYPE_descriptor_t *td, const void *aptr, return 1; } } - -asn_random_fill_result_t -BOOLEAN_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, - const asn_encoding_constraints_t *constraints, - size_t max_length) { - 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}; - BOOLEAN_t *st = *sptr; - - if(max_length == 0) return result_skipped; - - if(st == NULL) { - st = (BOOLEAN_t *)(*sptr = CALLOC(1, sizeof(*st))); - if(st == NULL) { - return result_failed; - } - } - - 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_CONSTRAINED) { - *st = asn_random_between(pc->lower_bound, pc->upper_bound); - return result_ok; - } - } - - /* Simulate booleans that are sloppily set and biased. */ - switch(asn_random_between(0, 7)) { - case 0: - case 1: - case 2: - *st = 0; break; - case 3: *st = -1; break; - case 4: *st = 1; break; - case 5: *st = INT_MIN; break; - case 6: *st = INT_MAX; break; - default: - *st = asn_random_between(INT_MIN, INT_MAX); - break; - } - return result_ok; -} diff --git a/e2sm/lib/BOOLEAN_aper.c b/e2sm/lib/BOOLEAN_aper.c new file mode 100644 index 0000000..d697cf5 --- /dev/null +++ b/e2sm/lib/BOOLEAN_aper.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_dec_rval_t +BOOLEAN_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; + BOOLEAN_t *st = (BOOLEAN_t *)*sptr; + + (void)opt_codec_ctx; + (void)constraints; + (void)td; + + if(!st) { + st = (BOOLEAN_t *)(*sptr = MALLOC(sizeof(*st))); + if(!st) ASN__DECODE_FAILED; + } + + /* + * Extract a single bit + */ + switch(per_get_few_bits(pd, 1)) { + case 1: + *st = 1; + break; + case 0: + *st = 0; + break; + case -1: + default: + ASN__DECODE_STARVED; + } + + ASN_DEBUG("%s decoded as %s", td->name, *st ? "TRUE" : "FALSE"); + + rv.code = RC_OK; + rv.consumed = 1; + return rv; +} + +asn_enc_rval_t +BOOLEAN_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; + asn_enc_rval_t er = { 0, 0, 0 }; + + (void)constraints; + + if(!st) ASN__ENCODE_FAILED; + + if(per_put_few_bits(po, *st ? 1 : 0, 1)) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/BOOLEAN_ber.c b/e2sm/lib/BOOLEAN_ber.c new file mode 100644 index 0000000..176a4a4 --- /dev/null +++ b/e2sm/lib/BOOLEAN_ber.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Decode BOOLEAN type. + */ +asn_dec_rval_t +BOOLEAN_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **bool_value, + const void *buf_ptr, size_t size, int tag_mode) { + BOOLEAN_t *st = (BOOLEAN_t *)*bool_value; + asn_dec_rval_t rval; + ber_tlv_len_t length; + ber_tlv_len_t lidx; + + if(st == NULL) { + st = (BOOLEAN_t *)(*bool_value = CALLOC(1, sizeof(*st))); + if(st == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as BOOLEAN (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("Boolean length is %d bytes", (int)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; + } + + /* + * Compute boolean value. + */ + for(*st = 0, lidx = 0; + (lidx < length) && *st == 0; lidx++) { + /* + * Very simple approach: read bytes until the end or + * value is already TRUE. + * BOOLEAN is not supposed to contain meaningful data anyway. + */ + *st |= ((const uint8_t *)buf_ptr)[lidx]; + } + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s, value=%d", + (long)rval.consumed, (long)length, + td->name, *st); + + return rval; +} + +asn_enc_rval_t +BOOLEAN_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 erval = {0,0,0}; + const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; + + erval.encoded = der_write_tags(td, 1, tag_mode, 0, tag, cb, app_key); + if(erval.encoded == -1) { + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + + if(cb) { + uint8_t bool_value; + + bool_value = *st ? 0xff : 0; /* 0xff mandated by DER */ + + if(cb(&bool_value, 1, app_key) < 0) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + } + + erval.encoded += 1; + + ASN__ENCODED_OK(erval); +} diff --git a/e2sm/lib/BOOLEAN_jer.c b/e2sm/lib/BOOLEAN_jer.c new file mode 100644 index 0000000..6f4b093 --- /dev/null +++ b/e2sm/lib/BOOLEAN_jer.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +asn_enc_rval_t +BOOLEAN_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; + asn_enc_rval_t er = {0, 0, 0}; + + (void)ilevel; + (void)flags; + + if(!st) ASN__ENCODE_FAILED; + + if(*st) { + ASN__CALLBACK("true", 4); + } else { + ASN__CALLBACK("false", 5); + } + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} diff --git a/e2sm/lib/BOOLEAN_oer.c b/e2sm/lib/BOOLEAN_oer.c new file mode 100644 index 0000000..0e92e60 --- /dev/null +++ b/e2sm/lib/BOOLEAN_oer.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +BOOLEAN_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 = { 1, 0, 0 }; + const BOOLEAN_t *st = sptr; + uint8_t bool_value = *st ? 0xff : 0; /* 0xff mandated by OER */ + + (void)td; + (void)constraints; /* Constraints are unused in OER */ + + if(cb(&bool_value, 1, app_key) < 0) { + ASN__ENCODE_FAILED; + } else { + ASN__ENCODED_OK(er); + } +} + +asn_dec_rval_t +BOOLEAN_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) { + asn_dec_rval_t ok = {RC_OK, 1}; + BOOLEAN_t *st; + + (void)opt_codec_ctx; + (void)td; + (void)constraints; /* Constraints are unused in OER */ + + if(size < 1) { + ASN__DECODE_STARVED; + } + + if(!(st = *sptr)) { + st = (BOOLEAN_t *)(*sptr = CALLOC(1, sizeof(*st))); + if(!st) ASN__DECODE_FAILED; + } + + *st = *(const uint8_t *)ptr; + + return ok; +} diff --git a/e2sm/lib/BOOLEAN_print.c b/e2sm/lib/BOOLEAN_print.c new file mode 100644 index 0000000..23aaade --- /dev/null +++ b/e2sm/lib/BOOLEAN_print.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +int +BOOLEAN_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; + const char *buf; + size_t buflen; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(st) { + if(*st) { + buf = "TRUE"; + buflen = 4; + } else { + buf = "FALSE"; + buflen = 5; + } + } else { + buf = ""; + buflen = 8; + } + + return (cb(buf, buflen, app_key) < 0) ? -1 : 0; +} diff --git a/e2sm/lib/BOOLEAN_rfill.c b/e2sm/lib/BOOLEAN_rfill.c new file mode 100644 index 0000000..5ec628b --- /dev/null +++ b/e2sm/lib/BOOLEAN_rfill.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_random_fill_result_t +BOOLEAN_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + 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}; + BOOLEAN_t *st = *sptr; + + if(max_length == 0) return result_skipped; + + if(st == NULL) { + st = (BOOLEAN_t *)(*sptr = CALLOC(1, sizeof(*st))); + if(st == NULL) { + return result_failed; + } + } + +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 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_CONSTRAINED) { + *st = asn_random_between(pc->lower_bound, pc->upper_bound); + return result_ok; + } + } +#else + if(!constraints) constraints = &td->encoding_constraints; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + + /* Simulate booleans that are sloppily set and biased. */ + switch(asn_random_between(0, 7)) { + case 0: + case 1: + case 2: + *st = 0; break; + case 3: *st = -1; break; + case 4: *st = 1; break; + case 5: *st = INT_MIN; break; + case 6: *st = INT_MAX; break; + default: + *st = asn_random_between(INT_MIN, INT_MAX); + break; + } + return result_ok; +} diff --git a/e2sm/lib/BOOLEAN_uper.c b/e2sm/lib/BOOLEAN_uper.c new file mode 100644 index 0000000..8181ec9 --- /dev/null +++ b/e2sm/lib/BOOLEAN_uper.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_dec_rval_t +BOOLEAN_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; + BOOLEAN_t *st = (BOOLEAN_t *)*sptr; + + (void)opt_codec_ctx; + (void)td; + (void)constraints; + + if(!st) { + st = (BOOLEAN_t *)(*sptr = MALLOC(sizeof(*st))); + if(!st) ASN__DECODE_FAILED; + } + + /* + * Extract a single bit + */ + switch(per_get_few_bits(pd, 1)) { + case 1: *st = 1; break; + case 0: *st = 0; break; + case -1: default: ASN__DECODE_STARVED; + } + + ASN_DEBUG("%s decoded as %s", td->name, *st ? "TRUE" : "FALSE"); + + rv.code = RC_OK; + rv.consumed = 1; + return rv; +} + + +asn_enc_rval_t +BOOLEAN_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; + asn_enc_rval_t er = { 0, 0, 0 }; + + (void)constraints; + + if(!st) ASN__ENCODE_FAILED; + + if(per_put_few_bits(po, *st ? 1 : 0, 1)) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/BOOLEAN_xer.c b/e2sm/lib/BOOLEAN_xer.c new file mode 100644 index 0000000..7e9d8f8 --- /dev/null +++ b/e2sm/lib/BOOLEAN_xer.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +/* + * Decode the chunk of XML text encoding INTEGER. + */ +static enum xer_pbd_rval +BOOLEAN__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, + const void *chunk_buf, size_t chunk_size) { + BOOLEAN_t *st = (BOOLEAN_t *)sptr; + const char *p = (const char *)chunk_buf; + + (void)td; + + if(chunk_size && p[0] == 0x3c /* '<' */) { + switch(xer_check_tag(chunk_buf, chunk_size, "false")) { + case XCT_BOTH: + /* "" */ + *st = 0; + break; + case XCT_UNKNOWN_BO: + if(xer_check_tag(chunk_buf, chunk_size, "true") != XCT_BOTH) + return XPBD_BROKEN_ENCODING; + /* "" */ + *st = 1; /* Or 0xff as in DER?.. */ + break; + default: + return XPBD_BROKEN_ENCODING; + } + return XPBD_BODY_CONSUMED; + } else { + return XPBD_BROKEN_ENCODING; + } +} + + +asn_dec_rval_t +BOOLEAN_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(BOOLEAN_t), opt_mname, buf_ptr, size, + BOOLEAN__xer_body_decode); +} + +asn_enc_rval_t +BOOLEAN_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 BOOLEAN_t *st = (const BOOLEAN_t *)sptr; + asn_enc_rval_t er = {0, 0, 0}; + + (void)ilevel; + (void)flags; + + if(!st) ASN__ENCODE_FAILED; + + if(*st) { + ASN__CALLBACK("", 7); + } else { + ASN__CALLBACK("", 8); + } + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} diff --git a/e2sm/lib/C-RNTI.c b/e2sm/lib/C-RNTI.c deleted file mode 100644 index f56a789..0000000 --- a/e2sm/lib/C-RNTI.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "C-RNTI.h" - -int -C_RNTI_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 == 2)) { - /* 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_C_RNTI_constr_1 CC_NOTUSED = { - { 0, 0 }, - 2 /* (SIZE(2..2)) */}; -asn_per_constraints_t asn_PER_type_C_RNTI_constr_1 CC_NOTUSED = { - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - { APC_CONSTRAINED, 0, 0, 2, 2 } /* (SIZE(2..2)) */, - 0, 0 /* No PER value map */ -}; -static const ber_tlv_tag_t asn_DEF_C_RNTI_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) -}; -asn_TYPE_descriptor_t asn_DEF_C_RNTI = { - "C-RNTI", - "C-RNTI", - &asn_OP_OCTET_STRING, - asn_DEF_C_RNTI_tags_1, - sizeof(asn_DEF_C_RNTI_tags_1) - /sizeof(asn_DEF_C_RNTI_tags_1[0]), /* 1 */ - asn_DEF_C_RNTI_tags_1, /* Same as above */ - sizeof(asn_DEF_C_RNTI_tags_1) - /sizeof(asn_DEF_C_RNTI_tags_1[0]), /* 1 */ - { &asn_OER_type_C_RNTI_constr_1, &asn_PER_type_C_RNTI_constr_1, C_RNTI_constraint }, - 0, 0, /* No members */ - &asn_SPC_OCTET_STRING_specs /* Additional specs */ -}; - diff --git a/e2sm/lib/CGI.c b/e2sm/lib/CGI.c index 06e7420..73dfe18 100644 --- a/e2sm/lib/CGI.c +++ b/e2sm/lib/CGI.c @@ -1,26 +1,41 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "CGI.h" #include "NR-CGI.h" #include "EUTRA-CGI.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_CGI_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_CGI_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_CGI_1[] = { { ATF_POINTER, 0, offsetof(struct CGI, choice.nR_CGI), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NR_CGI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "nR-CGI" }, @@ -29,7 +44,15 @@ asn_TYPE_member_t asn_MBR_CGI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_EUTRA_CGI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "eUTRA-CGI" }, @@ -56,7 +79,15 @@ asn_TYPE_descriptor_t asn_DEF_CGI = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_CGI_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_CGI_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_CGI_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_CGI_1, 2, /* Elements count */ &asn_SPC_CGI_specs_1 /* Additional specs */ diff --git a/e2sm/lib/CU-CP-Usage-Report-CellResourceReportItem.c b/e2sm/lib/CU-CP-Usage-Report-CellResourceReportItem.c deleted file mode 100644 index 99bee0a..0000000 --- a/e2sm/lib/CU-CP-Usage-Report-CellResourceReportItem.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "CU-CP-Usage-Report-CellResourceReportItem.h" - -#include "CU-CP-Usage-Report-UeResourceReportItem.h" -static int -memb_ueResourceReportList_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 <= 32)) { - /* 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_ueResourceReportList_constr_3 CC_NOTUSED = { - { 0, 0 }, - -1 /* (SIZE(1..32)) */}; -static asn_per_constraints_t asn_PER_type_ueResourceReportList_constr_3 CC_NOTUSED = { - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, - 0, 0 /* No PER value map */ -}; -static asn_oer_constraints_t asn_OER_memb_ueResourceReportList_constr_3 CC_NOTUSED = { - { 0, 0 }, - -1 /* (SIZE(1..32)) */}; -static asn_per_constraints_t asn_PER_memb_ueResourceReportList_constr_3 CC_NOTUSED = { - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, - 0, 0 /* No PER value map */ -}; -static asn_TYPE_member_t asn_MBR_ueResourceReportList_3[] = { - { ATF_POINTER, 0, 0, - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - 0, - &asn_DEF_CU_CP_Usage_Report_UeResourceReportItem, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "" - }, -}; -static const ber_tlv_tag_t asn_DEF_ueResourceReportList_tags_3[] = { - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static asn_SET_OF_specifics_t asn_SPC_ueResourceReportList_specs_3 = { - sizeof(struct CU_CP_Usage_Report_CellResourceReportItem__ueResourceReportList), - offsetof(struct CU_CP_Usage_Report_CellResourceReportItem__ueResourceReportList, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ -}; -static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_ueResourceReportList_3 = { - "ueResourceReportList", - "ueResourceReportList", - &asn_OP_SEQUENCE_OF, - asn_DEF_ueResourceReportList_tags_3, - sizeof(asn_DEF_ueResourceReportList_tags_3) - /sizeof(asn_DEF_ueResourceReportList_tags_3[0]) - 1, /* 1 */ - asn_DEF_ueResourceReportList_tags_3, /* Same as above */ - sizeof(asn_DEF_ueResourceReportList_tags_3) - /sizeof(asn_DEF_ueResourceReportList_tags_3[0]), /* 2 */ - { &asn_OER_type_ueResourceReportList_constr_3, &asn_PER_type_ueResourceReportList_constr_3, SEQUENCE_OF_constraint }, - asn_MBR_ueResourceReportList_3, - 1, /* Single element */ - &asn_SPC_ueResourceReportList_specs_3 /* Additional specs */ -}; - -asn_TYPE_member_t asn_MBR_CU_CP_Usage_Report_CellResourceReportItem_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct CU_CP_Usage_Report_CellResourceReportItem, 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_NOFLAGS, 0, offsetof(struct CU_CP_Usage_Report_CellResourceReportItem, ueResourceReportList), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - 0, - &asn_DEF_ueResourceReportList_3, - 0, - { &asn_OER_memb_ueResourceReportList_constr_3, &asn_PER_memb_ueResourceReportList_constr_3, memb_ueResourceReportList_constraint_1 }, - 0, 0, /* No default value */ - "ueResourceReportList" - }, -}; -static const ber_tlv_tag_t asn_DEF_CU_CP_Usage_Report_CellResourceReportItem_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_CU_CP_Usage_Report_CellResourceReportItem_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nRCGI */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ueResourceReportList */ -}; -asn_SEQUENCE_specifics_t asn_SPC_CU_CP_Usage_Report_CellResourceReportItem_specs_1 = { - sizeof(struct CU_CP_Usage_Report_CellResourceReportItem), - offsetof(struct CU_CP_Usage_Report_CellResourceReportItem, _asn_ctx), - asn_MAP_CU_CP_Usage_Report_CellResourceReportItem_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_CU_CP_Usage_Report_CellResourceReportItem = { - "CU-CP-Usage-Report-CellResourceReportItem", - "CU-CP-Usage-Report-CellResourceReportItem", - &asn_OP_SEQUENCE, - asn_DEF_CU_CP_Usage_Report_CellResourceReportItem_tags_1, - sizeof(asn_DEF_CU_CP_Usage_Report_CellResourceReportItem_tags_1) - /sizeof(asn_DEF_CU_CP_Usage_Report_CellResourceReportItem_tags_1[0]), /* 1 */ - asn_DEF_CU_CP_Usage_Report_CellResourceReportItem_tags_1, /* Same as above */ - sizeof(asn_DEF_CU_CP_Usage_Report_CellResourceReportItem_tags_1) - /sizeof(asn_DEF_CU_CP_Usage_Report_CellResourceReportItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_CU_CP_Usage_Report_CellResourceReportItem_1, - 2, /* Elements count */ - &asn_SPC_CU_CP_Usage_Report_CellResourceReportItem_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/CU-CP-Usage-Report-Per-UE.c b/e2sm/lib/CU-CP-Usage-Report-Per-UE.c deleted file mode 100644 index 54ef1d6..0000000 --- a/e2sm/lib/CU-CP-Usage-Report-Per-UE.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "CU-CP-Usage-Report-Per-UE.h" - -#include "CU-CP-Usage-Report-CellResourceReportItem.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 <= 16384)) { - /* 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..16384)) */}; -static asn_per_constraints_t asn_PER_type_cellResourceReportList_constr_2 CC_NOTUSED = { - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - { APC_CONSTRAINED, 14, 14, 1, 16384 } /* (SIZE(1..16384)) */, - 0, 0 /* No PER value map */ -}; -static asn_oer_constraints_t asn_OER_memb_cellResourceReportList_constr_2 CC_NOTUSED = { - { 0, 0 }, - -1 /* (SIZE(1..16384)) */}; -static asn_per_constraints_t asn_PER_memb_cellResourceReportList_constr_2 CC_NOTUSED = { - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - { APC_CONSTRAINED, 14, 14, 1, 16384 } /* (SIZE(1..16384)) */, - 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_CU_CP_Usage_Report_CellResourceReportItem, - 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 CU_CP_Usage_Report_Per_UE__cellResourceReportList), - offsetof(struct CU_CP_Usage_Report_Per_UE__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_CU_CP_Usage_Report_Per_UE_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct CU_CP_Usage_Report_Per_UE, 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_CU_CP_Usage_Report_Per_UE_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_CU_CP_Usage_Report_Per_UE_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* cellResourceReportList */ -}; -asn_SEQUENCE_specifics_t asn_SPC_CU_CP_Usage_Report_Per_UE_specs_1 = { - sizeof(struct CU_CP_Usage_Report_Per_UE), - offsetof(struct CU_CP_Usage_Report_Per_UE, _asn_ctx), - asn_MAP_CU_CP_Usage_Report_Per_UE_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_CU_CP_Usage_Report_Per_UE = { - "CU-CP-Usage-Report-Per-UE", - "CU-CP-Usage-Report-Per-UE", - &asn_OP_SEQUENCE, - asn_DEF_CU_CP_Usage_Report_Per_UE_tags_1, - sizeof(asn_DEF_CU_CP_Usage_Report_Per_UE_tags_1) - /sizeof(asn_DEF_CU_CP_Usage_Report_Per_UE_tags_1[0]), /* 1 */ - asn_DEF_CU_CP_Usage_Report_Per_UE_tags_1, /* Same as above */ - sizeof(asn_DEF_CU_CP_Usage_Report_Per_UE_tags_1) - /sizeof(asn_DEF_CU_CP_Usage_Report_Per_UE_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_CU_CP_Usage_Report_Per_UE_1, - 1, /* Elements count */ - &asn_SPC_CU_CP_Usage_Report_Per_UE_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/CU-CP-Usage-Report-UeResourceReportItem.c b/e2sm/lib/CU-CP-Usage-Report-UeResourceReportItem.c deleted file mode 100644 index c78f44a..0000000 --- a/e2sm/lib/CU-CP-Usage-Report-UeResourceReportItem.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "CU-CP-Usage-Report-UeResourceReportItem.h" - -asn_TYPE_member_t asn_MBR_CU_CP_Usage_Report_UeResourceReportItem_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct CU_CP_Usage_Report_UeResourceReportItem, c_RNTI), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_C_RNTI, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "c-RNTI" - }, - { ATF_POINTER, 2, offsetof(struct CU_CP_Usage_Report_UeResourceReportItem, serving_Cell_RF_Type), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "serving-Cell-RF-Type" - }, - { ATF_POINTER, 1, offsetof(struct CU_CP_Usage_Report_UeResourceReportItem, neighbor_Cell_RF), - (ASN_TAG_CLASS_CONTEXT | (2 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "neighbor-Cell-RF" - }, -}; -static const int asn_MAP_CU_CP_Usage_Report_UeResourceReportItem_oms_1[] = { 1, 2 }; -static const ber_tlv_tag_t asn_DEF_CU_CP_Usage_Report_UeResourceReportItem_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_CU_CP_Usage_Report_UeResourceReportItem_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* c-RNTI */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* serving-Cell-RF-Type */ - { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* neighbor-Cell-RF */ -}; -asn_SEQUENCE_specifics_t asn_SPC_CU_CP_Usage_Report_UeResourceReportItem_specs_1 = { - sizeof(struct CU_CP_Usage_Report_UeResourceReportItem), - offsetof(struct CU_CP_Usage_Report_UeResourceReportItem, _asn_ctx), - asn_MAP_CU_CP_Usage_Report_UeResourceReportItem_tag2el_1, - 3, /* Count of tags in the map */ - asn_MAP_CU_CP_Usage_Report_UeResourceReportItem_oms_1, /* Optional members */ - 2, 0, /* Root/Additions */ - 3, /* First extension addition */ -}; -asn_TYPE_descriptor_t asn_DEF_CU_CP_Usage_Report_UeResourceReportItem = { - "CU-CP-Usage-Report-UeResourceReportItem", - "CU-CP-Usage-Report-UeResourceReportItem", - &asn_OP_SEQUENCE, - asn_DEF_CU_CP_Usage_Report_UeResourceReportItem_tags_1, - sizeof(asn_DEF_CU_CP_Usage_Report_UeResourceReportItem_tags_1) - /sizeof(asn_DEF_CU_CP_Usage_Report_UeResourceReportItem_tags_1[0]), /* 1 */ - asn_DEF_CU_CP_Usage_Report_UeResourceReportItem_tags_1, /* Same as above */ - sizeof(asn_DEF_CU_CP_Usage_Report_UeResourceReportItem_tags_1) - /sizeof(asn_DEF_CU_CP_Usage_Report_UeResourceReportItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_CU_CP_Usage_Report_UeResourceReportItem_1, - 3, /* Elements count */ - &asn_SPC_CU_CP_Usage_Report_UeResourceReportItem_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/CU-UP-Usage-Report-CellResourceReportItem.c b/e2sm/lib/CU-UP-Usage-Report-CellResourceReportItem.c deleted file mode 100644 index c5175c7..0000000 --- a/e2sm/lib/CU-UP-Usage-Report-CellResourceReportItem.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "CU-UP-Usage-Report-CellResourceReportItem.h" - -#include "CU-UP-Usage-Report-UeResourceReportItem.h" -static int -memb_ueResourceReportList_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 <= 32)) { - /* 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_ueResourceReportList_constr_3 CC_NOTUSED = { - { 0, 0 }, - -1 /* (SIZE(1..32)) */}; -static asn_per_constraints_t asn_PER_type_ueResourceReportList_constr_3 CC_NOTUSED = { - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, - 0, 0 /* No PER value map */ -}; -static asn_oer_constraints_t asn_OER_memb_ueResourceReportList_constr_3 CC_NOTUSED = { - { 0, 0 }, - -1 /* (SIZE(1..32)) */}; -static asn_per_constraints_t asn_PER_memb_ueResourceReportList_constr_3 CC_NOTUSED = { - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, - 0, 0 /* No PER value map */ -}; -static asn_TYPE_member_t asn_MBR_ueResourceReportList_3[] = { - { ATF_POINTER, 0, 0, - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - 0, - &asn_DEF_CU_UP_Usage_Report_UeResourceReportItem, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "" - }, -}; -static const ber_tlv_tag_t asn_DEF_ueResourceReportList_tags_3[] = { - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static asn_SET_OF_specifics_t asn_SPC_ueResourceReportList_specs_3 = { - sizeof(struct CU_UP_Usage_Report_CellResourceReportItem__ueResourceReportList), - offsetof(struct CU_UP_Usage_Report_CellResourceReportItem__ueResourceReportList, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ -}; -static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_ueResourceReportList_3 = { - "ueResourceReportList", - "ueResourceReportList", - &asn_OP_SEQUENCE_OF, - asn_DEF_ueResourceReportList_tags_3, - sizeof(asn_DEF_ueResourceReportList_tags_3) - /sizeof(asn_DEF_ueResourceReportList_tags_3[0]) - 1, /* 1 */ - asn_DEF_ueResourceReportList_tags_3, /* Same as above */ - sizeof(asn_DEF_ueResourceReportList_tags_3) - /sizeof(asn_DEF_ueResourceReportList_tags_3[0]), /* 2 */ - { &asn_OER_type_ueResourceReportList_constr_3, &asn_PER_type_ueResourceReportList_constr_3, SEQUENCE_OF_constraint }, - asn_MBR_ueResourceReportList_3, - 1, /* Single element */ - &asn_SPC_ueResourceReportList_specs_3 /* Additional specs */ -}; - -asn_TYPE_member_t asn_MBR_CU_UP_Usage_Report_CellResourceReportItem_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct CU_UP_Usage_Report_CellResourceReportItem, 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_NOFLAGS, 0, offsetof(struct CU_UP_Usage_Report_CellResourceReportItem, ueResourceReportList), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - 0, - &asn_DEF_ueResourceReportList_3, - 0, - { &asn_OER_memb_ueResourceReportList_constr_3, &asn_PER_memb_ueResourceReportList_constr_3, memb_ueResourceReportList_constraint_1 }, - 0, 0, /* No default value */ - "ueResourceReportList" - }, -}; -static const ber_tlv_tag_t asn_DEF_CU_UP_Usage_Report_CellResourceReportItem_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_CU_UP_Usage_Report_CellResourceReportItem_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nRCGI */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ueResourceReportList */ -}; -asn_SEQUENCE_specifics_t asn_SPC_CU_UP_Usage_Report_CellResourceReportItem_specs_1 = { - sizeof(struct CU_UP_Usage_Report_CellResourceReportItem), - offsetof(struct CU_UP_Usage_Report_CellResourceReportItem, _asn_ctx), - asn_MAP_CU_UP_Usage_Report_CellResourceReportItem_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_CU_UP_Usage_Report_CellResourceReportItem = { - "CU-UP-Usage-Report-CellResourceReportItem", - "CU-UP-Usage-Report-CellResourceReportItem", - &asn_OP_SEQUENCE, - asn_DEF_CU_UP_Usage_Report_CellResourceReportItem_tags_1, - sizeof(asn_DEF_CU_UP_Usage_Report_CellResourceReportItem_tags_1) - /sizeof(asn_DEF_CU_UP_Usage_Report_CellResourceReportItem_tags_1[0]), /* 1 */ - asn_DEF_CU_UP_Usage_Report_CellResourceReportItem_tags_1, /* Same as above */ - sizeof(asn_DEF_CU_UP_Usage_Report_CellResourceReportItem_tags_1) - /sizeof(asn_DEF_CU_UP_Usage_Report_CellResourceReportItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_CU_UP_Usage_Report_CellResourceReportItem_1, - 2, /* Elements count */ - &asn_SPC_CU_UP_Usage_Report_CellResourceReportItem_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/CU-UP-Usage-Report-Per-UE.c b/e2sm/lib/CU-UP-Usage-Report-Per-UE.c deleted file mode 100644 index 9a6b24b..0000000 --- a/e2sm/lib/CU-UP-Usage-Report-Per-UE.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "CU-UP-Usage-Report-Per-UE.h" - -#include "CU-UP-Usage-Report-CellResourceReportItem.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_CU_UP_Usage_Report_CellResourceReportItem, - 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 CU_UP_Usage_Report_Per_UE__cellResourceReportList), - offsetof(struct CU_UP_Usage_Report_Per_UE__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_CU_UP_Usage_Report_Per_UE_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct CU_UP_Usage_Report_Per_UE, 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_CU_UP_Usage_Report_Per_UE_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_CU_UP_Usage_Report_Per_UE_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* cellResourceReportList */ -}; -asn_SEQUENCE_specifics_t asn_SPC_CU_UP_Usage_Report_Per_UE_specs_1 = { - sizeof(struct CU_UP_Usage_Report_Per_UE), - offsetof(struct CU_UP_Usage_Report_Per_UE, _asn_ctx), - asn_MAP_CU_UP_Usage_Report_Per_UE_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_CU_UP_Usage_Report_Per_UE = { - "CU-UP-Usage-Report-Per-UE", - "CU-UP-Usage-Report-Per-UE", - &asn_OP_SEQUENCE, - asn_DEF_CU_UP_Usage_Report_Per_UE_tags_1, - sizeof(asn_DEF_CU_UP_Usage_Report_Per_UE_tags_1) - /sizeof(asn_DEF_CU_UP_Usage_Report_Per_UE_tags_1[0]), /* 1 */ - asn_DEF_CU_UP_Usage_Report_Per_UE_tags_1, /* Same as above */ - sizeof(asn_DEF_CU_UP_Usage_Report_Per_UE_tags_1) - /sizeof(asn_DEF_CU_UP_Usage_Report_Per_UE_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_CU_UP_Usage_Report_Per_UE_1, - 1, /* Elements count */ - &asn_SPC_CU_UP_Usage_Report_Per_UE_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/CU-UP-Usage-Report-UeResourceReportItem.c b/e2sm/lib/CU-UP-Usage-Report-UeResourceReportItem.c deleted file mode 100644 index f03bddf..0000000 --- a/e2sm/lib/CU-UP-Usage-Report-UeResourceReportItem.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "CU-UP-Usage-Report-UeResourceReportItem.h" - -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_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_CU_UP_Usage_Report_UeResourceReportItem_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct CU_UP_Usage_Report_UeResourceReportItem, c_RNTI), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_C_RNTI, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "c-RNTI" - }, - { ATF_POINTER, 2, offsetof(struct CU_UP_Usage_Report_UeResourceReportItem, 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 CU_UP_Usage_Report_UeResourceReportItem, 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_CU_UP_Usage_Report_UeResourceReportItem_oms_1[] = { 1, 2 }; -static const ber_tlv_tag_t asn_DEF_CU_UP_Usage_Report_UeResourceReportItem_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_CU_UP_Usage_Report_UeResourceReportItem_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* c-RNTI */ - { (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_CU_UP_Usage_Report_UeResourceReportItem_specs_1 = { - sizeof(struct CU_UP_Usage_Report_UeResourceReportItem), - offsetof(struct CU_UP_Usage_Report_UeResourceReportItem, _asn_ctx), - asn_MAP_CU_UP_Usage_Report_UeResourceReportItem_tag2el_1, - 3, /* Count of tags in the map */ - asn_MAP_CU_UP_Usage_Report_UeResourceReportItem_oms_1, /* Optional members */ - 2, 0, /* Root/Additions */ - 3, /* First extension addition */ -}; -asn_TYPE_descriptor_t asn_DEF_CU_UP_Usage_Report_UeResourceReportItem = { - "CU-UP-Usage-Report-UeResourceReportItem", - "CU-UP-Usage-Report-UeResourceReportItem", - &asn_OP_SEQUENCE, - asn_DEF_CU_UP_Usage_Report_UeResourceReportItem_tags_1, - sizeof(asn_DEF_CU_UP_Usage_Report_UeResourceReportItem_tags_1) - /sizeof(asn_DEF_CU_UP_Usage_Report_UeResourceReportItem_tags_1[0]), /* 1 */ - asn_DEF_CU_UP_Usage_Report_UeResourceReportItem_tags_1, /* Same as above */ - sizeof(asn_DEF_CU_UP_Usage_Report_UeResourceReportItem_tags_1) - /sizeof(asn_DEF_CU_UP_Usage_Report_UeResourceReportItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_CU_UP_Usage_Report_UeResourceReportItem_1, - 3, /* Elements count */ - &asn_SPC_CU_UP_Usage_Report_UeResourceReportItem_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/CUUPMeasurement-Container.c b/e2sm/lib/CUUPMeasurement-Container.c deleted file mode 100644 index 116631e..0000000 --- a/e2sm/lib/CUUPMeasurement-Container.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/CellResourceReportListItem.c b/e2sm/lib/CellResourceReportListItem.c deleted file mode 100644 index ce16175..0000000 --- a/e2sm/lib/CellResourceReportListItem.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/CoreCPID.c b/e2sm/lib/CoreCPID.c index b1ff013..1777e18 100644 --- a/e2sm/lib/CoreCPID.c +++ b/e2sm/lib/CoreCPID.c @@ -1,26 +1,41 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "CoreCPID.h" #include "GUAMI.h" #include "GUMMEI.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_CoreCPID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_CoreCPID_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_CoreCPID_1[] = { { ATF_POINTER, 0, offsetof(struct CoreCPID, choice.fiveGC), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GUAMI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "fiveGC" }, @@ -29,7 +44,15 @@ static asn_TYPE_member_t asn_MBR_CoreCPID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GUMMEI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ePC" }, @@ -56,7 +79,15 @@ asn_TYPE_descriptor_t asn_DEF_CoreCPID = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_CoreCPID_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_CoreCPID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_CoreCPID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_CoreCPID_1, 2, /* Elements count */ &asn_SPC_CoreCPID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/DU-Usage-Report-CellResourceReportItem.c b/e2sm/lib/DU-Usage-Report-CellResourceReportItem.c deleted file mode 100644 index fec3873..0000000 --- a/e2sm/lib/DU-Usage-Report-CellResourceReportItem.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "DU-Usage-Report-CellResourceReportItem.h" - -#include "DU-Usage-Report-UeResourceReportItem.h" -static int -memb_ueResourceReportList_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 <= 32)) { - /* 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_ueResourceReportList_constr_3 CC_NOTUSED = { - { 0, 0 }, - -1 /* (SIZE(1..32)) */}; -static asn_per_constraints_t asn_PER_type_ueResourceReportList_constr_3 CC_NOTUSED = { - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, - 0, 0 /* No PER value map */ -}; -static asn_oer_constraints_t asn_OER_memb_ueResourceReportList_constr_3 CC_NOTUSED = { - { 0, 0 }, - -1 /* (SIZE(1..32)) */}; -static asn_per_constraints_t asn_PER_memb_ueResourceReportList_constr_3 CC_NOTUSED = { - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, - 0, 0 /* No PER value map */ -}; -static asn_TYPE_member_t asn_MBR_ueResourceReportList_3[] = { - { ATF_POINTER, 0, 0, - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - 0, - &asn_DEF_DU_Usage_Report_UeResourceReportItem, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "" - }, -}; -static const ber_tlv_tag_t asn_DEF_ueResourceReportList_tags_3[] = { - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static asn_SET_OF_specifics_t asn_SPC_ueResourceReportList_specs_3 = { - sizeof(struct DU_Usage_Report_CellResourceReportItem__ueResourceReportList), - offsetof(struct DU_Usage_Report_CellResourceReportItem__ueResourceReportList, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ -}; -static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_ueResourceReportList_3 = { - "ueResourceReportList", - "ueResourceReportList", - &asn_OP_SEQUENCE_OF, - asn_DEF_ueResourceReportList_tags_3, - sizeof(asn_DEF_ueResourceReportList_tags_3) - /sizeof(asn_DEF_ueResourceReportList_tags_3[0]) - 1, /* 1 */ - asn_DEF_ueResourceReportList_tags_3, /* Same as above */ - sizeof(asn_DEF_ueResourceReportList_tags_3) - /sizeof(asn_DEF_ueResourceReportList_tags_3[0]), /* 2 */ - { &asn_OER_type_ueResourceReportList_constr_3, &asn_PER_type_ueResourceReportList_constr_3, SEQUENCE_OF_constraint }, - asn_MBR_ueResourceReportList_3, - 1, /* Single element */ - &asn_SPC_ueResourceReportList_specs_3 /* Additional specs */ -}; - -asn_TYPE_member_t asn_MBR_DU_Usage_Report_CellResourceReportItem_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct DU_Usage_Report_CellResourceReportItem, 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_NOFLAGS, 0, offsetof(struct DU_Usage_Report_CellResourceReportItem, ueResourceReportList), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - 0, - &asn_DEF_ueResourceReportList_3, - 0, - { &asn_OER_memb_ueResourceReportList_constr_3, &asn_PER_memb_ueResourceReportList_constr_3, memb_ueResourceReportList_constraint_1 }, - 0, 0, /* No default value */ - "ueResourceReportList" - }, -}; -static const ber_tlv_tag_t asn_DEF_DU_Usage_Report_CellResourceReportItem_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_DU_Usage_Report_CellResourceReportItem_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nRCGI */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ueResourceReportList */ -}; -asn_SEQUENCE_specifics_t asn_SPC_DU_Usage_Report_CellResourceReportItem_specs_1 = { - sizeof(struct DU_Usage_Report_CellResourceReportItem), - offsetof(struct DU_Usage_Report_CellResourceReportItem, _asn_ctx), - asn_MAP_DU_Usage_Report_CellResourceReportItem_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_DU_Usage_Report_CellResourceReportItem = { - "DU-Usage-Report-CellResourceReportItem", - "DU-Usage-Report-CellResourceReportItem", - &asn_OP_SEQUENCE, - asn_DEF_DU_Usage_Report_CellResourceReportItem_tags_1, - sizeof(asn_DEF_DU_Usage_Report_CellResourceReportItem_tags_1) - /sizeof(asn_DEF_DU_Usage_Report_CellResourceReportItem_tags_1[0]), /* 1 */ - asn_DEF_DU_Usage_Report_CellResourceReportItem_tags_1, /* Same as above */ - sizeof(asn_DEF_DU_Usage_Report_CellResourceReportItem_tags_1) - /sizeof(asn_DEF_DU_Usage_Report_CellResourceReportItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_DU_Usage_Report_CellResourceReportItem_1, - 2, /* Elements count */ - &asn_SPC_DU_Usage_Report_CellResourceReportItem_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/DU-Usage-Report-Per-UE.c b/e2sm/lib/DU-Usage-Report-Per-UE.c deleted file mode 100644 index 550592a..0000000 --- a/e2sm/lib/DU-Usage-Report-Per-UE.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "DU-Usage-Report-Per-UE.h" - -#include "DU-Usage-Report-CellResourceReportItem.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_DU_Usage_Report_CellResourceReportItem, - 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 DU_Usage_Report_Per_UE__cellResourceReportList), - offsetof(struct DU_Usage_Report_Per_UE__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_DU_Usage_Report_Per_UE_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct DU_Usage_Report_Per_UE, 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_DU_Usage_Report_Per_UE_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_DU_Usage_Report_Per_UE_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* cellResourceReportList */ -}; -asn_SEQUENCE_specifics_t asn_SPC_DU_Usage_Report_Per_UE_specs_1 = { - sizeof(struct DU_Usage_Report_Per_UE), - offsetof(struct DU_Usage_Report_Per_UE, _asn_ctx), - asn_MAP_DU_Usage_Report_Per_UE_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_DU_Usage_Report_Per_UE = { - "DU-Usage-Report-Per-UE", - "DU-Usage-Report-Per-UE", - &asn_OP_SEQUENCE, - asn_DEF_DU_Usage_Report_Per_UE_tags_1, - sizeof(asn_DEF_DU_Usage_Report_Per_UE_tags_1) - /sizeof(asn_DEF_DU_Usage_Report_Per_UE_tags_1[0]), /* 1 */ - asn_DEF_DU_Usage_Report_Per_UE_tags_1, /* Same as above */ - sizeof(asn_DEF_DU_Usage_Report_Per_UE_tags_1) - /sizeof(asn_DEF_DU_Usage_Report_Per_UE_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_DU_Usage_Report_Per_UE_1, - 1, /* Elements count */ - &asn_SPC_DU_Usage_Report_Per_UE_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/DU-Usage-Report-UeResourceReportItem.c b/e2sm/lib/DU-Usage-Report-UeResourceReportItem.c deleted file mode 100644 index 8809094..0000000 --- a/e2sm/lib/DU-Usage-Report-UeResourceReportItem.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "DU-Usage-Report-UeResourceReportItem.h" - -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 <= 1000000000)) { - /* 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 <= 1000000000)) { - /* 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_dl_PRBUsage_constr_3 CC_NOTUSED = { - { 0, 0 }, - -1}; -static asn_per_constraints_t asn_PER_memb_dl_PRBUsage_constr_3 CC_NOTUSED = { - { APC_CONSTRAINED | APC_EXTENSIBLE, 30, -1, 0, 1000000000 } /* (0..1000000000,...) */, - { 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 = { - { 0, 0 }, - -1}; -static asn_per_constraints_t asn_PER_memb_ul_PRBUsage_constr_4 CC_NOTUSED = { - { APC_CONSTRAINED | APC_EXTENSIBLE, 30, -1, 0, 1000000000 } /* (0..1000000000,...) */, - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - 0, 0 /* No PER value map */ -}; -asn_TYPE_member_t asn_MBR_DU_Usage_Report_UeResourceReportItem_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct DU_Usage_Report_UeResourceReportItem, c_RNTI), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_C_RNTI, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "c-RNTI" - }, - { ATF_POINTER, 2, offsetof(struct DU_Usage_Report_UeResourceReportItem, 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 DU_Usage_Report_UeResourceReportItem, 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_DU_Usage_Report_UeResourceReportItem_oms_1[] = { 1, 2 }; -static const ber_tlv_tag_t asn_DEF_DU_Usage_Report_UeResourceReportItem_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_DU_Usage_Report_UeResourceReportItem_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* c-RNTI */ - { (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_DU_Usage_Report_UeResourceReportItem_specs_1 = { - sizeof(struct DU_Usage_Report_UeResourceReportItem), - offsetof(struct DU_Usage_Report_UeResourceReportItem, _asn_ctx), - asn_MAP_DU_Usage_Report_UeResourceReportItem_tag2el_1, - 3, /* Count of tags in the map */ - asn_MAP_DU_Usage_Report_UeResourceReportItem_oms_1, /* Optional members */ - 2, 0, /* Root/Additions */ - 3, /* First extension addition */ -}; -asn_TYPE_descriptor_t asn_DEF_DU_Usage_Report_UeResourceReportItem = { - "DU-Usage-Report-UeResourceReportItem", - "DU-Usage-Report-UeResourceReportItem", - &asn_OP_SEQUENCE, - asn_DEF_DU_Usage_Report_UeResourceReportItem_tags_1, - sizeof(asn_DEF_DU_Usage_Report_UeResourceReportItem_tags_1) - /sizeof(asn_DEF_DU_Usage_Report_UeResourceReportItem_tags_1[0]), /* 1 */ - asn_DEF_DU_Usage_Report_UeResourceReportItem_tags_1, /* Same as above */ - sizeof(asn_DEF_DU_Usage_Report_UeResourceReportItem_tags_1) - /sizeof(asn_DEF_DU_Usage_Report_UeResourceReportItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_DU_Usage_Report_UeResourceReportItem_1, - 3, /* Elements count */ - &asn_SPC_DU_Usage_Report_UeResourceReportItem_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/E-UTRA-ARFCN.c b/e2sm/lib/E-UTRA-ARFCN.c index d1c0711..d5ffbc4 100644 --- a/e2sm/lib/E-UTRA-ARFCN.c +++ b/e2sm/lib/E-UTRA-ARFCN.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E-UTRA-ARFCN.h" @@ -21,7 +21,7 @@ E_UTRA_ARFCN_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 65535)) { + if((value >= 0L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ E_UTRA_ARFCN_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E_UTRA_ARFCN_constr_1 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_E_UTRA_ARFCN_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_E_UTRA_ARFCN_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_E_UTRA_ARFCN = { asn_DEF_E_UTRA_ARFCN_tags_1, /* Same as above */ sizeof(asn_DEF_E_UTRA_ARFCN_tags_1) /sizeof(asn_DEF_E_UTRA_ARFCN_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_E_UTRA_ARFCN_constr_1, E_UTRA_ARFCN_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E_UTRA_ARFCN_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E_UTRA_ARFCN_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + E_UTRA_ARFCN_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/E-UTRA-PCI.c b/e2sm/lib/E-UTRA-PCI.c index e84f147..5da8340 100644 --- a/e2sm/lib/E-UTRA-PCI.c +++ b/e2sm/lib/E-UTRA-PCI.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E-UTRA-PCI.h" @@ -21,7 +21,7 @@ E_UTRA_PCI_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 503)) { + if((value >= 0L && value <= 503L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ E_UTRA_PCI_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E_UTRA_PCI_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_E_UTRA_PCI_constr_1 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 9, 9, 0, 503 } /* (0..503,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_E_UTRA_PCI_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_E_UTRA_PCI = { asn_DEF_E_UTRA_PCI_tags_1, /* Same as above */ sizeof(asn_DEF_E_UTRA_PCI_tags_1) /sizeof(asn_DEF_E_UTRA_PCI_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_E_UTRA_PCI_constr_1, E_UTRA_PCI_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E_UTRA_PCI_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E_UTRA_PCI_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + E_UTRA_PCI_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/E-UTRA-TAC.c b/e2sm/lib/E-UTRA-TAC.c index 2c90250..999654e 100644 --- a/e2sm/lib/E-UTRA-TAC.c +++ b/e2sm/lib/E-UTRA-TAC.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E-UTRA-TAC.h" @@ -22,7 +22,7 @@ E_UTRA_TAC_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size == 2)) { + if((size == 2UL)) { /* Constraint check succeeded */ return 0; } else { @@ -37,11 +37,18 @@ E_UTRA_TAC_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_E_UTRA_TAC_constr_1 CC_NOTUSED = { + { 0, 0 }, + 2 /* (SIZE(2..2)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_E_UTRA_TAC_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 2, 2 } /* (SIZE(2..2)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_E_UTRA_TAC_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; @@ -55,7 +62,15 @@ asn_TYPE_descriptor_t asn_DEF_E_UTRA_TAC = { asn_DEF_E_UTRA_TAC_tags_1, /* Same as above */ sizeof(asn_DEF_E_UTRA_TAC_tags_1) /sizeof(asn_DEF_E_UTRA_TAC_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_E_UTRA_TAC_constr_1, E_UTRA_TAC_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_E_UTRA_TAC_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_E_UTRA_TAC_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + E_UTRA_TAC_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/E2SM-KPM-ActionDefinition-Format1.c b/e2sm/lib/E2SM-KPM-ActionDefinition-Format1.c index 4975a24..dee4c12 100644 --- a/e2sm/lib/E2SM-KPM-ActionDefinition-Format1.c +++ b/e2sm/lib/E2SM-KPM-ActionDefinition-Format1.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-ActionDefinition-Format1.h" @@ -14,7 +14,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_ActionDefinition_Format1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementInfoList, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measInfoList" }, @@ -23,7 +31,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_ActionDefinition_Format1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GranularityPeriod, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "granulPeriod" }, @@ -32,7 +48,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_ActionDefinition_Format1_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_CGI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "cellGlobalID" }, @@ -65,7 +89,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_ActionDefinition_Format1 = { asn_DEF_E2SM_KPM_ActionDefinition_Format1_tags_1, /* Same as above */ sizeof(asn_DEF_E2SM_KPM_ActionDefinition_Format1_tags_1) /sizeof(asn_DEF_E2SM_KPM_ActionDefinition_Format1_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2SM_KPM_ActionDefinition_Format1_1, 3, /* Elements count */ &asn_SPC_E2SM_KPM_ActionDefinition_Format1_specs_1 /* Additional specs */ diff --git a/e2sm/lib/E2SM-KPM-ActionDefinition-Format2.c b/e2sm/lib/E2SM-KPM-ActionDefinition-Format2.c index 3768a39..86e66c1 100644 --- a/e2sm/lib/E2SM-KPM-ActionDefinition-Format2.c +++ b/e2sm/lib/E2SM-KPM-ActionDefinition-Format2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-ActionDefinition-Format2.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_ActionDefinition_Format2_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_UEID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ueID" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_ActionDefinition_Format2_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_E2SM_KPM_ActionDefinition_Format1, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "subscriptInfo" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_ActionDefinition_Format2 = { asn_DEF_E2SM_KPM_ActionDefinition_Format2_tags_1, /* Same as above */ sizeof(asn_DEF_E2SM_KPM_ActionDefinition_Format2_tags_1) /sizeof(asn_DEF_E2SM_KPM_ActionDefinition_Format2_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2SM_KPM_ActionDefinition_Format2_1, 2, /* Elements count */ &asn_SPC_E2SM_KPM_ActionDefinition_Format2_specs_1 /* Additional specs */ diff --git a/e2sm/lib/E2SM-KPM-ActionDefinition-Format3.c b/e2sm/lib/E2SM-KPM-ActionDefinition-Format3.c index 3851720..aefaa46 100644 --- a/e2sm/lib/E2SM-KPM-ActionDefinition-Format3.c +++ b/e2sm/lib/E2SM-KPM-ActionDefinition-Format3.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-ActionDefinition-Format3.h" @@ -14,7 +14,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_ActionDefinition_Format3_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementCondList, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measCondList" }, @@ -23,7 +31,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_ActionDefinition_Format3_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GranularityPeriod, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "granulPeriod" }, @@ -32,7 +48,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_ActionDefinition_Format3_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_CGI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "cellGlobalID" }, @@ -65,7 +89,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_ActionDefinition_Format3 = { asn_DEF_E2SM_KPM_ActionDefinition_Format3_tags_1, /* Same as above */ sizeof(asn_DEF_E2SM_KPM_ActionDefinition_Format3_tags_1) /sizeof(asn_DEF_E2SM_KPM_ActionDefinition_Format3_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2SM_KPM_ActionDefinition_Format3_1, 3, /* Elements count */ &asn_SPC_E2SM_KPM_ActionDefinition_Format3_specs_1 /* Additional specs */ diff --git a/e2sm/lib/E2SM-KPM-ActionDefinition.c b/e2sm/lib/E2SM-KPM-ActionDefinition.c index 4b22a6c..dfcbe58 100644 --- a/e2sm/lib/E2SM-KPM-ActionDefinition.c +++ b/e2sm/lib/E2SM-KPM-ActionDefinition.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-ActionDefinition.h" @@ -10,18 +10,33 @@ #include "E2SM-KPM-ActionDefinition-Format1.h" #include "E2SM-KPM-ActionDefinition-Format2.h" #include "E2SM-KPM-ActionDefinition-Format3.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_actionDefinition_formats_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_actionDefinition_formats_constr_3 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_actionDefinition_formats_3[] = { { ATF_POINTER, 0, offsetof(struct E2SM_KPM_ActionDefinition__actionDefinition_formats, choice.actionDefinition_Format1), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_E2SM_KPM_ActionDefinition_Format1, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "actionDefinition-Format1" }, @@ -30,7 +45,15 @@ static asn_TYPE_member_t asn_MBR_actionDefinition_formats_3[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_E2SM_KPM_ActionDefinition_Format2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "actionDefinition-Format2" }, @@ -39,7 +62,15 @@ static asn_TYPE_member_t asn_MBR_actionDefinition_formats_3[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_E2SM_KPM_ActionDefinition_Format3, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "actionDefinition-Format3" }, @@ -68,7 +99,15 @@ asn_TYPE_descriptor_t asn_DEF_actionDefinition_formats_3 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_actionDefinition_formats_constr_3, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_actionDefinition_formats_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_actionDefinition_formats_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_actionDefinition_formats_3, 3, /* Elements count */ &asn_SPC_actionDefinition_formats_specs_3 /* Additional specs */ @@ -80,7 +119,15 @@ static asn_TYPE_member_t asn_MBR_E2SM_KPM_ActionDefinition_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RIC_Style_Type, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ric-Style-Type" }, @@ -89,7 +136,15 @@ static asn_TYPE_member_t asn_MBR_E2SM_KPM_ActionDefinition_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_actionDefinition_formats_3, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "actionDefinition-formats" }, @@ -119,7 +174,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_ActionDefinition = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2SM_KPM_ActionDefinition_1, 2, /* Elements count */ &asn_SPC_E2SM_KPM_ActionDefinition_specs_1 /* Additional specs */ diff --git a/e2sm/lib/E2SM-KPM-EventTriggerDefinition-Format1.c b/e2sm/lib/E2SM-KPM-EventTriggerDefinition-Format1.c index 27ea6c1..f41a6df 100644 --- a/e2sm/lib/E2SM-KPM-EventTriggerDefinition-Format1.c +++ b/e2sm/lib/E2SM-KPM-EventTriggerDefinition-Format1.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-EventTriggerDefinition-Format1.h" @@ -21,7 +21,7 @@ reportingPeriod_2_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const unsigned long *)sptr; - if((value >= 1 && value <= 4294967295)) { + if((value >= 1UL && value <= 4294967295UL)) { /* Constraint check succeeded */ return 0; } else { @@ -50,7 +50,7 @@ memb_reportingPeriod_constraint_1(const asn_TYPE_descriptor_t *td, const void *s value = *(const unsigned long *)sptr; - if((value >= 1 && value <= 4294967295)) { + if((value >= 1UL && value <= 4294967295UL)) { /* Constraint check succeeded */ return 0; } else { @@ -61,16 +61,30 @@ memb_reportingPeriod_constraint_1(const asn_TYPE_descriptor_t *td, const void *s } } +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_reportingPeriod_constr_2 CC_NOTUSED = { + { 4, 1 } /* (1..4294967295) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_reportingPeriod_constr_2 CC_NOTUSED = { { APC_CONSTRAINED, 32, -1, 1, 4294967295 } /* (1..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_reportingPeriod_constr_2 CC_NOTUSED = { + { 4, 1 } /* (1..4294967295) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_reportingPeriod_constr_2 CC_NOTUSED = { { APC_CONSTRAINED, 32, -1, 1, 4294967295 } /* (1..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_specifics_t asn_SPC_reportingPeriod_specs_2 = { 0, 0, 0, 0, 0, 0, /* Native long size */ @@ -91,7 +105,15 @@ asn_TYPE_descriptor_t asn_DEF_reportingPeriod_2 = { asn_DEF_reportingPeriod_tags_2, /* Same as above */ sizeof(asn_DEF_reportingPeriod_tags_2) /sizeof(asn_DEF_reportingPeriod_tags_2[0]), /* 2 */ - { 0, &asn_PER_type_reportingPeriod_constr_2, reportingPeriod_2_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_reportingPeriod_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_reportingPeriod_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + reportingPeriod_2_constraint + }, 0, 0, /* No members */ &asn_SPC_reportingPeriod_specs_2 /* Additional specs */ }; @@ -102,7 +124,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_EventTriggerDefinition_Format1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_reportingPeriod_2, 0, - { 0, &asn_PER_memb_reportingPeriod_constr_2, memb_reportingPeriod_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_reportingPeriod_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_reportingPeriod_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_reportingPeriod_constraint_1 + }, 0, 0, /* No default value */ "reportingPeriod" }, @@ -131,7 +161,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_EventTriggerDefinition_Format1 = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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/e2sm/lib/E2SM-KPM-EventTriggerDefinition.c b/e2sm/lib/E2SM-KPM-EventTriggerDefinition.c index 0b12ca9..b81b0f3 100644 --- a/e2sm/lib/E2SM-KPM-EventTriggerDefinition.c +++ b/e2sm/lib/E2SM-KPM-EventTriggerDefinition.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-EventTriggerDefinition.h" #include "E2SM-KPM-EventTriggerDefinition-Format1.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_eventDefinition_formats_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_eventDefinition_formats_constr_2 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_eventDefinition_formats_2[] = { { ATF_POINTER, 0, offsetof(struct E2SM_KPM_EventTriggerDefinition__eventDefinition_formats, 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "eventDefinition-Format1" }, @@ -46,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_eventDefinition_formats_2 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_eventDefinition_formats_constr_2, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_eventDefinition_formats_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_eventDefinition_formats_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_eventDefinition_formats_2, 1, /* Elements count */ &asn_SPC_eventDefinition_formats_specs_2 /* Additional specs */ @@ -58,7 +81,15 @@ static asn_TYPE_member_t asn_MBR_E2SM_KPM_EventTriggerDefinition_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_eventDefinition_formats_2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "eventDefinition-formats" }, @@ -87,7 +118,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_EventTriggerDefinition = { asn_DEF_E2SM_KPM_EventTriggerDefinition_tags_1, /* Same as above */ sizeof(asn_DEF_E2SM_KPM_EventTriggerDefinition_tags_1) /sizeof(asn_DEF_E2SM_KPM_EventTriggerDefinition_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2SM_KPM_EventTriggerDefinition_1, 1, /* Elements count */ &asn_SPC_E2SM_KPM_EventTriggerDefinition_specs_1 /* Additional specs */ diff --git a/e2sm/lib/E2SM-KPM-IndicationHeader-Format1.c b/e2sm/lib/E2SM-KPM-IndicationHeader-Format1.c index 21e5ae3..f773e1c 100644 --- a/e2sm/lib/E2SM-KPM-IndicationHeader-Format1.c +++ b/e2sm/lib/E2SM-KPM-IndicationHeader-Format1.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-IndicationHeader-Format1.h" @@ -150,7 +150,7 @@ memb_fileFormatversion_constraint_1(const asn_TYPE_descriptor_t *td, const void size = st->size; - if((size <= 15) + if((size <= 15UL) && !check_permitted_alphabet_3(st)) { /* Constraint check succeeded */ return 0; @@ -187,7 +187,7 @@ memb_senderName_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size <= 400) + if((size <= 400UL) && !check_permitted_alphabet_4(st)) { /* Constraint check succeeded */ return 0; @@ -224,7 +224,7 @@ memb_senderType_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size <= 8) + if((size <= 8UL) && !check_permitted_alphabet_5(st)) { /* Constraint check succeeded */ return 0; @@ -261,7 +261,7 @@ memb_vendorName_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size <= 32) + if((size <= 32UL) && !check_permitted_alphabet_6(st)) { /* Constraint check succeeded */ return 0; @@ -283,37 +283,73 @@ static int asn_PER_MAP_vendorName_6_c2v(unsigned int code) { return -1; return permitted_alphabet_code2value_6[code]; } +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_fileFormatversion_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_fileFormatversion_constr_3 CC_NOTUSED = { { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, { APC_CONSTRAINED | APC_EXTENSIBLE, 4, 4, 0, 15 } /* (SIZE(0..15,...)) */, asn_PER_MAP_fileFormatversion_3_v2c, /* Value to PER code map */ asn_PER_MAP_fileFormatversion_3_c2v /* PER code to value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_senderName_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_senderName_constr_4 CC_NOTUSED = { { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, { APC_CONSTRAINED | APC_EXTENSIBLE, 9, 9, 0, 400 } /* (SIZE(0..400,...)) */, asn_PER_MAP_senderName_4_v2c, /* Value to PER code map */ asn_PER_MAP_senderName_4_c2v /* PER code to value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_senderType_constr_5 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_senderType_constr_5 CC_NOTUSED = { { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, { APC_CONSTRAINED | APC_EXTENSIBLE, 4, 4, 0, 8 } /* (SIZE(0..8,...)) */, asn_PER_MAP_senderType_5_v2c, /* Value to PER code map */ asn_PER_MAP_senderType_5_c2v /* PER code to value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_vendorName_constr_6 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_vendorName_constr_6 CC_NOTUSED = { { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, { APC_CONSTRAINED | APC_EXTENSIBLE, 6, 6, 0, 32 } /* (SIZE(0..32,...)) */, asn_PER_MAP_vendorName_6_v2c, /* Value to PER code map */ asn_PER_MAP_vendorName_6_c2v /* PER code to value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationHeader_Format1_1[] = { { ATF_NOFLAGS, 0, offsetof(struct E2SM_KPM_IndicationHeader_Format1, colletStartTime), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TimeStamp, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "colletStartTime" }, @@ -322,7 +358,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationHeader_Format1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PrintableString, 0, - { 0, &asn_PER_memb_fileFormatversion_constr_3, memb_fileFormatversion_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_fileFormatversion_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_fileFormatversion_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_fileFormatversion_constraint_1 + }, 0, 0, /* No default value */ "fileFormatversion" }, @@ -331,7 +375,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationHeader_Format1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PrintableString, 0, - { 0, &asn_PER_memb_senderName_constr_4, memb_senderName_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_senderName_constr_4, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_senderName_constr_4, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_senderName_constraint_1 + }, 0, 0, /* No default value */ "senderName" }, @@ -340,7 +392,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationHeader_Format1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PrintableString, 0, - { 0, &asn_PER_memb_senderType_constr_5, memb_senderType_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_senderType_constr_5, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_senderType_constr_5, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_senderType_constraint_1 + }, 0, 0, /* No default value */ "senderType" }, @@ -349,7 +409,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationHeader_Format1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PrintableString, 0, - { 0, &asn_PER_memb_vendorName_constr_6, memb_vendorName_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_vendorName_constr_6, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_vendorName_constr_6, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_vendorName_constraint_1 + }, 0, 0, /* No default value */ "vendorName" }, @@ -384,7 +452,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationHeader_Format1 = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2SM_KPM_IndicationHeader_Format1_1, 5, /* Elements count */ &asn_SPC_E2SM_KPM_IndicationHeader_Format1_specs_1 /* Additional specs */ diff --git a/e2sm/lib/E2SM-KPM-IndicationHeader.c b/e2sm/lib/E2SM-KPM-IndicationHeader.c index b2999ad..e88e1de 100644 --- a/e2sm/lib/E2SM-KPM-IndicationHeader.c +++ b/e2sm/lib/E2SM-KPM-IndicationHeader.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-IndicationHeader.h" #include "E2SM-KPM-IndicationHeader-Format1.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_indicationHeader_formats_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_indicationHeader_formats_constr_2 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_indicationHeader_formats_2[] = { { ATF_POINTER, 0, offsetof(struct E2SM_KPM_IndicationHeader__indicationHeader_formats, 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "indicationHeader-Format1" }, @@ -46,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_indicationHeader_formats_2 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_indicationHeader_formats_constr_2, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_indicationHeader_formats_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_indicationHeader_formats_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_indicationHeader_formats_2, 1, /* Elements count */ &asn_SPC_indicationHeader_formats_specs_2 /* Additional specs */ @@ -58,7 +81,15 @@ static asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationHeader_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_indicationHeader_formats_2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "indicationHeader-formats" }, @@ -87,7 +118,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationHeader = { asn_DEF_E2SM_KPM_IndicationHeader_tags_1, /* Same as above */ sizeof(asn_DEF_E2SM_KPM_IndicationHeader_tags_1) /sizeof(asn_DEF_E2SM_KPM_IndicationHeader_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2SM_KPM_IndicationHeader_1, 1, /* Elements count */ &asn_SPC_E2SM_KPM_IndicationHeader_specs_1 /* Additional specs */ diff --git a/e2sm/lib/E2SM-KPM-IndicationMessage-Format1.c b/e2sm/lib/E2SM-KPM-IndicationMessage-Format1.c index c20ffca..4c421b0 100644 --- a/e2sm/lib/E2SM-KPM-IndicationMessage-Format1.c +++ b/e2sm/lib/E2SM-KPM-IndicationMessage-Format1.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-IndicationMessage-Format1.h" @@ -14,7 +14,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationMessage_Format1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementData, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measData" }, @@ -23,7 +31,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationMessage_Format1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementInfoList, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measInfoList" }, @@ -32,7 +48,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationMessage_Format1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GranularityPeriod, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "granulPeriod" }, @@ -65,7 +89,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationMessage_Format1 = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2SM_KPM_IndicationMessage_Format1_1, 3, /* Elements count */ &asn_SPC_E2SM_KPM_IndicationMessage_Format1_specs_1 /* Additional specs */ diff --git a/e2sm/lib/E2SM-KPM-IndicationMessage-Format2.c b/e2sm/lib/E2SM-KPM-IndicationMessage-Format2.c index 8e00e8c..2a078a6 100644 --- a/e2sm/lib/E2SM-KPM-IndicationMessage-Format2.c +++ b/e2sm/lib/E2SM-KPM-IndicationMessage-Format2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-IndicationMessage-Format2.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationMessage_Format2_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementData, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measData" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationMessage_Format2_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementCondUEidList, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measCondUEidList" }, @@ -31,7 +47,15 @@ asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationMessage_Format2_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GranularityPeriod, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "granulPeriod" }, @@ -64,7 +88,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationMessage_Format2 = { asn_DEF_E2SM_KPM_IndicationMessage_Format2_tags_1, /* Same as above */ sizeof(asn_DEF_E2SM_KPM_IndicationMessage_Format2_tags_1) /sizeof(asn_DEF_E2SM_KPM_IndicationMessage_Format2_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2SM_KPM_IndicationMessage_Format2_1, 3, /* Elements count */ &asn_SPC_E2SM_KPM_IndicationMessage_Format2_specs_1 /* Additional specs */ diff --git a/e2sm/lib/E2SM-KPM-IndicationMessage.c b/e2sm/lib/E2SM-KPM-IndicationMessage.c index 120c1db..9c06349 100644 --- a/e2sm/lib/E2SM-KPM-IndicationMessage.c +++ b/e2sm/lib/E2SM-KPM-IndicationMessage.c @@ -1,26 +1,41 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-IndicationMessage.h" #include "E2SM-KPM-IndicationMessage-Format1.h" #include "E2SM-KPM-IndicationMessage-Format2.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_indicationMessage_formats_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_indicationMessage_formats_constr_2 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_indicationMessage_formats_2[] = { { ATF_POINTER, 0, offsetof(struct E2SM_KPM_IndicationMessage__indicationMessage_formats, choice.indicationMessage_Format1), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_E2SM_KPM_IndicationMessage_Format1, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "indicationMessage-Format1" }, @@ -29,7 +44,15 @@ static asn_TYPE_member_t asn_MBR_indicationMessage_formats_2[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_E2SM_KPM_IndicationMessage_Format2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "indicationMessage-Format2" }, @@ -57,7 +80,15 @@ asn_TYPE_descriptor_t asn_DEF_indicationMessage_formats_2 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_indicationMessage_formats_constr_2, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_indicationMessage_formats_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_indicationMessage_formats_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_indicationMessage_formats_2, 2, /* Elements count */ &asn_SPC_indicationMessage_formats_specs_2 /* Additional specs */ @@ -69,7 +100,15 @@ static asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationMessage_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_indicationMessage_formats_2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "indicationMessage-formats" }, @@ -98,7 +137,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationMessage = { asn_DEF_E2SM_KPM_IndicationMessage_tags_1, /* Same as above */ sizeof(asn_DEF_E2SM_KPM_IndicationMessage_tags_1) /sizeof(asn_DEF_E2SM_KPM_IndicationMessage_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2SM_KPM_IndicationMessage_1, 1, /* Elements count */ &asn_SPC_E2SM_KPM_IndicationMessage_specs_1 /* Additional specs */ diff --git a/e2sm/lib/E2SM-KPM-RANfunction-Description.c b/e2sm/lib/E2SM-KPM-RANfunction-Description.c index 005840b..8854b30 100644 --- a/e2sm/lib/E2SM-KPM-RANfunction-Description.c +++ b/e2sm/lib/E2SM-KPM-RANfunction-Description.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "E2SM-KPM-RANfunction-Description.h" @@ -24,9 +24,9 @@ memb_ric_EventTriggerStyle_List_constraint_1(const asn_TYPE_descriptor_t *td, co /* Determine the number of elements */ size = _A_CSEQUENCE_FROM_VOID(sptr)->count; - if((size >= 1 && size <= 63)) { + if((size >= 1UL && size <= 63UL)) { /* Perform validation of the inner elements */ - return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + return SEQUENCE_OF_constraint(td, sptr, ctfailcb, app_key); } else { ASN__CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", @@ -50,9 +50,9 @@ memb_ric_ReportStyle_List_constraint_1(const asn_TYPE_descriptor_t *td, const vo /* Determine the number of elements */ size = _A_CSEQUENCE_FROM_VOID(sptr)->count; - if((size >= 1 && size <= 63)) { + if((size >= 1UL && size <= 63UL)) { /* Perform validation of the inner elements */ - return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + return SEQUENCE_OF_constraint(td, sptr, ctfailcb, app_key); } else { ASN__CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", @@ -61,33 +61,69 @@ memb_ric_ReportStyle_List_constraint_1(const asn_TYPE_descriptor_t *td, const vo } } +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ric_EventTriggerStyle_List_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..63)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_ric_EventTriggerStyle_List_constr_3 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 6, 6, 1, 63 } /* (SIZE(1..63)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ric_ReportStyle_List_constr_5 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..63)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_ric_ReportStyle_List_constr_5 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 6, 6, 1, 63 } /* (SIZE(1..63)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_ric_EventTriggerStyle_List_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..63)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_ric_EventTriggerStyle_List_constr_3 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 6, 6, 1, 63 } /* (SIZE(1..63)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_ric_ReportStyle_List_constr_5 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..63)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_ric_ReportStyle_List_constr_5 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 6, 6, 1, 63 } /* (SIZE(1..63)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_ric_EventTriggerStyle_List_3[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_RIC_EventTriggerStyle_Item, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -112,7 +148,15 @@ asn_TYPE_descriptor_t asn_DEF_ric_EventTriggerStyle_List_3 = { asn_DEF_ric_EventTriggerStyle_List_tags_3, /* Same as above */ sizeof(asn_DEF_ric_EventTriggerStyle_List_tags_3) /sizeof(asn_DEF_ric_EventTriggerStyle_List_tags_3[0]), /* 2 */ - { 0, &asn_PER_type_ric_EventTriggerStyle_List_constr_3, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ric_EventTriggerStyle_List_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ric_EventTriggerStyle_List_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_ric_EventTriggerStyle_List_3, 1, /* Single element */ &asn_SPC_ric_EventTriggerStyle_List_specs_3 /* Additional specs */ @@ -124,7 +168,15 @@ static asn_TYPE_member_t asn_MBR_ric_ReportStyle_List_5[] = { 0, &asn_DEF_RIC_ReportStyle_Item, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -149,7 +201,15 @@ asn_TYPE_descriptor_t asn_DEF_ric_ReportStyle_List_5 = { asn_DEF_ric_ReportStyle_List_tags_5, /* Same as above */ sizeof(asn_DEF_ric_ReportStyle_List_tags_5) /sizeof(asn_DEF_ric_ReportStyle_List_tags_5[0]), /* 2 */ - { 0, &asn_PER_type_ric_ReportStyle_List_constr_5, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ric_ReportStyle_List_constr_5, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ric_ReportStyle_List_constr_5, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_ric_ReportStyle_List_5, 1, /* Single element */ &asn_SPC_ric_ReportStyle_List_specs_5 /* Additional specs */ @@ -161,7 +221,15 @@ static asn_TYPE_member_t asn_MBR_E2SM_KPM_RANfunction_Description_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RANfunction_Name, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ranFunction-Name" }, @@ -170,7 +238,15 @@ static asn_TYPE_member_t asn_MBR_E2SM_KPM_RANfunction_Description_1[] = { 0, &asn_DEF_ric_EventTriggerStyle_List_3, 0, - { 0, &asn_PER_memb_ric_EventTriggerStyle_List_constr_3, memb_ric_EventTriggerStyle_List_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_ric_EventTriggerStyle_List_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_ric_EventTriggerStyle_List_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_ric_EventTriggerStyle_List_constraint_1 + }, 0, 0, /* No default value */ "ric-EventTriggerStyle-List" }, @@ -179,7 +255,15 @@ static asn_TYPE_member_t asn_MBR_E2SM_KPM_RANfunction_Description_1[] = { 0, &asn_DEF_ric_ReportStyle_List_5, 0, - { 0, &asn_PER_memb_ric_ReportStyle_List_constr_5, memb_ric_ReportStyle_List_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_ric_ReportStyle_List_constr_5, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_ric_ReportStyle_List_constr_5, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_ric_ReportStyle_List_constraint_1 + }, 0, 0, /* No default value */ "ric-ReportStyle-List" }, @@ -212,7 +296,15 @@ asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_RANfunction_Description = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_E2SM_KPM_RANfunction_Description_1, 3, /* Elements count */ &asn_SPC_E2SM_KPM_RANfunction_Description_specs_1 /* Additional specs */ diff --git a/e2sm/lib/EN-GNB-ID.c b/e2sm/lib/EN-GNB-ID.c index 1b2986b..ee355a5 100644 --- a/e2sm/lib/EN-GNB-ID.c +++ b/e2sm/lib/EN-GNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "EN-GNB-ID.h" @@ -27,7 +27,7 @@ memb_en_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size >= 22 && size <= 32)) { + if((size >= 22UL && size <= 32UL)) { /* Constraint check succeeded */ return 0; } else { @@ -38,23 +38,45 @@ memb_en_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, } } +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_en_gNB_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(22..32)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_en_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_EN_GNB_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_EN_GNB_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_EN_GNB_ID_1[] = { { ATF_NOFLAGS, 0, offsetof(struct EN_GNB_ID, choice.en_gNB_ID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, 0, - { 0, &asn_PER_memb_en_gNB_ID_constr_2, memb_en_gNB_ID_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_en_gNB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_en_gNB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_en_gNB_ID_constraint_1 + }, 0, 0, /* No default value */ "en-gNB-ID" }, @@ -80,7 +102,15 @@ asn_TYPE_descriptor_t asn_DEF_EN_GNB_ID = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_EN_GNB_ID_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_EN_GNB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_EN_GNB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_EN_GNB_ID_1, 1, /* Elements count */ &asn_SPC_EN_GNB_ID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/ENB-ID-Choice.c b/e2sm/lib/ENB-ID-Choice.c deleted file mode 100644 index 1f60450..0000000 --- a/e2sm/lib/ENB-ID-Choice.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/ENB-ID.c b/e2sm/lib/ENB-ID.c index 8f6aeb0..143cbb5 100644 --- a/e2sm/lib/ENB-ID.c +++ b/e2sm/lib/ENB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ENB-ID.h" @@ -27,7 +27,7 @@ memb_macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr size = 0; } - if((size == 20)) { + if((size == 20UL)) { /* Constraint check succeeded */ return 0; } else { @@ -58,7 +58,7 @@ memb_home_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size == 28)) { + if((size == 28UL)) { /* Constraint check succeeded */ return 0; } else { @@ -89,7 +89,7 @@ memb_short_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void size = 0; } - if((size == 18)) { + if((size == 18UL)) { /* Constraint check succeeded */ return 0; } else { @@ -120,7 +120,7 @@ memb_long_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void size = 0; } - if((size == 21)) { + if((size == 21UL)) { /* Constraint check succeeded */ return 0; } else { @@ -131,38 +131,81 @@ memb_long_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void } } +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_macro_eNB_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + 20 /* (SIZE(20..20)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_home_eNB_ID_constr_3 CC_NOTUSED = { + { 0, 0 }, + 28 /* (SIZE(28..28)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_short_Macro_eNB_ID_constr_5 CC_NOTUSED = { + { 0, 0 }, + 18 /* (SIZE(18..18)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_long_Macro_eNB_ID_constr_6 CC_NOTUSED = { + { 0, 0 }, + 21 /* (SIZE(21..21)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ENB_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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, - { 0, &asn_PER_memb_macro_eNB_ID_constr_2, memb_macro_eNB_ID_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_macro_eNB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_macro_eNB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_macro_eNB_ID_constraint_1 + }, 0, 0, /* No default value */ "macro-eNB-ID" }, @@ -171,7 +214,15 @@ asn_TYPE_member_t asn_MBR_ENB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, 0, - { 0, &asn_PER_memb_home_eNB_ID_constr_3, memb_home_eNB_ID_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_home_eNB_ID_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_home_eNB_ID_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_home_eNB_ID_constraint_1 + }, 0, 0, /* No default value */ "home-eNB-ID" }, @@ -180,7 +231,15 @@ asn_TYPE_member_t asn_MBR_ENB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, 0, - { 0, &asn_PER_memb_short_Macro_eNB_ID_constr_5, memb_short_Macro_eNB_ID_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_short_Macro_eNB_ID_constr_5, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_short_Macro_eNB_ID_constr_5, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_short_Macro_eNB_ID_constraint_1 + }, 0, 0, /* No default value */ "short-Macro-eNB-ID" }, @@ -189,7 +248,15 @@ asn_TYPE_member_t asn_MBR_ENB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, 0, - { 0, &asn_PER_memb_long_Macro_eNB_ID_constr_6, memb_long_Macro_eNB_ID_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_long_Macro_eNB_ID_constr_6, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_long_Macro_eNB_ID_constr_6, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_long_Macro_eNB_ID_constraint_1 + }, 0, 0, /* No default value */ "long-Macro-eNB-ID" }, @@ -218,7 +285,15 @@ asn_TYPE_descriptor_t asn_DEF_ENB_ID = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_ENB_ID_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ENB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ENB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_ENB_ID_1, 4, /* Elements count */ &asn_SPC_ENB_ID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/ENB-UE-X2AP-ID-Extension.c b/e2sm/lib/ENB-UE-X2AP-ID-Extension.c index 2509d5e..f28fa2e 100644 --- a/e2sm/lib/ENB-UE-X2AP-ID-Extension.c +++ b/e2sm/lib/ENB-UE-X2AP-ID-Extension.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ENB-UE-X2AP-ID-Extension.h" @@ -21,7 +21,7 @@ ENB_UE_X2AP_ID_Extension_constraint(const asn_TYPE_descriptor_t *td, const void value = *(const long *)sptr; - if((value >= 0 && value <= 4095)) { + if((value >= 0L && value <= 4095L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ ENB_UE_X2AP_ID_Extension_constraint(const asn_TYPE_descriptor_t *td, const void * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ENB_UE_X2AP_ID_Extension_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_ENB_UE_X2AP_ID_Extension_constr_1 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 12, 12, 0, 4095 } /* (0..4095,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_ENB_UE_X2AP_ID_Extension_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_ENB_UE_X2AP_ID_Extension = { asn_DEF_ENB_UE_X2AP_ID_Extension_tags_1, /* Same as above */ sizeof(asn_DEF_ENB_UE_X2AP_ID_Extension_tags_1) /sizeof(asn_DEF_ENB_UE_X2AP_ID_Extension_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_ENB_UE_X2AP_ID_Extension_constr_1, ENB_UE_X2AP_ID_Extension_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ENB_UE_X2AP_ID_Extension_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ENB_UE_X2AP_ID_Extension_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + ENB_UE_X2AP_ID_Extension_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/ENB-UE-X2AP-ID.c b/e2sm/lib/ENB-UE-X2AP-ID.c index 81446fe..90d3108 100644 --- a/e2sm/lib/ENB-UE-X2AP-ID.c +++ b/e2sm/lib/ENB-UE-X2AP-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ENB-UE-X2AP-ID.h" @@ -21,7 +21,7 @@ ENB_UE_X2AP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 4095)) { + if((value >= 0L && value <= 4095L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ ENB_UE_X2AP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ENB_UE_X2AP_ID_constr_1 CC_NOTUSED = { + { 2, 1 } /* (0..4095) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_ENB_UE_X2AP_ID_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 12, 12, 0, 4095 } /* (0..4095) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_ENB_UE_X2AP_ID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_ENB_UE_X2AP_ID = { asn_DEF_ENB_UE_X2AP_ID_tags_1, /* Same as above */ sizeof(asn_DEF_ENB_UE_X2AP_ID_tags_1) /sizeof(asn_DEF_ENB_UE_X2AP_ID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_ENB_UE_X2AP_ID_constr_1, ENB_UE_X2AP_ID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ENB_UE_X2AP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ENB_UE_X2AP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + ENB_UE_X2AP_ID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/ENGNB-ID.c b/e2sm/lib/ENGNB-ID.c deleted file mode 100644 index 09371ad..0000000 --- a/e2sm/lib/ENGNB-ID.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/ENUMERATED.c b/e2sm/lib/ENUMERATED.c deleted file mode 100644 index e16cdd9..0000000 --- a/e2sm/lib/ENUMERATED.c +++ /dev/null @@ -1,180 +0,0 @@ -/*- - * Copyright (c) 2003, 2005, 2006 Lev Walkin . - * All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include -#include -#include /* Encoder and decoder of a primitive type */ - -/* - * ENUMERATED basic type description. - */ -static const ber_tlv_tag_t asn_DEF_ENUMERATED_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) -}; -asn_TYPE_operation_t asn_OP_ENUMERATED = { - ASN__PRIMITIVE_TYPE_free, - INTEGER_print, /* Implemented in terms of INTEGER */ - INTEGER_compare, /* Implemented in terms of INTEGER */ - ber_decode_primitive, - INTEGER_encode_der, /* Implemented in terms of INTEGER */ - INTEGER_decode_xer, /* This is temporary! */ - INTEGER_encode_xer, -#ifdef ASN_DISABLE_OER_SUPPORT - 0, - 0, -#else - ENUMERATED_decode_oer, - ENUMERATED_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, -#else - ENUMERATED_decode_uper, /* Unaligned PER decoder */ - ENUMERATED_encode_uper, /* Unaligned PER encoder */ - ENUMERATED_decode_aper, /* Aligned PER decoder */ - ENUMERATED_encode_aper, /* Aligned PER encoder */ -#endif /* ASN_DISABLE_PER_SUPPORT */ - ENUMERATED_random_fill, - 0 /* Use generic outmost tag fetcher */ -}; -asn_TYPE_descriptor_t asn_DEF_ENUMERATED = { - "ENUMERATED", - "ENUMERATED", - &asn_OP_ENUMERATED, - asn_DEF_ENUMERATED_tags, - sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), - asn_DEF_ENUMERATED_tags, /* Same as above */ - sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), - { 0, 0, asn_generic_no_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - - -#ifndef ASN_DISABLE_OER_SUPPORT - -asn_dec_rval_t -ENUMERATED_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) { - asn_dec_rval_t rval; - ENUMERATED_t *st = (ENUMERATED_t *)*sptr; - long value; - void *vptr = &value; - - if(!st) { - st = (ENUMERATED_t *)(*sptr = CALLOC(1, sizeof(*st))); - if(!st) ASN__DECODE_FAILED; - } - - rval = NativeEnumerated_decode_oer(opt_codec_ctx, td, constraints, - (void **)&vptr, ptr, size); - if(rval.code == RC_OK) { - if(asn_long2INTEGER(st, value)) { - rval.code = RC_FAIL; - } - } - return rval; -} - -asn_enc_rval_t -ENUMERATED_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 ENUMERATED_t *st = sptr; - long value; - - if(asn_INTEGER2long(st, &value)) { - ASN__ENCODE_FAILED; - } - - return NativeEnumerated_encode_oer(td, constraints, &value, cb, app_key); -} - -#endif /* ASN_DISABLE_OER_SUPPORT */ - -#ifndef ASN_DISABLE_PER_SUPPORT - -asn_dec_rval_t -ENUMERATED_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 rval; - ENUMERATED_t *st = (ENUMERATED_t *)*sptr; - long value; - void *vptr = &value; - - if(!st) { - st = (ENUMERATED_t *)(*sptr = CALLOC(1, sizeof(*st))); - if(!st) ASN__DECODE_FAILED; - } - - rval = NativeEnumerated_decode_uper(opt_codec_ctx, td, constraints, - (void **)&vptr, pd); - if(rval.code == RC_OK) { - if(asn_long2INTEGER(st, value)) { - rval.code = RC_FAIL; - } - } - return rval; -} - -asn_enc_rval_t -ENUMERATED_encode_uper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, - const void *sptr, asn_per_outp_t *po) { - const ENUMERATED_t *st = (const ENUMERATED_t *)sptr; - long value; - - if(asn_INTEGER2long(st, &value)) { - ASN__ENCODE_FAILED; - } - - return NativeEnumerated_encode_uper(td, constraints, &value, po); -} - -asn_dec_rval_t -ENUMERATED_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 rval; - ENUMERATED_t *st = (ENUMERATED_t *)*sptr; - long value; - void *vptr = &value; - - if(!st) { - st = (ENUMERATED_t *)(*sptr = CALLOC(1, sizeof(*st))); - if(!st) ASN__DECODE_FAILED; - } - - rval = NativeEnumerated_decode_aper(opt_codec_ctx, td, constraints, - (void **)&vptr, pd); - if(rval.code == RC_OK) - if(asn_long2INTEGER(st, value)) - rval.code = RC_FAIL; - return rval; -} - -asn_enc_rval_t -ENUMERATED_encode_aper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, - const void *sptr, asn_per_outp_t *po) { - const ENUMERATED_t *st = (const ENUMERATED_t *)sptr; - long value; - - if(asn_INTEGER2long(st, &value)) - ASN__ENCODE_FAILED; - - return NativeEnumerated_encode_aper(td, constraints, &value, po); -} -#endif /* ASN_DISABLE_PER_SUPPORT */ - diff --git a/e2sm/lib/EPC-CUUP-PM-Format.c b/e2sm/lib/EPC-CUUP-PM-Format.c deleted file mode 100644 index 5576886..0000000 --- a/e2sm/lib/EPC-CUUP-PM-Format.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/EPC-DU-PM-Container.c b/e2sm/lib/EPC-DU-PM-Container.c deleted file mode 100644 index db3f093..0000000 --- a/e2sm/lib/EPC-DU-PM-Container.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/EUTRA-CGI.c b/e2sm/lib/EUTRA-CGI.c index 4b28cac..8114e7c 100644 --- a/e2sm/lib/EUTRA-CGI.c +++ b/e2sm/lib/EUTRA-CGI.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "EUTRA-CGI.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_EUTRA_CGI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMNIdentity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "pLMNIdentity" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_EUTRA_CGI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_EUTRACellIdentity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "eUTRACellIdentity" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_EUTRA_CGI = { asn_DEF_EUTRA_CGI_tags_1, /* Same as above */ sizeof(asn_DEF_EUTRA_CGI_tags_1) /sizeof(asn_DEF_EUTRA_CGI_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_EUTRA_CGI_1, 2, /* Elements count */ &asn_SPC_EUTRA_CGI_specs_1 /* Additional specs */ diff --git a/e2sm/lib/EUTRACellIdentity.c b/e2sm/lib/EUTRACellIdentity.c index 570f5fd..7b90b91 100644 --- a/e2sm/lib/EUTRACellIdentity.c +++ b/e2sm/lib/EUTRACellIdentity.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "EUTRACellIdentity.h" @@ -27,7 +27,7 @@ EUTRACellIdentity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size == 28)) { + if((size == 28UL)) { /* Constraint check succeeded */ return 0; } else { @@ -42,11 +42,18 @@ EUTRACellIdentity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_EUTRACellIdentity_constr_1 CC_NOTUSED = { + { 0, 0 }, + 28 /* (SIZE(28..28)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_EUTRACellIdentity_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 28, 28 } /* (SIZE(28..28)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_EUTRACellIdentity_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; @@ -60,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_EUTRACellIdentity = { asn_DEF_EUTRACellIdentity_tags_1, /* Same as above */ sizeof(asn_DEF_EUTRACellIdentity_tags_1) /sizeof(asn_DEF_EUTRACellIdentity_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_EUTRACellIdentity_constr_1, EUTRACellIdentity_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_EUTRACellIdentity_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_EUTRACellIdentity_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + EUTRACellIdentity_constraint + }, 0, 0, /* No members */ &asn_SPC_BIT_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/EXTERNAL.c b/e2sm/lib/EXTERNAL.c new file mode 100644 index 0000000..10fcf63 --- /dev/null +++ b/e2sm/lib/EXTERNAL.c @@ -0,0 +1,228 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "ASN1C-UsefulInformationObjectClasses" + * found in "/usr/local/share/asn1c/standard-modules/ASN1C-UsefulInformationObjectClasses.asn1" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "EXTERNAL.h" + +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_encoding_constr_5 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_type_encoding_constr_5 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static asn_TYPE_member_t asn_MBR_encoding_5[] = { + { ATF_NOFLAGS, 0, offsetof(struct EXTERNAL__encoding, choice.single_ASN1_type), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_ANY, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "single-ASN1-type" + }, + { ATF_NOFLAGS, 0, offsetof(struct EXTERNAL__encoding, choice.octet_aligned), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "octet-aligned" + }, + { ATF_NOFLAGS, 0, offsetof(struct EXTERNAL__encoding, choice.arbitrary), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "arbitrary" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_encoding_tag2el_5[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* single-ASN1-type */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* octet-aligned */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* arbitrary */ +}; +static asn_CHOICE_specifics_t asn_SPC_encoding_specs_5 = { + sizeof(struct EXTERNAL__encoding), + offsetof(struct EXTERNAL__encoding, _asn_ctx), + offsetof(struct EXTERNAL__encoding, present), + sizeof(((struct EXTERNAL__encoding *)0)->present), + asn_MAP_encoding_tag2el_5, + 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_encoding_5 = { + "encoding", + "encoding", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_encoding_constr_5, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_encoding_constr_5, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, + asn_MBR_encoding_5, + 3, /* Elements count */ + &asn_SPC_encoding_specs_5 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_EXTERNAL_1[] = { + { ATF_POINTER, 3, offsetof(struct EXTERNAL, direct_reference), + (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), + 0, + &asn_DEF_OBJECT_IDENTIFIER, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "direct-reference" + }, + { ATF_POINTER, 2, offsetof(struct EXTERNAL, indirect_reference), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_NativeInteger, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "indirect-reference" + }, + { ATF_POINTER, 1, offsetof(struct EXTERNAL, data_value_descriptor), + (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)), + 0, + &asn_DEF_ObjectDescriptor, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "data-value-descriptor" + }, + { ATF_NOFLAGS, 0, offsetof(struct EXTERNAL, encoding), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_encoding_5, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "encoding" + }, +}; +static const int asn_MAP_EXTERNAL_oms_1[] = { 0, 1, 2 }; +static const ber_tlv_tag_t asn_DEF_EXTERNAL_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (8 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_EXTERNAL_tag2el_1[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* indirect-reference */ + { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 0, 0, 0 }, /* direct-reference */ + { (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)), 2, 0, 0 }, /* data-value-descriptor */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 3, 0, 0 }, /* single-ASN1-type */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 3, 0, 0 }, /* octet-aligned */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 3, 0, 0 } /* arbitrary */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_EXTERNAL_specs_1 = { + sizeof(struct EXTERNAL), + offsetof(struct EXTERNAL, _asn_ctx), + asn_MAP_EXTERNAL_tag2el_1, + 6, /* Count of tags in the map */ + asn_MAP_EXTERNAL_oms_1, /* Optional members */ + 3, 0, /* Root/Additions */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_EXTERNAL = { + "EXTERNAL", + "EXTERNAL", + &asn_OP_SEQUENCE, + asn_DEF_EXTERNAL_tags_1, + sizeof(asn_DEF_EXTERNAL_tags_1) + /sizeof(asn_DEF_EXTERNAL_tags_1[0]) - 1, /* 1 */ + asn_DEF_EXTERNAL_tags_1, /* Same as above */ + sizeof(asn_DEF_EXTERNAL_tags_1) + /sizeof(asn_DEF_EXTERNAL_tags_1[0]), /* 2 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, + asn_MBR_EXTERNAL_1, + 4, /* Elements count */ + &asn_SPC_EXTERNAL_specs_1 /* Additional specs */ +}; + diff --git a/e2sm/lib/FGC-CUUP-PM-Format.c b/e2sm/lib/FGC-CUUP-PM-Format.c deleted file mode 100644 index 7482379..0000000 --- a/e2sm/lib/FGC-CUUP-PM-Format.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/FGC-DU-PM-Container.c b/e2sm/lib/FGC-DU-PM-Container.c deleted file mode 100644 index e81a6d5..0000000 --- a/e2sm/lib/FGC-DU-PM-Container.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/FQIPERSlicesPerPlmnListItem.c b/e2sm/lib/FQIPERSlicesPerPlmnListItem.c deleted file mode 100644 index 13958bd..0000000 --- a/e2sm/lib/FQIPERSlicesPerPlmnListItem.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/FQIPERSlicesPerPlmnPerCellListItem.c b/e2sm/lib/FQIPERSlicesPerPlmnPerCellListItem.c deleted file mode 100644 index 8a070c8..0000000 --- a/e2sm/lib/FQIPERSlicesPerPlmnPerCellListItem.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/FiveGS-TAC.c b/e2sm/lib/FiveGS-TAC.c index 5388efe..571b903 100644 --- a/e2sm/lib/FiveGS-TAC.c +++ b/e2sm/lib/FiveGS-TAC.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "FiveGS-TAC.h" @@ -22,7 +22,7 @@ FiveGS_TAC_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size == 3)) { + if((size == 3UL)) { /* Constraint check succeeded */ return 0; } else { @@ -37,11 +37,18 @@ FiveGS_TAC_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_FiveGS_TAC_constr_1 CC_NOTUSED = { + { 0, 0 }, + 3 /* (SIZE(3..3)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_FiveGS_TAC_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_FiveGS_TAC_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; @@ -55,7 +62,15 @@ asn_TYPE_descriptor_t asn_DEF_FiveGS_TAC = { asn_DEF_FiveGS_TAC_tags_1, /* Same as above */ sizeof(asn_DEF_FiveGS_TAC_tags_1) /sizeof(asn_DEF_FiveGS_TAC_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_FiveGS_TAC_constr_1, FiveGS_TAC_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_FiveGS_TAC_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_FiveGS_TAC_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + FiveGS_TAC_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/FiveQI.c b/e2sm/lib/FiveQI.c index 498f1e5..f6db193 100644 --- a/e2sm/lib/FiveQI.c +++ b/e2sm/lib/FiveQI.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "FiveQI.h" @@ -21,7 +21,7 @@ FiveQI_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 255)) { + if((value >= 0L && value <= 255L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ FiveQI_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_FiveQI_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_FiveQI_constr_1 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 0, 255 } /* (0..255,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_FiveQI_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_FiveQI = { asn_DEF_FiveQI_tags_1, /* Same as above */ sizeof(asn_DEF_FiveQI_tags_1) /sizeof(asn_DEF_FiveQI_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_FiveQI_constr_1, FiveQI_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_FiveQI_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_FiveQI_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + FiveQI_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/FreqBandNrItem.c b/e2sm/lib/FreqBandNrItem.c index 6f0d675..1fd6143 100644 --- a/e2sm/lib/FreqBandNrItem.c +++ b/e2sm/lib/FreqBandNrItem.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "FreqBandNrItem.h" @@ -21,7 +21,7 @@ memb_freqBandIndicatorNr_constraint_1(const asn_TYPE_descriptor_t *td, const voi value = *(const long *)sptr; - if((value >= 1 && value <= 1024)) { + if((value >= 1L && value <= 1024L)) { /* Constraint check succeeded */ return 0; } else { @@ -32,18 +32,33 @@ memb_freqBandIndicatorNr_constraint_1(const asn_TYPE_descriptor_t *td, const voi } } +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_freqBandIndicatorNr_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_freqBandIndicatorNr_constr_2 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 10, 10, 1, 1024 } /* (1..1024,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; -static asn_TYPE_member_t asn_MBR_FreqBandNrItem_1[] = { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_FreqBandNrItem_1[] = { { ATF_NOFLAGS, 0, offsetof(struct FreqBandNrItem, freqBandIndicatorNr), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, &asn_PER_memb_freqBandIndicatorNr_constr_2, memb_freqBandIndicatorNr_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_freqBandIndicatorNr_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_freqBandIndicatorNr_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_freqBandIndicatorNr_constraint_1 + }, 0, 0, /* No default value */ "freqBandIndicatorNr" }, @@ -54,7 +69,7 @@ static const ber_tlv_tag_t asn_DEF_FreqBandNrItem_tags_1[] = { static const asn_TYPE_tag2member_t asn_MAP_FreqBandNrItem_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* freqBandIndicatorNr */ }; -static asn_SEQUENCE_specifics_t asn_SPC_FreqBandNrItem_specs_1 = { +asn_SEQUENCE_specifics_t asn_SPC_FreqBandNrItem_specs_1 = { sizeof(struct FreqBandNrItem), offsetof(struct FreqBandNrItem, _asn_ctx), asn_MAP_FreqBandNrItem_tag2el_1, @@ -72,7 +87,15 @@ asn_TYPE_descriptor_t asn_DEF_FreqBandNrItem = { asn_DEF_FreqBandNrItem_tags_1, /* Same as above */ sizeof(asn_DEF_FreqBandNrItem_tags_1) /sizeof(asn_DEF_FreqBandNrItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_FreqBandNrItem_1, 1, /* Elements count */ &asn_SPC_FreqBandNrItem_specs_1 /* Additional specs */ diff --git a/e2sm/lib/GNB-CU-CP-UE-E1AP-ID.c b/e2sm/lib/GNB-CU-CP-UE-E1AP-ID.c index 613b901..3423fad 100644 --- a/e2sm/lib/GNB-CU-CP-UE-E1AP-ID.c +++ b/e2sm/lib/GNB-CU-CP-UE-E1AP-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GNB-CU-CP-UE-E1AP-ID.h" @@ -27,11 +27,18 @@ GNB_CU_CP_UE_E1AP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *spt * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_GNB_CU_CP_UE_E1AP_ID_constr_1 CC_NOTUSED = { + { 4, 1 } /* (0..4294967295) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_GNB_CU_CP_UE_E1AP_ID_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ const asn_INTEGER_specifics_t asn_SPC_GNB_CU_CP_UE_E1AP_ID_specs_1 = { 0, 0, 0, 0, 0, 0, /* Native long size */ @@ -50,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_GNB_CU_CP_UE_E1AP_ID = { asn_DEF_GNB_CU_CP_UE_E1AP_ID_tags_1, /* Same as above */ sizeof(asn_DEF_GNB_CU_CP_UE_E1AP_ID_tags_1) /sizeof(asn_DEF_GNB_CU_CP_UE_E1AP_ID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_GNB_CU_CP_UE_E1AP_ID_constr_1, GNB_CU_CP_UE_E1AP_ID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GNB_CU_CP_UE_E1AP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GNB_CU_CP_UE_E1AP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + GNB_CU_CP_UE_E1AP_ID_constraint + }, 0, 0, /* No members */ &asn_SPC_GNB_CU_CP_UE_E1AP_ID_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/GNB-CU-UE-F1AP-ID.c b/e2sm/lib/GNB-CU-UE-F1AP-ID.c index df994e9..65604f0 100644 --- a/e2sm/lib/GNB-CU-UE-F1AP-ID.c +++ b/e2sm/lib/GNB-CU-UE-F1AP-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GNB-CU-UE-F1AP-ID.h" @@ -27,11 +27,18 @@ GNB_CU_UE_F1AP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_GNB_CU_UE_F1AP_ID_constr_1 CC_NOTUSED = { + { 4, 1 } /* (0..4294967295) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_GNB_CU_UE_F1AP_ID_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ const asn_INTEGER_specifics_t asn_SPC_GNB_CU_UE_F1AP_ID_specs_1 = { 0, 0, 0, 0, 0, 0, /* Native long size */ @@ -50,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_GNB_CU_UE_F1AP_ID = { asn_DEF_GNB_CU_UE_F1AP_ID_tags_1, /* Same as above */ sizeof(asn_DEF_GNB_CU_UE_F1AP_ID_tags_1) /sizeof(asn_DEF_GNB_CU_UE_F1AP_ID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_GNB_CU_UE_F1AP_ID_constr_1, GNB_CU_UE_F1AP_ID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GNB_CU_UE_F1AP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GNB_CU_UE_F1AP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + GNB_CU_UE_F1AP_ID_constraint + }, 0, 0, /* No members */ &asn_SPC_GNB_CU_UE_F1AP_ID_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/GNB-CU-UP-ID.c b/e2sm/lib/GNB-CU-UP-ID.c index 648f822..3b80791 100644 --- a/e2sm/lib/GNB-CU-UP-ID.c +++ b/e2sm/lib/GNB-CU-UP-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GNB-CU-UP-ID.h" @@ -27,7 +27,7 @@ GNB_CU_UP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if((value >= 0 && value <= 68719476735)) { + if((value >= 0L && value <= 68719476735L)) { /* Constraint check succeeded */ return 0; } else { @@ -42,11 +42,18 @@ GNB_CU_UP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using INTEGER, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_GNB_CU_UP_ID_constr_1 CC_NOTUSED = { + { 8, 1 } /* (0..68719476735) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_GNB_CU_UP_ID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -60,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_ID = { 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 */ - { 0, &asn_PER_type_GNB_CU_UP_ID_constr_1, GNB_CU_UP_ID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GNB_CU_UP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GNB_CU_UP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + GNB_CU_UP_ID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/GNB-DU-ID.c b/e2sm/lib/GNB-DU-ID.c index 820ae0b..3213473 100644 --- a/e2sm/lib/GNB-DU-ID.c +++ b/e2sm/lib/GNB-DU-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GNB-DU-ID.h" @@ -27,7 +27,7 @@ GNB_DU_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if((value >= 0 && value <= 68719476735)) { + if((value >= 0L && value <= 68719476735L)) { /* Constraint check succeeded */ return 0; } else { @@ -42,11 +42,18 @@ GNB_DU_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using INTEGER, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_GNB_DU_ID_constr_1 CC_NOTUSED = { + { 8, 1 } /* (0..68719476735) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_GNB_DU_ID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -60,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_GNB_DU_ID = { 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 */ - { 0, &asn_PER_type_GNB_DU_ID_constr_1, GNB_DU_ID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GNB_DU_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GNB_DU_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + GNB_DU_ID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/GNB-DU-Name.c b/e2sm/lib/GNB-DU-Name.c deleted file mode 100644 index a84d899..0000000 --- a/e2sm/lib/GNB-DU-Name.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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)) */}; -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/e2sm/lib/GNB-ID-Choice.c b/e2sm/lib/GNB-ID-Choice.c deleted file mode 100644 index 42c0272..0000000 --- a/e2sm/lib/GNB-ID-Choice.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/GNB-ID.c b/e2sm/lib/GNB-ID.c index 3e67e92..c904760 100644 --- a/e2sm/lib/GNB-ID.c +++ b/e2sm/lib/GNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GNB-ID.h" @@ -27,7 +27,7 @@ memb_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size >= 22 && size <= 32)) { + if((size >= 22UL && size <= 32UL)) { /* Constraint check succeeded */ return 0; } else { @@ -38,23 +38,45 @@ memb_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, } } +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_gNB_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(22..32)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_GNB_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_GNB_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_GNB_ID_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GNB_ID, choice.gNB_ID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, 0, - { 0, &asn_PER_memb_gNB_ID_constr_2, memb_gNB_ID_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_gNB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_gNB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_gNB_ID_constraint_1 + }, 0, 0, /* No default value */ "gNB-ID" }, @@ -80,7 +102,15 @@ asn_TYPE_descriptor_t asn_DEF_GNB_ID = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_GNB_ID_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GNB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GNB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_GNB_ID_1, 1, /* Elements count */ &asn_SPC_GNB_ID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/GNB-Name.c b/e2sm/lib/GNB-Name.c deleted file mode 100644 index f80dae1..0000000 --- a/e2sm/lib/GNB-Name.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "GNB-Name.h" - -static asn_oer_constraints_t asn_OER_type_GNB_Name_constr_1 CC_NOTUSED = { - { 0, 0 }, - -1}; -asn_per_constraints_t asn_PER_type_GNB_Name_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_GNB_Name_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct GNB_Name, choice.gNB_DU_Name), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_GNB_DU_Name, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "gNB-DU-Name" - }, - { ATF_NOFLAGS, 0, offsetof(struct GNB_Name, choice.gNB_CU_CP_Name), - (ASN_TAG_CLASS_CONTEXT | (1 << 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 GNB_Name, choice.gNB_CU_UP_Name), - (ASN_TAG_CLASS_CONTEXT | (2 << 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" - }, -}; -static const asn_TYPE_tag2member_t asn_MAP_GNB_Name_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB-DU-Name */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gNB-CU-CP-Name */ - { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gNB-CU-UP-Name */ -}; -asn_CHOICE_specifics_t asn_SPC_GNB_Name_specs_1 = { - sizeof(struct GNB_Name), - offsetof(struct GNB_Name, _asn_ctx), - offsetof(struct GNB_Name, present), - sizeof(((struct GNB_Name *)0)->present), - asn_MAP_GNB_Name_tag2el_1, - 3, /* Count of tags in the map */ - 0, 0, - 3 /* Extensions start */ -}; -asn_TYPE_descriptor_t asn_DEF_GNB_Name = { - "GNB-Name", - "GNB-Name", - &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_Name_constr_1, &asn_PER_type_GNB_Name_constr_1, CHOICE_constraint }, - asn_MBR_GNB_Name_1, - 3, /* Elements count */ - &asn_SPC_GNB_Name_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/GUAMI.c b/e2sm/lib/GUAMI.c index ccfe50f..3826fca 100644 --- a/e2sm/lib/GUAMI.c +++ b/e2sm/lib/GUAMI.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GUAMI.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_GUAMI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMNIdentity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "pLMNIdentity" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_GUAMI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_AMFRegionID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "aMFRegionID" }, @@ -31,7 +47,15 @@ asn_TYPE_member_t asn_MBR_GUAMI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_AMFSetID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "aMFSetID" }, @@ -40,7 +64,15 @@ asn_TYPE_member_t asn_MBR_GUAMI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_AMFPointer, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "aMFPointer" }, @@ -72,7 +104,15 @@ asn_TYPE_descriptor_t asn_DEF_GUAMI = { asn_DEF_GUAMI_tags_1, /* Same as above */ sizeof(asn_DEF_GUAMI_tags_1) /sizeof(asn_DEF_GUAMI_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GUAMI_1, 4, /* Elements count */ &asn_SPC_GUAMI_specs_1 /* Additional specs */ diff --git a/e2sm/lib/GUMMEI.c b/e2sm/lib/GUMMEI.c index 82d507b..308cb17 100644 --- a/e2sm/lib/GUMMEI.c +++ b/e2sm/lib/GUMMEI.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GUMMEI.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_GUMMEI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMNIdentity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "pLMN-Identity" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_GUMMEI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MME_Group_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "mME-Group-ID" }, @@ -31,7 +47,15 @@ asn_TYPE_member_t asn_MBR_GUMMEI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MME_Code, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "mME-Code" }, @@ -62,7 +86,15 @@ asn_TYPE_descriptor_t asn_DEF_GUMMEI = { asn_DEF_GUMMEI_tags_1, /* Same as above */ sizeof(asn_DEF_GUMMEI_tags_1) /sizeof(asn_DEF_GUMMEI_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GUMMEI_1, 3, /* Elements count */ &asn_SPC_GUMMEI_specs_1 /* Additional specs */ diff --git a/e2sm/lib/GeneralString.c b/e2sm/lib/GeneralString.c deleted file mode 100644 index cc35a3a..0000000 --- a/e2sm/lib/GeneralString.c +++ /dev/null @@ -1,58 +0,0 @@ -/*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include - -/* - * GeneralString basic type description. - */ -static const ber_tlv_tag_t asn_DEF_GeneralString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (27 << 2)), /* [UNIVERSAL 27] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ -}; -asn_TYPE_operation_t asn_OP_GeneralString = { - OCTET_STRING_free, - OCTET_STRING_print, /* non-ascii string */ - OCTET_STRING_compare, - OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - 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, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_uper, - OCTET_STRING_decode_aper, /* Implemented in terms of OCTET STRING */ - 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_GeneralString = { - "GeneralString", - "GeneralString", - &asn_OP_GeneralString, - asn_DEF_GeneralString_tags, - sizeof(asn_DEF_GeneralString_tags) - / sizeof(asn_DEF_GeneralString_tags[0]) - 1, - asn_DEF_GeneralString_tags, - sizeof(asn_DEF_GeneralString_tags) - / sizeof(asn_DEF_GeneralString_tags[0]), - { 0, 0, asn_generic_unknown_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - diff --git a/e2sm/lib/GeneralizedTime.c b/e2sm/lib/GeneralizedTime.c deleted file mode 100644 index f1095a2..0000000 --- a/e2sm/lib/GeneralizedTime.c +++ /dev/null @@ -1,833 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#define _POSIX_PTHREAD_SEMANTICS /* for Sun */ -#define _REENTRANT /* for Sun */ -#define __EXTENSIONS__ /* for Sun */ -#ifndef _BSD_SOURCE -#define _BSD_SOURCE /* for timegm(3) */ -#endif -#include -#include - -#ifdef __CYGWIN__ -#include "/usr/include/time.h" -#else -#include -#endif /* __CYGWIN__ */ - -#include -#include - -#if defined(_WIN32) -#pragma message( "PLEASE STOP AND READ!") -#pragma message( " localtime_r is implemented via localtime(), which may be not thread-safe.") -#pragma message( " gmtime_r is implemented via gmtime(), which may be not thread-safe.") -#pragma message( " ") -#pragma message( " You must fix the code by inserting appropriate locking") -#pragma message( " if you want to use asn_GT2time() or asn_UT2time().") -#pragma message( "PLEASE STOP AND READ!") - -static struct tm *localtime_r(const time_t *tloc, struct tm *result) { - struct tm *tm; - if((tm = localtime(tloc))) - return memcpy(result, tm, sizeof(struct tm)); - return 0; -} - -static struct tm *gmtime_r(const time_t *tloc, struct tm *result) { - struct tm *tm; - if((tm = gmtime(tloc))) - return memcpy(result, tm, sizeof(struct tm)); - return 0; -} - -#define tzset() _tzset() -#define putenv(c) _putenv(c) -#define _EMULATE_TIMEGM - -#endif /* _WIN32 */ - -#if defined(sun) || defined(__sun) || defined(__solaris__) -#define _EMULATE_TIMEGM -#endif - -/* - * Where to look for offset from GMT, Phase I. - * Several platforms are known. - */ -#if defined(__FreeBSD__) \ - || (defined(__GNUC__) && defined(__APPLE_CC__)) \ - || (defined __GLIBC__ && __GLIBC__ >= 2) -#undef HAVE_TM_GMTOFF -#define HAVE_TM_GMTOFF -#endif /* BSDs and newer glibc */ - -/* - * Where to look for offset from GMT, Phase II. - */ -#ifdef HAVE_TM_GMTOFF -#define GMTOFF(tm) ((tm).tm_gmtoff) -#else /* HAVE_TM_GMTOFF */ -#define GMTOFF(tm) (-timezone) -#endif /* HAVE_TM_GMTOFF */ - -#if defined(_WIN32) -#pragma message( "PLEASE STOP AND READ!") -#pragma message( " timegm() is implemented via getenv(\"TZ\")/setenv(\"TZ\"), which may be not thread-safe.") -#pragma message( " ") -#pragma message( " You must fix the code by inserting appropriate locking") -#pragma message( " if you want to use asn_GT2time() or asn_UT2time().") -#pragma message( "PLEASE STOP AND READ!") -#else -#if (defined(_EMULATE_TIMEGM) || !defined(HAVE_TM_GMTOFF)) -#warning "PLEASE STOP AND READ!" -#warning " timegm() is implemented via getenv(\"TZ\")/setenv(\"TZ\"), which may be not thread-safe." -#warning " " -#warning " You must fix the code by inserting appropriate locking" -#warning " if you want to use asn_GT2time() or asn_UT2time()." -#warning "PLEASE STOP AND READ!" -#endif /* _EMULATE_TIMEGM */ -#endif - -/* - * Override our GMTOFF decision for other known platforms. - */ -#ifdef __CYGWIN__ -#undef GMTOFF -static long GMTOFF(struct tm a){ - struct tm *lt; - time_t local_time, gmt_time; - long zone; - - tzset(); - gmt_time = time (NULL); - - lt = gmtime(&gmt_time); - - local_time = mktime(lt); - return (gmt_time - local_time); -} -#define _EMULATE_TIMEGM - -#endif /* __CYGWIN__ */ - -#define ATZVARS do { \ - char tzoldbuf[64]; \ - char *tzold -#define ATZSAVETZ do { \ - tzold = getenv("TZ"); \ - if(tzold) { \ - size_t tzlen = strlen(tzold); \ - if(tzlen < sizeof(tzoldbuf)) { \ - tzold = memcpy(tzoldbuf, tzold, tzlen + 1); \ - } else { \ - char *dupptr = tzold; \ - tzold = MALLOC(tzlen + 1); \ - if(tzold) memcpy(tzold, dupptr, tzlen + 1); \ - } \ - setenv("TZ", "UTC", 1); \ - } \ - tzset(); \ -} while(0) -#define ATZOLDTZ do { \ - if (tzold) { \ - setenv("TZ", tzold, 1); \ - *tzoldbuf = 0; \ - if(tzold != tzoldbuf) \ - FREEMEM(tzold); \ - } else { \ - unsetenv("TZ"); \ - } \ - tzset(); \ -} while(0); } while(0); - -#ifndef HAVE_TIMEGM -#ifdef _EMULATE_TIMEGM -#include -static time_t timegm(struct tm *tm) { - time_t tloc; - ATZVARS; - ATZSAVETZ; - tloc = mktime(tm); - ATZOLDTZ; - return tloc; -} -#endif /* _EMULATE_TIMEGM */ -#endif - - -#ifndef ASN___INTERNAL_TEST_MODE - -/* - * GeneralizedTime basic type description. - */ -static const ber_tlv_tag_t asn_DEF_GeneralizedTime_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (24 << 2)), /* [UNIVERSAL 24] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ -}; -static asn_per_constraints_t asn_DEF_GeneralizedTime_per_constraints = { - { APC_CONSTRAINED, 7, 7, 0x20, 0x7e }, /* Value */ - { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ - 0, 0 -}; -asn_TYPE_operation_t asn_OP_GeneralizedTime = { - OCTET_STRING_free, - GeneralizedTime_print, - GeneralizedTime_compare, - OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - GeneralizedTime_encode_der, - OCTET_STRING_decode_xer_utf8, - GeneralizedTime_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, - OCTET_STRING_encode_uper, - OCTET_STRING_decode_aper, - OCTET_STRING_encode_aper, -#endif /* ASN_DISABLE_PER_SUPPORT */ - GeneralizedTime_random_fill, - 0 /* Use generic outmost tag fetcher */ -}; -asn_TYPE_descriptor_t asn_DEF_GeneralizedTime = { - "GeneralizedTime", - "GeneralizedTime", - &asn_OP_GeneralizedTime, - asn_DEF_GeneralizedTime_tags, - sizeof(asn_DEF_GeneralizedTime_tags) - / sizeof(asn_DEF_GeneralizedTime_tags[0]) - 2, - asn_DEF_GeneralizedTime_tags, - sizeof(asn_DEF_GeneralizedTime_tags) - / sizeof(asn_DEF_GeneralizedTime_tags[0]), - { 0, &asn_DEF_GeneralizedTime_per_constraints, GeneralizedTime_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - -#endif /* ASN___INTERNAL_TEST_MODE */ - -/* - * Check that the time looks like the time. - */ -int -GeneralizedTime_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, - asn_app_constraint_failed_f *ctfailcb, - void *app_key) { - const GeneralizedTime_t *st = (const GeneralizedTime_t *)sptr; - time_t tloc; - - errno = EPERM; /* Just an unlikely error code */ - tloc = asn_GT2time(st, 0, 0); - if(tloc == -1 && errno != EPERM) { - ASN__CTFAIL(app_key, td, sptr, - "%s: Invalid time format: %s (%s:%d)", - td->name, strerror(errno), __FILE__, __LINE__); - return -1; - } - - return 0; -} - -asn_enc_rval_t -GeneralizedTime_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) { - GeneralizedTime_t *st; - asn_enc_rval_t erval = {0,0,0}; - int fv, fd; /* seconds fraction value and number of digits */ - struct tm tm; - time_t tloc; - - /* - * Encode as a canonical DER. - */ - errno = EPERM; - tloc = asn_GT2time_frac((const GeneralizedTime_t *)sptr, &fv, &fd, &tm, - 1); /* Recognize time */ - if(tloc == -1 && errno != EPERM) { - /* Failed to recognize time. Fail completely. */ - ASN__ENCODE_FAILED; - } - - st = asn_time2GT_frac(0, &tm, fv, fd, 1); /* Save time canonically */ - if(!st) ASN__ENCODE_FAILED; /* Memory allocation failure. */ - - erval = OCTET_STRING_encode_der(td, st, tag_mode, tag, cb, app_key); - - ASN_STRUCT_FREE(*td, st); - - return erval; -} - -#ifndef ASN___INTERNAL_TEST_MODE - -asn_enc_rval_t -GeneralizedTime_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) { - if(flags & XER_F_CANONICAL) { - GeneralizedTime_t *gt; - asn_enc_rval_t rv; - int fv, fd; /* fractional parts */ - struct tm tm; - - errno = EPERM; - if(asn_GT2time_frac((const GeneralizedTime_t *)sptr, - &fv, &fd, &tm, 1) == -1 - && errno != EPERM) - ASN__ENCODE_FAILED; - - gt = asn_time2GT_frac(0, &tm, fv, fd, 1); - if(!gt) ASN__ENCODE_FAILED; - - rv = OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, - cb, app_key); - ASN_STRUCT_FREE(asn_DEF_GeneralizedTime, gt); - return rv; - } else { - return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, - cb, app_key); - } -} - -#endif /* ASN___INTERNAL_TEST_MODE */ - -int -GeneralizedTime_print(const asn_TYPE_descriptor_t *td, const void *sptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const GeneralizedTime_t *st = (const GeneralizedTime_t *)sptr; - - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(st && st->buf) { - char buf[32]; - struct tm tm; - int ret; - - errno = EPERM; - if(asn_GT2time(st, &tm, 1) == -1 && errno != EPERM) - return (cb("", 11, app_key) < 0) ? -1 : 0; - - ret = snprintf(buf, sizeof(buf), - "%04d-%02d-%02d %02d:%02d:%02d (GMT)", - tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec); - assert(ret > 0 && ret < (int)sizeof(buf)); - return (cb(buf, ret, app_key) < 0) ? -1 : 0; - } else { - return (cb("", 8, app_key) < 0) ? -1 : 0; - } -} - -time_t -asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { - return asn_GT2time_frac(st, 0, 0, ret_tm, as_gmt); -} - -time_t -asn_GT2time_prec(const GeneralizedTime_t *st, int *frac_value, int frac_digits, struct tm *ret_tm, int as_gmt) { - time_t tloc; - int fv, fd = 0; - - if(frac_value) - tloc = asn_GT2time_frac(st, &fv, &fd, ret_tm, as_gmt); - else - return asn_GT2time_frac(st, 0, 0, ret_tm, as_gmt); - if(fd == 0 || frac_digits <= 0) { - *frac_value = 0; - } else { - while(fd > frac_digits) - fv /= 10, fd--; - while(fd < frac_digits) { - if(fv < INT_MAX / 10) { - fv *= 10; - fd++; - } else { - /* Too long precision request */ - fv = 0; - break; - } - } - - *frac_value = fv; - } - - return tloc; -} - -time_t -asn_GT2time_frac(const GeneralizedTime_t *st, int *frac_value, int *frac_digits, struct tm *ret_tm, int as_gmt) { - struct tm tm_s; - uint8_t *buf; - uint8_t *end; - int gmtoff_h = 0; - int gmtoff_m = 0; - int gmtoff = 0; /* h + m */ - int offset_specified = 0; - int fvalue = 0; - int fdigits = 0; - time_t tloc; - - if(!st || !st->buf) { - errno = EINVAL; - return -1; - } else { - buf = st->buf; - end = buf + st->size; - } - - if(st->size < 10) { - errno = EINVAL; - return -1; - } - - /* - * Decode first 10 bytes: "AAAAMMJJhh" - */ - memset(&tm_s, 0, sizeof(tm_s)); -#undef B2F -#undef B2T -#define B2F(var) do { \ - unsigned ch = *buf; \ - if(ch < 0x30 || ch > 0x39) { \ - errno = EINVAL; \ - return -1; \ - } else { \ - var = var * 10 + (ch - 0x30); \ - buf++; \ - } \ - } while(0) -#define B2T(var) B2F(tm_s.var) - - B2T(tm_year); /* 1: A */ - B2T(tm_year); /* 2: A */ - B2T(tm_year); /* 3: A */ - B2T(tm_year); /* 4: A */ - B2T(tm_mon); /* 5: M */ - B2T(tm_mon); /* 6: M */ - B2T(tm_mday); /* 7: J */ - B2T(tm_mday); /* 8: J */ - B2T(tm_hour); /* 9: h */ - B2T(tm_hour); /* 0: h */ - - if(buf == end) goto local_finish; - - /* - * Parse [mm[ss[(.|,)ffff]]] - * ^^ - */ - switch(*buf) { - case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: - case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: - tm_s.tm_min = (*buf++) - 0x30; - if(buf == end) { errno = EINVAL; return -1; } - B2T(tm_min); - break; - case 0x2B: case 0x2D: /* +, - */ - goto offset; - case 0x5A: /* Z */ - goto utc_finish; - default: - errno = EINVAL; - return -1; - } - - if(buf == end) goto local_finish; - - /* - * Parse [mm[ss[(.|,)ffff]]] - * ^^ - */ - switch(*buf) { - case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: - case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: - tm_s.tm_sec = (*buf++) - 0x30; - if(buf == end) { errno = EINVAL; return -1; } - B2T(tm_sec); - break; - case 0x2B: case 0x2D: /* +, - */ - goto offset; - case 0x5A: /* Z */ - goto utc_finish; - default: - errno = EINVAL; - return -1; - } - - if(buf == end) goto local_finish; - - /* - * Parse [mm[ss[(.|,)ffff]]] - * ^ ^ - */ - switch(*buf) { - case 0x2C: case 0x2E: /* (.|,) */ - /* - * Process fractions of seconds. - */ - for(buf++; buf < end; buf++) { - int v = *buf; - /* GCC 4.x is being too smart without volatile */ - switch(v) { - case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: - case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: - if(fvalue < INT_MAX/10) { - fvalue = fvalue * 10 + (v - 0x30); - fdigits++; - } else { - /* Not enough precision, ignore */ - } - continue; - default: - break; - } - break; - } - } - - if(buf == end) goto local_finish; - - switch(*buf) { - case 0x2B: case 0x2D: /* +, - */ - goto offset; - case 0x5A: /* Z */ - goto utc_finish; - default: - errno = EINVAL; - return -1; - } - - -offset: - - if(end - buf < 3) { - errno = EINVAL; - return -1; - } - buf++; - B2F(gmtoff_h); - B2F(gmtoff_h); - if(buf[-3] == 0x2D) /* Negative */ - gmtoff = -1; - else - gmtoff = 1; - - if((end - buf) == 2) { - B2F(gmtoff_m); - B2F(gmtoff_m); - } else if(end != buf) { - errno = EINVAL; - return -1; - } - - gmtoff = gmtoff * (3600 * gmtoff_h + 60 * gmtoff_m); - - /* Fall through */ -utc_finish: - - offset_specified = 1; - - /* Fall through */ -local_finish: - - /* - * Validation. - */ - if((tm_s.tm_mon > 12 || tm_s.tm_mon < 1) - || (tm_s.tm_mday > 31 || tm_s.tm_mday < 1) - || (tm_s.tm_hour > 23) - || (tm_s.tm_sec > 60) - ) { - errno = EINVAL; - return -1; - } - - /* Canonicalize */ - tm_s.tm_mon -= 1; /* 0 - 11 */ - tm_s.tm_year -= 1900; - tm_s.tm_isdst = -1; - - tm_s.tm_sec -= gmtoff; - - /*** AT THIS POINT tm_s is either GMT or local (unknown) ****/ - - if(offset_specified) { - tloc = timegm(&tm_s); - } else { - /* - * Without an offset (or "Z"), - * we can only guess that it is a local zone. - * Interpret it in this fashion. - */ - tloc = mktime(&tm_s); - } - if(tloc == -1) { - errno = EINVAL; - return -1; - } - - if(ret_tm) { - if(as_gmt) { - if(offset_specified) { - *ret_tm = tm_s; - } else { - if(gmtime_r(&tloc, ret_tm) == 0) { - errno = EINVAL; - return -1; - } - } - } else { - if(localtime_r(&tloc, ret_tm) == 0) { - errno = EINVAL; - return -1; - } - } - } - - /* Fractions of seconds */ - if(frac_value) *frac_value = fvalue; - if(frac_digits) *frac_digits = fdigits; - - return tloc; -} - -GeneralizedTime_t * -asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { - return asn_time2GT_frac(opt_gt, tm, 0, 0, force_gmt); -} - -GeneralizedTime_t * -asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, int frac_value, int frac_digits, int force_gmt) { - struct tm tm_s; - long gmtoff = 0; - const unsigned int buf_size = - 4 + 2 + 2 /* yyyymmdd */ - + 2 + 2 + 2 /* hhmmss */ - + 1 + 9 /* .fffffffff */ - + 1 + 4 /* +hhmm */ - + 1 /* '\0' */ - ; - char *buf = NULL; - char *p = NULL; - int size = 0; - - /* Check arguments */ - if(!tm) { - errno = EINVAL; - return 0; - } - - /* Pre-allocate a buffer of sufficient yet small length */ - buf = (char *)MALLOC(buf_size); - if(!buf) return 0; - - gmtoff = GMTOFF(*tm); - - if(force_gmt && gmtoff) { - tm_s = *tm; - tm_s.tm_sec -= gmtoff; - timegm(&tm_s); /* Fix the time */ - tm = &tm_s; -#ifdef HAVE_TM_GMTOFF - assert(!GMTOFF(tm_s)); /* Will fix itself */ -#else /* !HAVE_TM_GMTOFF */ - gmtoff = 0; -#endif - } - - size = snprintf(buf, buf_size, "%04d%02d%02d%02d%02d%02d", - tm->tm_year + 1900, - tm->tm_mon + 1, - tm->tm_mday, - tm->tm_hour, - tm->tm_min, - tm->tm_sec - ); - if(size != 14) { - /* Could be assert(size == 14); */ - FREEMEM(buf); - errno = EINVAL; - return 0; - } - - p = buf + size; - - /* - * Deal with fractions. - */ - if(frac_value > 0 && frac_digits > 0) { - char *end = p + 1 + 9; /* '.' + maximum 9 digits */ - char *z = p; - long fbase; - *z++ = '.'; - - /* Place bounds on precision */ - while(frac_digits-- > 9) - frac_value /= 10; - - /* emulate fbase = pow(10, frac_digits) */ - for(fbase = 1; frac_digits--;) - fbase *= 10; - - do { - int digit = frac_value / fbase; - if(digit > 9) { z = 0; break; } - *z++ = digit + 0x30; - frac_value %= fbase; - fbase /= 10; - } while(fbase > 0 && frac_value > 0 && z < end); - if(z) { - for(--z; *z == 0x30; --z); /* Strip zeroes */ - p = z + (*z != '.'); - size = p - buf; - } - } - - if(force_gmt) { - *p++ = 0x5a; /* "Z" */ - *p++ = 0; - size++; - } else { - int ret; - gmtoff %= 86400; - ret = snprintf(p, buf_size - size, "%+03ld%02ld", - gmtoff / 3600, labs(gmtoff % 3600) / 60); - if(ret != 5) { - FREEMEM(buf); - errno = EINVAL; - return 0; - } - size += ret; - } - - if(opt_gt) { - if(opt_gt->buf) - FREEMEM(opt_gt->buf); - } else { - opt_gt = (GeneralizedTime_t *)CALLOC(1, sizeof *opt_gt); - if(!opt_gt) { FREEMEM(buf); return 0; } - } - - opt_gt->buf = (unsigned char *)buf; - opt_gt->size = size; - - return opt_gt; -} - -asn_random_fill_result_t -GeneralizedTime_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, - const asn_encoding_constraints_t *constraints, - size_t max_length) { - 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 const char *values[] = { - "19700101000000", "19700101000000-0000", "19700101000000+0000", - "19700101000000Z", "19700101000000.3Z", "19821106210623.3", - "19821106210629.3Z", "19691106210827.3-0500", "19821106210629.456", - }; - size_t rnd = asn_random_between(0, sizeof(values)/sizeof(values[0])-1); - - (void)constraints; - - if(max_length < sizeof("yyyymmddhhmmss") && !*sptr) { - return result_skipped; - } - - if(*sptr) { - if(OCTET_STRING_fromBuf(*sptr, values[rnd], -1) != 0) { - if(!sptr) return result_failed; - } - } else { - *sptr = OCTET_STRING_new_fromBuf(td, values[rnd], -1); - if(!sptr) return result_failed; - } - - return result_ok; -} - -int -GeneralizedTime_compare(const asn_TYPE_descriptor_t *td, const void *aptr, - const void *bptr) { - const GeneralizedTime_t *a = aptr; - const GeneralizedTime_t *b = bptr; - - (void)td; - - if(a && b) { - int afrac_value, afrac_digits; - int bfrac_value, bfrac_digits; - int aerr, berr; - time_t at, bt; - - errno = EPERM; - at = asn_GT2time_frac(a, &afrac_value, &afrac_digits, 0, 0); - aerr = errno; - errno = EPERM; - bt = asn_GT2time_frac(b, &bfrac_value, &bfrac_digits, 0, 0); - berr = errno; - - if(at == -1 && aerr != EPERM) { - if(bt == -1 && berr != EPERM) { - return OCTET_STRING_compare(td, aptr, bptr); - } else { - return -1; - } - } else if(bt == -1 && berr != EPERM) { - return 1; - } else { - /* Both values are valid. */ - } - - if(at < bt) { - return -1; - } else if(at > bt) { - return 1; - } else if(afrac_digits == bfrac_digits) { - if(afrac_value == bfrac_value) { - return 0; - } - if(afrac_value < bfrac_value) { - return -1; - } else { - return 1; - } - } else if(afrac_digits == 0) { - return -1; - } else if(bfrac_digits == 0) { - return 1; - } else { - double afrac = (double)afrac_value / afrac_digits; - double bfrac = (double)bfrac_value / bfrac_digits; - if(afrac < bfrac) { - return -1; - } else if(afrac > bfrac) { - return 1; - } else { - return 0; - } - } - } else if(!a && !b) { - return 0; - } else if(!a) { - return -1; - } else { - return 1; - } - -} - diff --git a/e2sm/lib/GlobalENB-ID.c b/e2sm/lib/GlobalENB-ID.c index db6e497..863eaf8 100644 --- a/e2sm/lib/GlobalENB-ID.c +++ b/e2sm/lib/GlobalENB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalENB-ID.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMNIdentity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "pLMNIdentity" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_ENB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "eNB-ID" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalENB_ID_1, 2, /* Elements count */ &asn_SPC_GlobalENB_ID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/GlobalGNB-ID.c b/e2sm/lib/GlobalGNB-ID.c index 8576ec7..83fdc1a 100644 --- a/e2sm/lib/GlobalGNB-ID.c +++ b/e2sm/lib/GlobalGNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalGNB-ID.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_GlobalGNB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMNIdentity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "pLMNIdentity" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_GlobalGNB_ID_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_GNB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-ID" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_GlobalGNB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalGNB_ID_1, 2, /* Elements count */ &asn_SPC_GlobalGNB_ID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/GlobalKPMnode-ID.c b/e2sm/lib/GlobalKPMnode-ID.c deleted file mode 100644 index b16ba1d..0000000 --- a/e2sm/lib/GlobalKPMnode-ID.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/GlobalKPMnode-eNB-ID.c b/e2sm/lib/GlobalKPMnode-eNB-ID.c deleted file mode 100644 index ae65253..0000000 --- a/e2sm/lib/GlobalKPMnode-eNB-ID.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/GlobalKPMnode-en-gNB-ID.c b/e2sm/lib/GlobalKPMnode-en-gNB-ID.c deleted file mode 100644 index 0ad39cb..0000000 --- a/e2sm/lib/GlobalKPMnode-en-gNB-ID.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/GlobalKPMnode-gNB-ID.c b/e2sm/lib/GlobalKPMnode-gNB-ID.c deleted file mode 100644 index 1765922..0000000 --- a/e2sm/lib/GlobalKPMnode-gNB-ID.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/GlobalKPMnode-ng-eNB-ID.c b/e2sm/lib/GlobalKPMnode-ng-eNB-ID.c deleted file mode 100644 index aeaf7ab..0000000 --- a/e2sm/lib/GlobalKPMnode-ng-eNB-ID.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/GlobalNGRANNodeID.c b/e2sm/lib/GlobalNGRANNodeID.c deleted file mode 100644 index 53fc9fe..0000000 --- a/e2sm/lib/GlobalNGRANNodeID.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#include "GlobalNGRANNodeID.h" - -#include "GlobalGNB-ID.h" -#include "GlobalNgENB-ID.h" -asn_per_constraints_t asn_PER_type_GlobalNGRANNodeID_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_GlobalNGRANNodeID_1[] = { - { ATF_POINTER, 0, offsetof(struct GlobalNGRANNodeID, choice.gNB), - (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 */ - "gNB" - }, - { ATF_POINTER, 0, offsetof(struct GlobalNGRANNodeID, choice.ng_eNB), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_GlobalNgENB_ID, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "ng-eNB" - }, -}; -static const asn_TYPE_tag2member_t asn_MAP_GlobalNGRANNodeID_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ng-eNB */ -}; -asn_CHOICE_specifics_t asn_SPC_GlobalNGRANNodeID_specs_1 = { - sizeof(struct GlobalNGRANNodeID), - offsetof(struct GlobalNGRANNodeID, _asn_ctx), - offsetof(struct GlobalNGRANNodeID, present), - sizeof(((struct GlobalNGRANNodeID *)0)->present), - asn_MAP_GlobalNGRANNodeID_tag2el_1, - 2, /* Count of tags in the map */ - 0, 0, - 2 /* Extensions start */ -}; -asn_TYPE_descriptor_t asn_DEF_GlobalNGRANNodeID = { - "GlobalNGRANNodeID", - "GlobalNGRANNodeID", - &asn_OP_CHOICE, - 0, /* No effective tags (pointer) */ - 0, /* No effective tags (count) */ - 0, /* No tags (pointer) */ - 0, /* No tags (count) */ - { 0, &asn_PER_type_GlobalNGRANNodeID_constr_1, CHOICE_constraint }, - asn_MBR_GlobalNGRANNodeID_1, - 2, /* Elements count */ - &asn_SPC_GlobalNGRANNodeID_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/GlobalNgENB-ID.c b/e2sm/lib/GlobalNgENB-ID.c index e0c693d..ff37ca3 100644 --- a/e2sm/lib/GlobalNgENB-ID.c +++ b/e2sm/lib/GlobalNgENB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalNgENB-ID.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_GlobalNgENB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMNIdentity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "pLMNIdentity" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_GlobalNgENB_ID_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_NgENB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ngENB-ID" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_GlobalNgENB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalNgENB_ID_1, 2, /* Elements count */ &asn_SPC_GlobalNgENB_ID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/GlobalRANNodeID.c b/e2sm/lib/GlobalRANNodeID.c new file mode 100644 index 0000000..42318a0 --- /dev/null +++ b/e2sm/lib/GlobalRANNodeID.c @@ -0,0 +1,95 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-COMMON-IEs" + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` + */ + +#include "GlobalRANNodeID.h" + +#include "GlobalGNB-ID.h" +#include "GlobalNgENB-ID.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_GlobalRANNodeID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +asn_per_constraints_t asn_PER_type_GlobalRANNodeID_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 */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +asn_TYPE_member_t asn_MBR_GlobalRANNodeID_1[] = { + { ATF_POINTER, 0, offsetof(struct GlobalRANNodeID, choice.globalGNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalGNB_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "globalGNB-ID" + }, + { ATF_POINTER, 0, offsetof(struct GlobalRANNodeID, choice.globalNgENB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalNgENB_ID, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "globalNgENB-ID" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalRANNodeID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* globalGNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* globalNgENB-ID */ +}; +asn_CHOICE_specifics_t asn_SPC_GlobalRANNodeID_specs_1 = { + sizeof(struct GlobalRANNodeID), + offsetof(struct GlobalRANNodeID, _asn_ctx), + offsetof(struct GlobalRANNodeID, present), + sizeof(((struct GlobalRANNodeID *)0)->present), + asn_MAP_GlobalRANNodeID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, + 2 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalRANNodeID = { + "GlobalRANNodeID", + "GlobalRANNodeID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GlobalRANNodeID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GlobalRANNodeID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, + asn_MBR_GlobalRANNodeID_1, + 2, /* Elements count */ + &asn_SPC_GlobalRANNodeID_specs_1 /* Additional specs */ +}; + diff --git a/e2sm/lib/GlobalenGNB-ID.c b/e2sm/lib/GlobalenGNB-ID.c index aca7a85..c1c8417 100644 --- a/e2sm/lib/GlobalenGNB-ID.c +++ b/e2sm/lib/GlobalenGNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GlobalenGNB-ID.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMNIdentity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "pLMN-Identity" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_EN_GNB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "en-gNB-ID" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_GlobalenGNB_ID = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_GlobalenGNB_ID_1, 2, /* Elements count */ &asn_SPC_GlobalenGNB_ID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/GlobalgNB-ID.c b/e2sm/lib/GlobalgNB-ID.c deleted file mode 100644 index 746fb2c..0000000 --- a/e2sm/lib/GlobalgNB-ID.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/GlobalngeNB-ID.c b/e2sm/lib/GlobalngeNB-ID.c deleted file mode 100644 index 878484a..0000000 --- a/e2sm/lib/GlobalngeNB-ID.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/GranularityPeriod.c b/e2sm/lib/GranularityPeriod.c index 1cf3c62..a74dc75 100644 --- a/e2sm/lib/GranularityPeriod.c +++ b/e2sm/lib/GranularityPeriod.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GranularityPeriod.h" @@ -21,7 +21,7 @@ GranularityPeriod_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const unsigned long *)sptr; - if((value >= 1 && value <= 4294967295)) { + if((value >= 1UL && value <= 4294967295UL)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ GranularityPeriod_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_GranularityPeriod_constr_1 CC_NOTUSED = { + { 4, 1 } /* (1..4294967295) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_GranularityPeriod_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 32, -1, 1, 4294967295 } /* (1..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ const asn_INTEGER_specifics_t asn_SPC_GranularityPeriod_specs_1 = { 0, 0, 0, 0, 0, 0, /* Native long size */ @@ -59,7 +66,15 @@ asn_TYPE_descriptor_t asn_DEF_GranularityPeriod = { asn_DEF_GranularityPeriod_tags_1, /* Same as above */ sizeof(asn_DEF_GranularityPeriod_tags_1) /sizeof(asn_DEF_GranularityPeriod_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_GranularityPeriod_constr_1, GranularityPeriod_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GranularityPeriod_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GranularityPeriod_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + GranularityPeriod_constraint + }, 0, 0, /* No members */ &asn_SPC_GranularityPeriod_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/GraphicString.c b/e2sm/lib/GraphicString.c index e6642c9..b761187 100644 --- a/e2sm/lib/GraphicString.c +++ b/e2sm/lib/GraphicString.c @@ -9,50 +9,83 @@ * GraphicString basic type description. */ static const ber_tlv_tag_t asn_DEF_GraphicString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (25 << 2)), /* [UNIVERSAL 25] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ + (ASN_TAG_CLASS_UNIVERSAL | (25 << 2)), /* [UNIVERSAL 25] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_operation_t asn_OP_GraphicString = { - OCTET_STRING_free, - OCTET_STRING_print, /* non-ascii string */ - OCTET_STRING_compare, - OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, - OCTET_STRING_decode_xer_hex, - OCTET_STRING_encode_xer, /* Can't expect it to be ASCII/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, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_uper, - OCTET_STRING_decode_aper, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_aper, -#endif /* ASN_DISABLE_PER_SUPPORT */ - OCTET_STRING_random_fill, - 0 /* Use generic outmost tag fetcher */ + OCTET_STRING_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OCTET_STRING_print, /* non-ascii string */ +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_hex, + OCTET_STRING_encode_xer, /* Can't expect it to be ASCII/UTF8 */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_encode_jer, /* Can't expect it to be ASCII/UTF8 */ +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + OCTET_STRING_decode_oer, + OCTET_STRING_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + OCTET_STRING_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ }; asn_TYPE_descriptor_t asn_DEF_GraphicString = { - "GraphicString", - "GraphicString", - &asn_OP_GraphicString, - asn_DEF_GraphicString_tags, - sizeof(asn_DEF_GraphicString_tags) - / sizeof(asn_DEF_GraphicString_tags[0]) - 1, - asn_DEF_GraphicString_tags, - sizeof(asn_DEF_GraphicString_tags) - / sizeof(asn_DEF_GraphicString_tags[0]), - { 0, 0, asn_generic_unknown_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ + "GraphicString", + "GraphicString", + &asn_OP_GraphicString, + asn_DEF_GraphicString_tags, + sizeof(asn_DEF_GraphicString_tags) + / sizeof(asn_DEF_GraphicString_tags[0]) - 1, + asn_DEF_GraphicString_tags, + sizeof(asn_DEF_GraphicString_tags) + / sizeof(asn_DEF_GraphicString_tags[0]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_unknown_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ }; - diff --git a/e2sm/lib/GroupID.c b/e2sm/lib/GroupID.c index 8eaff0e..4c52f6d 100644 --- a/e2sm/lib/GroupID.c +++ b/e2sm/lib/GroupID.c @@ -1,24 +1,39 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "GroupID.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_GroupID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_GroupID_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_GroupID_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GroupID, choice.fiveGC), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FiveQI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "fiveGC" }, @@ -27,7 +42,15 @@ static asn_TYPE_member_t asn_MBR_GroupID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_QCI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ePC" }, @@ -54,7 +77,15 @@ asn_TYPE_descriptor_t asn_DEF_GroupID = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_GroupID_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_GroupID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_GroupID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_GroupID_1, 2, /* Elements count */ &asn_SPC_GroupID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/IA5String.c b/e2sm/lib/IA5String.c deleted file mode 100644 index 1aeebf4..0000000 --- a/e2sm/lib/IA5String.c +++ /dev/null @@ -1,97 +0,0 @@ -/*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include - -/* - * IA5String basic type description. - */ -static const ber_tlv_tag_t asn_DEF_IA5String_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), /* [UNIVERSAL 22] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ -}; -static asn_per_constraints_t asn_DEF_IA5String_per_constraints = { - { APC_CONSTRAINED, 7, 7, 0, 0x7f }, /* Value */ - { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ - 0, 0 -}; -asn_TYPE_operation_t asn_OP_IA5String = { - 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_IA5String = { - "IA5String", - "IA5String", - &asn_OP_IA5String, - asn_DEF_IA5String_tags, - sizeof(asn_DEF_IA5String_tags) - / sizeof(asn_DEF_IA5String_tags[0]) - 1, - asn_DEF_IA5String_tags, - sizeof(asn_DEF_IA5String_tags) - / sizeof(asn_DEF_IA5String_tags[0]), - { 0, &asn_DEF_IA5String_per_constraints, IA5String_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - -int -IA5String_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, - asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const IA5String_t *st = (const IA5String_t *)sptr; - - if(st && st->buf) { - uint8_t *buf = st->buf; - uint8_t *end = buf + st->size; - /* - * IA5String is generally equivalent to 7bit ASCII. - * ISO/ITU-T T.50, 1963. - */ - for(; buf < end; buf++) { - if(*buf > 0x7F) { - ASN__CTFAIL(app_key, td, sptr, - "%s: value byte %ld out of range: " - "%d > 127 (%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/e2sm/lib/INTEGER.c b/e2sm/lib/INTEGER.c index 2a2f4d7..095063f 100644 --- a/e2sm/lib/INTEGER.c +++ b/e2sm/lib/INTEGER.c @@ -1,134 +1,99 @@ -/*- - * Copyright (c) 2003-2014 Lev Walkin . +/* + * Copyright (c) 2003-2019 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 +#include /* * INTEGER basic type description. */ static const ber_tlv_tag_t asn_DEF_INTEGER_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) + (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, + INTEGER_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + INTEGER_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + INTEGER_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + ber_decode_primitive, + INTEGER_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + INTEGER_decode_xer, + INTEGER_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + INTEGER_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + INTEGER_decode_oer, /* OER decoder */ + INTEGER_encode_oer, /* Canonical OER encoder */ #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, + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + INTEGER_decode_uper, /* Unaligned PER decoder */ + INTEGER_encode_uper, /* Unaligned PER encoder */ #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + INTEGER_decode_aper, /* Aligned PER decoder */ + INTEGER_encode_aper, /* Aligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + INTEGER_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ +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 */ + "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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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 +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; @@ -202,89 +167,6 @@ INTEGER__dump(const asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_cons 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; @@ -304,816 +186,6 @@ INTEGER_map_value2enum(const asn_INTEGER_specifics_t *specs, long value) { 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; @@ -1428,64 +500,71 @@ asn_int642INTEGER(INTEGER_t *st, int64_t value) { */ enum asn_strtox_result_e asn_strtoimax_lim(const char *str, const char **end, intmax_t *intp) { - int sign = 1; - intmax_t value; + 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; - } - } + const intmax_t 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; - 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; - } - } + if(str >= *end) return ASN_STRTOX_ERROR_INVAL; - *end = str; - *intp = sign * value; - return ASN_STRTOX_OK; + 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++) { + if(*str >= 0x30 && *str <= 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; + } + str += 1; + if(str < *end) { + // If digits continue, we're guaranteed out of range. + *end = str; + if(*str >= 0x30 && *str <= 0x39) { + return ASN_STRTOX_ERROR_RANGE; + } else { + *intp = sign * value; + return ASN_STRTOX_EXTRA_DATA; + } + } + break; + } else { + *end = str; + return ASN_STRTOX_ERROR_RANGE; + } + } else { + *end = str; + return ASN_STRTOX_ERROR_RANGE; + } + } else { + *end = str; + *intp = sign * value; + return ASN_STRTOX_EXTRA_DATA; + } + } + + *end = str; + *intp = sign * value; + return ASN_STRTOX_OK; } /* @@ -1496,56 +575,63 @@ asn_strtoimax_lim(const char *str, const char **end, intmax_t *intp) { */ enum asn_strtox_result_e asn_strtoumax_lim(const char *str, const char **end, uintmax_t *uintp) { - uintmax_t value; + 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 + const uintmax_t asn1_uintmax_max = ((~(uintmax_t)0)); + const uintmax_t upper_boundary = asn1_uintmax_max / 10; + uintmax_t last_digit_max = asn1_uintmax_max % 10; if(str >= *end) return ASN_STRTOX_ERROR_INVAL; - switch(*str) { - case '-': + switch(*str) { + case '-': return ASN_STRTOX_ERROR_INVAL; - case '+': - str++; - if(str >= *end) { - *end = str; - return ASN_STRTOX_EXPECT_MORE; - } - } + 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) { + for(value = 0; str < (*end); str++) { + if(*str >= 0x30 && *str <= 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; + str += 1; + if(str < *end) { + // If digits continue, we're guaranteed out of range. + *end = str; + if(*str >= 0x30 && *str <= 0x39) { + return ASN_STRTOX_ERROR_RANGE; + } else { + *uintp = value; + return ASN_STRTOX_EXTRA_DATA; + } + } + break; } 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; + return ASN_STRTOX_ERROR_RANGE; + } + } else { + *end = str; + return ASN_STRTOX_ERROR_RANGE; + } + } else { + *end = str; + *uintp = value; + return ASN_STRTOX_EXTRA_DATA; + } + } - *end = str; - *uintp = value; - return ASN_STRTOX_OK; + *end = str; + *uintp = value; + return ASN_STRTOX_OK; } enum asn_strtox_result_e @@ -1650,86 +736,3 @@ INTEGER_compare(const asn_TYPE_descriptor_t *td, const void *aptr, } } - -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/e2sm/lib/INTEGER_aper.c b/e2sm/lib/INTEGER_aper.c new file mode 100644 index 0000000..fc88268 --- /dev/null +++ b/e2sm/lib/INTEGER_aper.c @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 %lld", + value, (long long int)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 %lld", + value, (long long int)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, -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/%zu) lb %lld ub %lld %s", + uval, st->buf[0], st->size, + (long long int)ct->lower_bound, + (long long int)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/%zu) lb %lld ub %lld %s", + value, st->buf[0], st->size, + (long long int)ct->lower_bound, + (long long int)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 (%lld) with range %d bits", + value, (long long int)(value - ct->lower_bound), + ct->range_bits); + + v = value - ct->lower_bound; + + /* #12 <= 8 -> alignment ? */ + int range = ct->upper_bound - ct->lower_bound + 1; + if (ct->range_bits < 8 || (ct->range_bits == 8 && range < 256)) { + 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 %lld", (long long int)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 = aper_put_length(po, -1, -1, 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 && (aper_put_length(po, -1, -1, 0, NULL) < 0)) + ASN__ENCODE_FAILED; + } + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/INTEGER_ber.c b/e2sm/lib/INTEGER_ber.c new file mode 100644 index 0000000..57bfe1e --- /dev/null +++ b/e2sm/lib/INTEGER_ber.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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; +} diff --git a/e2sm/lib/INTEGER_jer.c b/e2sm/lib/INTEGER_jer.c new file mode 100644 index 0000000..23d7c12 --- /dev/null +++ b/e2sm/lib/INTEGER_jer.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +INTEGER_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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); +} diff --git a/e2sm/lib/INTEGER_oer.c b/e2sm/lib/INTEGER_oer.c index 110689b..19f276d 100644 --- a/e2sm/lib/INTEGER_oer.c +++ b/e2sm/lib/INTEGER_oer.c @@ -3,11 +3,8 @@ * 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, @@ -175,5 +172,3 @@ INTEGER_encode_oer(const asn_TYPE_descriptor_t *td, ASN__ENCODED_OK(er); } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2sm/lib/INTEGER_print.c b/e2sm/lib/INTEGER_print.c new file mode 100644 index 0000000..2d37dee --- /dev/null +++ b/e2sm/lib/INTEGER_print.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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; +} diff --git a/e2sm/lib/INTEGER_rfill.c b/e2sm/lib/INTEGER_rfill.c new file mode 100644 index 0000000..fab0023 --- /dev/null +++ b/e2sm/lib/INTEGER_rfill.c @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 { + 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; +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + const asn_per_constraints_t *ct; + + 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); + } + } +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + } + + 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/e2sm/lib/INTEGER_uper.c b/e2sm/lib/INTEGER_uper.c new file mode 100644 index 0000000..ed65385 --- /dev/null +++ b/e2sm/lib/INTEGER_uper.c @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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(uintmax_t)) + ASN__DECODE_FAILED; + + if(specs && specs->field_unsigned) { + uintmax_t 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_umax2INTEGER(st, uvalue)) + ASN__DECODE_FAILED; + } else { + uintmax_t uvalue = 0; + intmax_t 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_imax_range_unrebase(uvalue, ct->lower_bound, + ct->upper_bound, &svalue) + || asn_imax2INTEGER(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 arithmetic. + */ + 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; + union { + intmax_t s; + uintmax_t u; + } value; + + 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) { + if(asn_INTEGER2umax(st, &value.u)) + ASN__ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(value.u < (uintmax_t)ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(value.u < (uintmax_t)ct->lower_bound + || value.u > (uintmax_t)ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %lu (%02x/%" ASN_PRI_SIZE ") lb %lu ub %lu %s", + value.u, st->buf[0], st->size, + ct->lower_bound, ct->upper_bound, + inext ? "ext" : "fix"); + } else { + if(asn_INTEGER2imax(st, &value.s)) + ASN__ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(value.s < ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(value.s < ct->lower_bound + || value.s > ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %ld (%02x/%" ASN_PRI_SIZE ") lb %ld ub %ld %s", + value.s, 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) { + uintmax_t v; + /* #11.5.6 -> #11.3 */ + if(specs && specs->field_unsigned) { + if(((uintmax_t)ct->lower_bound > (uintmax_t)(ct->upper_bound) + || (value.u < (uintmax_t)ct->lower_bound)) + || (value.u > (uintmax_t)ct->upper_bound)) { + ASN_DEBUG("Value %lu to-be-encoded is outside the bounds [%lu, %lu]!", + value.u, ct->lower_bound, ct->upper_bound); + ASN__ENCODE_FAILED; + } + v = value.u - (uintmax_t)ct->lower_bound; + } else { + if(per_imax_range_rebase(value.s, ct->lower_bound, ct->upper_bound, &v)) { + ASN__ENCODE_FAILED; + } + } + ASN_DEBUG("Encoding integer %lu with range %d bits", + v, ct->range_bits); + 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); +} diff --git a/e2sm/lib/INTEGER_xer.c b/e2sm/lib/INTEGER_xer.c new file mode 100644 index 0000000..4f21c86 --- /dev/null +++ b/e2sm/lib/INTEGER_xer.c @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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_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); +} diff --git a/e2sm/lib/ISO646String.c b/e2sm/lib/ISO646String.c deleted file mode 100644 index f5fc69e..0000000 --- a/e2sm/lib/ISO646String.c +++ /dev/null @@ -1,62 +0,0 @@ -/*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include - -/* - * ISO646String basic type description. - */ -static const ber_tlv_tag_t asn_DEF_ISO646String_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ -}; -static asn_per_constraints_t asn_DEF_ISO646String_per_constraints = { - { APC_CONSTRAINED, 7, 7, 0x20, 0x7e }, /* Value */ - { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ - 0, 0 -}; -asn_TYPE_operation_t asn_OP_ISO646String = { - 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_ISO646String = { - "ISO646String", - "ISO646String", - &asn_OP_ISO646String, - asn_DEF_ISO646String_tags, - sizeof(asn_DEF_ISO646String_tags) - / sizeof(asn_DEF_ISO646String_tags[0]) - 1, - asn_DEF_ISO646String_tags, - sizeof(asn_DEF_ISO646String_tags) - / sizeof(asn_DEF_ISO646String_tags[0]), - { 0, &asn_DEF_ISO646String_per_constraints, ISO646String_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; diff --git a/e2sm/lib/IndexToRFSP.c b/e2sm/lib/IndexToRFSP.c index 36829da..fa82e0d 100644 --- a/e2sm/lib/IndexToRFSP.c +++ b/e2sm/lib/IndexToRFSP.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "IndexToRFSP.h" @@ -21,7 +21,7 @@ IndexToRFSP_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 1 && value <= 256)) { + if((value >= 1L && value <= 256L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ IndexToRFSP_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_IndexToRFSP_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_IndexToRFSP_constr_1 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 1, 256 } /* (1..256,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_IndexToRFSP_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_IndexToRFSP = { asn_DEF_IndexToRFSP_tags_1, /* Same as above */ sizeof(asn_DEF_IndexToRFSP_tags_1) /sizeof(asn_DEF_IndexToRFSP_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_IndexToRFSP_constr_1, IndexToRFSP_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_IndexToRFSP_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_IndexToRFSP_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + IndexToRFSP_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/Interface-MessageID.c b/e2sm/lib/Interface-MessageID.c index da967de..bd836ef 100644 --- a/e2sm/lib/Interface-MessageID.c +++ b/e2sm/lib/Interface-MessageID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "Interface-MessageID.h" @@ -11,11 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_messageType_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_messageType_constr_3 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_messageType_value2enum_3[] = { { 0, 17, "initiatingMessage" }, { 1, 17, "successfulOutcome" }, @@ -52,7 +59,15 @@ asn_TYPE_descriptor_t asn_DEF_messageType_3 = { asn_DEF_messageType_tags_3, /* Same as above */ sizeof(asn_DEF_messageType_tags_3) /sizeof(asn_DEF_messageType_tags_3[0]), /* 2 */ - { 0, &asn_PER_type_messageType_constr_3, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_messageType_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_messageType_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_messageType_specs_3 /* Additional specs */ }; @@ -63,7 +78,15 @@ static asn_TYPE_member_t asn_MBR_Interface_MessageID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "interfaceProcedureID" }, @@ -72,7 +95,15 @@ static asn_TYPE_member_t asn_MBR_Interface_MessageID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_messageType_3, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "messageType" }, @@ -102,7 +133,15 @@ asn_TYPE_descriptor_t asn_DEF_Interface_MessageID = { asn_DEF_Interface_MessageID_tags_1, /* Same as above */ sizeof(asn_DEF_Interface_MessageID_tags_1) /sizeof(asn_DEF_Interface_MessageID_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_Interface_MessageID_1, 2, /* Elements count */ &asn_SPC_Interface_MessageID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/InterfaceID-E1.c b/e2sm/lib/InterfaceID-E1.c index a98f85b..c282c5a 100644 --- a/e2sm/lib/InterfaceID-E1.c +++ b/e2sm/lib/InterfaceID-E1.c @@ -1,28 +1,44 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "InterfaceID-E1.h" asn_TYPE_member_t asn_MBR_InterfaceID_E1_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct InterfaceID_E1, globalGNB_ID), + { ATF_NOFLAGS, 0, offsetof(struct InterfaceID_E1, global_NG_RAN_ID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_GlobalGNB_ID, + +1, /* EXPLICIT tag at current level */ + &asn_DEF_GlobalRANNodeID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "globalGNB-ID" + "global-NG-RAN-ID" }, { ATF_NOFLAGS, 0, offsetof(struct InterfaceID_E1, 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-CU-UP-ID" }, @@ -31,7 +47,7 @@ static const ber_tlv_tag_t asn_DEF_InterfaceID_E1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static const asn_TYPE_tag2member_t asn_MAP_InterfaceID_E1_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* globalGNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* global-NG-RAN-ID */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gNB-CU-UP-ID */ }; asn_SEQUENCE_specifics_t asn_SPC_InterfaceID_E1_specs_1 = { @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_InterfaceID_E1 = { asn_DEF_InterfaceID_E1_tags_1, /* Same as above */ sizeof(asn_DEF_InterfaceID_E1_tags_1) /sizeof(asn_DEF_InterfaceID_E1_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_InterfaceID_E1_1, 2, /* Elements count */ &asn_SPC_InterfaceID_E1_specs_1 /* Additional specs */ diff --git a/e2sm/lib/InterfaceID-F1.c b/e2sm/lib/InterfaceID-F1.c index 4900cb7..9bcb054 100644 --- a/e2sm/lib/InterfaceID-F1.c +++ b/e2sm/lib/InterfaceID-F1.c @@ -1,28 +1,44 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "InterfaceID-F1.h" asn_TYPE_member_t asn_MBR_InterfaceID_F1_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct InterfaceID_F1, globalGNB_ID), + { ATF_NOFLAGS, 0, offsetof(struct InterfaceID_F1, global_NG_RAN_ID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_GlobalGNB_ID, + +1, /* EXPLICIT tag at current level */ + &asn_DEF_GlobalRANNodeID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ - "globalGNB-ID" + "global-NG-RAN-ID" }, { ATF_NOFLAGS, 0, offsetof(struct InterfaceID_F1, gNB_DU_ID), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GNB_DU_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-DU-ID" }, @@ -31,7 +47,7 @@ static const ber_tlv_tag_t asn_DEF_InterfaceID_F1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static const asn_TYPE_tag2member_t asn_MAP_InterfaceID_F1_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* globalGNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* global-NG-RAN-ID */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gNB-DU-ID */ }; asn_SEQUENCE_specifics_t asn_SPC_InterfaceID_F1_specs_1 = { @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_InterfaceID_F1 = { asn_DEF_InterfaceID_F1_tags_1, /* Same as above */ sizeof(asn_DEF_InterfaceID_F1_tags_1) /sizeof(asn_DEF_InterfaceID_F1_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_InterfaceID_F1_1, 2, /* Elements count */ &asn_SPC_InterfaceID_F1_specs_1 /* Additional specs */ diff --git a/e2sm/lib/InterfaceID-NG.c b/e2sm/lib/InterfaceID-NG.c index 2083c0f..cd176bb 100644 --- a/e2sm/lib/InterfaceID-NG.c +++ b/e2sm/lib/InterfaceID-NG.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "InterfaceID-NG.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_InterfaceID_NG_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GUAMI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "guami" }, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_InterfaceID_NG = { asn_DEF_InterfaceID_NG_tags_1, /* Same as above */ sizeof(asn_DEF_InterfaceID_NG_tags_1) /sizeof(asn_DEF_InterfaceID_NG_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_InterfaceID_NG_1, 1, /* Elements count */ &asn_SPC_InterfaceID_NG_specs_1 /* Additional specs */ diff --git a/e2sm/lib/InterfaceID-S1.c b/e2sm/lib/InterfaceID-S1.c index e8e728f..d483c5d 100644 --- a/e2sm/lib/InterfaceID-S1.c +++ b/e2sm/lib/InterfaceID-S1.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "InterfaceID-S1.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_InterfaceID_S1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GUMMEI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gUMMEI" }, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_InterfaceID_S1 = { asn_DEF_InterfaceID_S1_tags_1, /* Same as above */ sizeof(asn_DEF_InterfaceID_S1_tags_1) /sizeof(asn_DEF_InterfaceID_S1_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_InterfaceID_S1_1, 1, /* Elements count */ &asn_SPC_InterfaceID_S1_specs_1 /* Additional specs */ diff --git a/e2sm/lib/InterfaceID-W1.c b/e2sm/lib/InterfaceID-W1.c index 37033aa..da9fecc 100644 --- a/e2sm/lib/InterfaceID-W1.c +++ b/e2sm/lib/InterfaceID-W1.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "InterfaceID-W1.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_InterfaceID_W1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalNgENB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "global-ng-eNB-ID" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_InterfaceID_W1_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NGENB_DU_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ng-eNB-DU-ID" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_InterfaceID_W1 = { asn_DEF_InterfaceID_W1_tags_1, /* Same as above */ sizeof(asn_DEF_InterfaceID_W1_tags_1) /sizeof(asn_DEF_InterfaceID_W1_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_InterfaceID_W1_1, 2, /* Elements count */ &asn_SPC_InterfaceID_W1_specs_1 /* Additional specs */ diff --git a/e2sm/lib/InterfaceID-X2.c b/e2sm/lib/InterfaceID-X2.c index d191871..461f3a6 100644 --- a/e2sm/lib/InterfaceID-X2.c +++ b/e2sm/lib/InterfaceID-X2.c @@ -1,26 +1,41 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "InterfaceID-X2.h" #include "GlobalENB-ID.h" #include "GlobalenGNB-ID.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_nodeType_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_nodeType_constr_2 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_nodeType_2[] = { { ATF_POINTER, 0, offsetof(struct InterfaceID_X2__nodeType, choice.global_eNB_ID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalENB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "global-eNB-ID" }, @@ -29,7 +44,15 @@ static asn_TYPE_member_t asn_MBR_nodeType_2[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalenGNB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "global-en-gNB-ID" }, @@ -57,7 +80,15 @@ asn_TYPE_descriptor_t asn_DEF_nodeType_2 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_nodeType_constr_2, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_nodeType_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_nodeType_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_nodeType_2, 2, /* Elements count */ &asn_SPC_nodeType_specs_2 /* Additional specs */ @@ -69,7 +100,15 @@ asn_TYPE_member_t asn_MBR_InterfaceID_X2_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_nodeType_2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "nodeType" }, @@ -98,7 +137,15 @@ asn_TYPE_descriptor_t asn_DEF_InterfaceID_X2 = { asn_DEF_InterfaceID_X2_tags_1, /* Same as above */ sizeof(asn_DEF_InterfaceID_X2_tags_1) /sizeof(asn_DEF_InterfaceID_X2_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_InterfaceID_X2_1, 1, /* Elements count */ &asn_SPC_InterfaceID_X2_specs_1 /* Additional specs */ diff --git a/e2sm/lib/InterfaceID-Xn.c b/e2sm/lib/InterfaceID-Xn.c index a78a67e..d4ceda6 100644 --- a/e2sm/lib/InterfaceID-Xn.c +++ b/e2sm/lib/InterfaceID-Xn.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "InterfaceID-Xn.h" @@ -11,9 +11,17 @@ asn_TYPE_member_t asn_MBR_InterfaceID_Xn_1[] = { { ATF_NOFLAGS, 0, offsetof(struct InterfaceID_Xn, global_NG_RAN_ID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), +1, /* EXPLICIT tag at current level */ - &asn_DEF_GlobalNGRANNodeID, + &asn_DEF_GlobalRANNodeID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "global-NG-RAN-ID" }, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_InterfaceID_Xn = { asn_DEF_InterfaceID_Xn_tags_1, /* Same as above */ sizeof(asn_DEF_InterfaceID_Xn_tags_1) /sizeof(asn_DEF_InterfaceID_Xn_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_InterfaceID_Xn_1, 1, /* Elements count */ &asn_SPC_InterfaceID_Xn_specs_1 /* Additional specs */ diff --git a/e2sm/lib/InterfaceIdentifier.c b/e2sm/lib/InterfaceIdentifier.c index bc596a5..059ec26 100644 --- a/e2sm/lib/InterfaceIdentifier.c +++ b/e2sm/lib/InterfaceIdentifier.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "InterfaceIdentifier.h" @@ -14,18 +14,33 @@ #include "InterfaceID-S1.h" #include "InterfaceID-X2.h" #include "InterfaceID-W1.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_InterfaceIdentifier_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_InterfaceIdentifier_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_InterfaceIdentifier_1[] = { { ATF_POINTER, 0, offsetof(struct InterfaceIdentifier, choice.nG), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_InterfaceID_NG, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "nG" }, @@ -34,7 +49,15 @@ static asn_TYPE_member_t asn_MBR_InterfaceIdentifier_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_InterfaceID_Xn, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "xN" }, @@ -43,7 +66,15 @@ static asn_TYPE_member_t asn_MBR_InterfaceIdentifier_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_InterfaceID_F1, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "f1" }, @@ -52,7 +83,15 @@ static asn_TYPE_member_t asn_MBR_InterfaceIdentifier_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_InterfaceID_E1, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "e1" }, @@ -61,7 +100,15 @@ static asn_TYPE_member_t asn_MBR_InterfaceIdentifier_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_InterfaceID_S1, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "s1" }, @@ -70,7 +117,15 @@ static asn_TYPE_member_t asn_MBR_InterfaceIdentifier_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_InterfaceID_X2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "x2" }, @@ -79,7 +134,15 @@ static asn_TYPE_member_t asn_MBR_InterfaceIdentifier_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_InterfaceID_W1, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "w1" }, @@ -111,7 +174,15 @@ asn_TYPE_descriptor_t asn_DEF_InterfaceIdentifier = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_InterfaceIdentifier_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_InterfaceIdentifier_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_InterfaceIdentifier_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_InterfaceIdentifier_1, 7, /* Elements count */ &asn_SPC_InterfaceIdentifier_specs_1 /* Additional specs */ diff --git a/e2sm/lib/InterfaceType.c b/e2sm/lib/InterfaceType.c index 17f3635..cd72ad7 100644 --- a/e2sm/lib/InterfaceType.c +++ b/e2sm/lib/InterfaceType.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "InterfaceType.h" @@ -11,11 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_InterfaceType_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_InterfaceType_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_InterfaceType_value2enum_1[] = { { 0, 2, "nG" }, { 1, 2, "xn" }, @@ -58,7 +65,15 @@ asn_TYPE_descriptor_t asn_DEF_InterfaceType = { asn_DEF_InterfaceType_tags_1, /* Same as above */ sizeof(asn_DEF_InterfaceType_tags_1) /sizeof(asn_DEF_InterfaceType_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_InterfaceType_constr_1, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_InterfaceType_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_InterfaceType_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_InterfaceType_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/LabelInfoItem.c b/e2sm/lib/LabelInfoItem.c index dafa081..5c5ec3a 100644 --- a/e2sm/lib/LabelInfoItem.c +++ b/e2sm/lib/LabelInfoItem.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "LabelInfoItem.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_LabelInfoItem_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementLabel, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measLabel" }, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_LabelInfoItem = { asn_DEF_LabelInfoItem_tags_1, /* Same as above */ sizeof(asn_DEF_LabelInfoItem_tags_1) /sizeof(asn_DEF_LabelInfoItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_LabelInfoItem_1, 1, /* Elements count */ &asn_SPC_LabelInfoItem_specs_1 /* Additional specs */ diff --git a/e2sm/lib/LabelInfoList.c b/e2sm/lib/LabelInfoList.c index 9d7e620..7b3355a 100644 --- a/e2sm/lib/LabelInfoList.c +++ b/e2sm/lib/LabelInfoList.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "LabelInfoList.h" #include "LabelInfoItem.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_LabelInfoList_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..2147483647)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_LabelInfoList_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 31, -1, 1, 2147483647 } /* (SIZE(1..2147483647)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_LabelInfoList_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_LabelInfoItem, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -42,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_LabelInfoList = { asn_DEF_LabelInfoList_tags_1, /* Same as above */ sizeof(asn_DEF_LabelInfoList_tags_1) /sizeof(asn_DEF_LabelInfoList_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_LabelInfoList_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_LabelInfoList_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_LabelInfoList_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_LabelInfoList_1, 1, /* Single element */ &asn_SPC_LabelInfoList_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MME-Code.c b/e2sm/lib/MME-Code.c index d110616..3046b25 100644 --- a/e2sm/lib/MME-Code.c +++ b/e2sm/lib/MME-Code.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MME-Code.h" @@ -22,7 +22,7 @@ MME_Code_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size == 1)) { + if((size == 1UL)) { /* Constraint check succeeded */ return 0; } else { @@ -37,11 +37,18 @@ MME_Code_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MME_Code_constr_1 CC_NOTUSED = { + { 0, 0 }, + 1 /* (SIZE(1..1)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MME_Code_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 1, 1 } /* (SIZE(1..1)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_MME_Code_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; @@ -55,7 +62,15 @@ asn_TYPE_descriptor_t asn_DEF_MME_Code = { asn_DEF_MME_Code_tags_1, /* Same as above */ sizeof(asn_DEF_MME_Code_tags_1) /sizeof(asn_DEF_MME_Code_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MME_Code_constr_1, MME_Code_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MME_Code_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MME_Code_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + MME_Code_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/MME-Group-ID.c b/e2sm/lib/MME-Group-ID.c index 1136961..5bf992c 100644 --- a/e2sm/lib/MME-Group-ID.c +++ b/e2sm/lib/MME-Group-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MME-Group-ID.h" @@ -22,7 +22,7 @@ MME_Group_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size == 2)) { + if((size == 2UL)) { /* Constraint check succeeded */ return 0; } else { @@ -37,11 +37,18 @@ MME_Group_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MME_Group_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + 2 /* (SIZE(2..2)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MME_Group_ID_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 2, 2 } /* (SIZE(2..2)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_MME_Group_ID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; @@ -55,7 +62,15 @@ asn_TYPE_descriptor_t asn_DEF_MME_Group_ID = { asn_DEF_MME_Group_ID_tags_1, /* Same as above */ sizeof(asn_DEF_MME_Group_ID_tags_1) /sizeof(asn_DEF_MME_Group_ID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MME_Group_ID_constr_1, MME_Group_ID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MME_Group_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MME_Group_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + MME_Group_ID_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/MME-UE-S1AP-ID.c b/e2sm/lib/MME-UE-S1AP-ID.c index 7677024..f24873c 100644 --- a/e2sm/lib/MME-UE-S1AP-ID.c +++ b/e2sm/lib/MME-UE-S1AP-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MME-UE-S1AP-ID.h" @@ -27,11 +27,18 @@ MME_UE_S1AP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MME_UE_S1AP_ID_constr_1 CC_NOTUSED = { + { 4, 1 } /* (0..4294967295) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MME_UE_S1AP_ID_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ const asn_INTEGER_specifics_t asn_SPC_MME_UE_S1AP_ID_specs_1 = { 0, 0, 0, 0, 0, 0, /* Native long size */ @@ -50,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_MME_UE_S1AP_ID = { asn_DEF_MME_UE_S1AP_ID_tags_1, /* Same as above */ sizeof(asn_DEF_MME_UE_S1AP_ID_tags_1) /sizeof(asn_DEF_MME_UE_S1AP_ID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MME_UE_S1AP_ID_constr_1, MME_UE_S1AP_ID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MME_UE_S1AP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MME_UE_S1AP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + MME_UE_S1AP_ID_constraint + }, 0, 0, /* No members */ &asn_SPC_MME_UE_S1AP_ID_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/MatchingCondItem.c b/e2sm/lib/MatchingCondItem.c index 89f4378..3dfe53c 100644 --- a/e2sm/lib/MatchingCondItem.c +++ b/e2sm/lib/MatchingCondItem.c @@ -1,26 +1,41 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MatchingCondItem.h" #include "MeasurementLabel.h" #include "TestCondInfo.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MatchingCondItem_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MatchingCondItem_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_MatchingCondItem_1[] = { { ATF_POINTER, 0, offsetof(struct MatchingCondItem, choice.measLabel), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementLabel, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measLabel" }, @@ -29,7 +44,15 @@ asn_TYPE_member_t asn_MBR_MatchingCondItem_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_TestCondInfo, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "testCondInfo" }, @@ -56,7 +79,15 @@ asn_TYPE_descriptor_t asn_DEF_MatchingCondItem = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_MatchingCondItem_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MatchingCondItem_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MatchingCondItem_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_MatchingCondItem_1, 2, /* Elements count */ &asn_SPC_MatchingCondItem_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MatchingCondList.c b/e2sm/lib/MatchingCondList.c index 7ccd78f..5292d9b 100644 --- a/e2sm/lib/MatchingCondList.c +++ b/e2sm/lib/MatchingCondList.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MatchingCondList.h" #include "MatchingCondItem.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MatchingCondList_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..32768)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MatchingCondList_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 15, 15, 1, 32768 } /* (SIZE(1..32768)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_MatchingCondList_1[] = { { ATF_POINTER, 0, 0, -1 /* Ambiguous tag (CHOICE?) */, 0, &asn_DEF_MatchingCondItem, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -42,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_MatchingCondList = { asn_DEF_MatchingCondList_tags_1, /* Same as above */ sizeof(asn_DEF_MatchingCondList_tags_1) /sizeof(asn_DEF_MatchingCondList_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MatchingCondList_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MatchingCondList_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MatchingCondList_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_MatchingCondList_1, 1, /* Single element */ &asn_SPC_MatchingCondList_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MatchingUEidItem.c b/e2sm/lib/MatchingUEidItem.c index 361848c..cc9245b 100644 --- a/e2sm/lib/MatchingUEidItem.c +++ b/e2sm/lib/MatchingUEidItem.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MatchingUEidItem.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_MatchingUEidItem_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_UEID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ueID" }, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_MatchingUEidItem = { asn_DEF_MatchingUEidItem_tags_1, /* Same as above */ sizeof(asn_DEF_MatchingUEidItem_tags_1) /sizeof(asn_DEF_MatchingUEidItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_MatchingUEidItem_1, 1, /* Elements count */ &asn_SPC_MatchingUEidItem_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MatchingUEidList.c b/e2sm/lib/MatchingUEidList.c index d01eaa2..1647f3f 100644 --- a/e2sm/lib/MatchingUEidList.c +++ b/e2sm/lib/MatchingUEidList.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MatchingUEidList.h" #include "MatchingUEidItem.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MatchingUEidList_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MatchingUEidList_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 1, 65535 } /* (SIZE(1..65535)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_MatchingUEidList_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_MatchingUEidItem, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -42,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_MatchingUEidList = { asn_DEF_MatchingUEidList_tags_1, /* Same as above */ sizeof(asn_DEF_MatchingUEidList_tags_1) /sizeof(asn_DEF_MatchingUEidList_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MatchingUEidList_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MatchingUEidList_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MatchingUEidList_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_MatchingUEidList_1, 1, /* Single element */ &asn_SPC_MatchingUEidList_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementCondItem.c b/e2sm/lib/MeasurementCondItem.c index 3d63e9d..18546a9 100644 --- a/e2sm/lib/MeasurementCondItem.c +++ b/e2sm/lib/MeasurementCondItem.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementCondItem.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_MeasurementCondItem_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_MeasurementType, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measType" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_MeasurementCondItem_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MatchingCondList, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "matchingCond" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementCondItem = { asn_DEF_MeasurementCondItem_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementCondItem_tags_1) /sizeof(asn_DEF_MeasurementCondItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_MeasurementCondItem_1, 2, /* Elements count */ &asn_SPC_MeasurementCondItem_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementCondList.c b/e2sm/lib/MeasurementCondList.c index 981bc8f..aa38feb 100644 --- a/e2sm/lib/MeasurementCondList.c +++ b/e2sm/lib/MeasurementCondList.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementCondList.h" #include "MeasurementCondItem.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MeasurementCondList_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MeasurementCondList_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 1, 65535 } /* (SIZE(1..65535)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_MeasurementCondList_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_MeasurementCondItem, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -42,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementCondList = { asn_DEF_MeasurementCondList_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementCondList_tags_1) /sizeof(asn_DEF_MeasurementCondList_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MeasurementCondList_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MeasurementCondList_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MeasurementCondList_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_MeasurementCondList_1, 1, /* Single element */ &asn_SPC_MeasurementCondList_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementCondUEidItem.c b/e2sm/lib/MeasurementCondUEidItem.c index e3a6fca..5763413 100644 --- a/e2sm/lib/MeasurementCondUEidItem.c +++ b/e2sm/lib/MeasurementCondUEidItem.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementCondUEidItem.h" @@ -14,7 +14,15 @@ asn_TYPE_member_t asn_MBR_MeasurementCondUEidItem_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_MeasurementType, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measType" }, @@ -23,7 +31,15 @@ asn_TYPE_member_t asn_MBR_MeasurementCondUEidItem_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MatchingCondList, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "matchingCond" }, @@ -32,7 +48,15 @@ asn_TYPE_member_t asn_MBR_MeasurementCondUEidItem_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MatchingUEidList, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "matchingUEidList" }, @@ -65,7 +89,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementCondUEidItem = { asn_DEF_MeasurementCondUEidItem_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementCondUEidItem_tags_1) /sizeof(asn_DEF_MeasurementCondUEidItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_MeasurementCondUEidItem_1, 3, /* Elements count */ &asn_SPC_MeasurementCondUEidItem_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementCondUEidList.c b/e2sm/lib/MeasurementCondUEidList.c index 8f9c71c..7a953fe 100644 --- a/e2sm/lib/MeasurementCondUEidList.c +++ b/e2sm/lib/MeasurementCondUEidList.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementCondUEidList.h" #include "MeasurementCondUEidItem.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MeasurementCondUEidList_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MeasurementCondUEidList_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 1, 65535 } /* (SIZE(1..65535)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_MeasurementCondUEidList_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_MeasurementCondUEidItem, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -42,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementCondUEidList = { asn_DEF_MeasurementCondUEidList_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementCondUEidList_tags_1) /sizeof(asn_DEF_MeasurementCondUEidList_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MeasurementCondUEidList_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MeasurementCondUEidList_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MeasurementCondUEidList_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_MeasurementCondUEidList_1, 1, /* Single element */ &asn_SPC_MeasurementCondUEidList_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementData.c b/e2sm/lib/MeasurementData.c index 0a6cb94..b6e3cbe 100644 --- a/e2sm/lib/MeasurementData.c +++ b/e2sm/lib/MeasurementData.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementData.h" #include "MeasurementDataItem.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MeasurementData_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MeasurementData_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 1, 65535 } /* (SIZE(1..65535)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_MeasurementData_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_MeasurementDataItem, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -42,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementData = { asn_DEF_MeasurementData_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementData_tags_1) /sizeof(asn_DEF_MeasurementData_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MeasurementData_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MeasurementData_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MeasurementData_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_MeasurementData_1, 1, /* Single element */ &asn_SPC_MeasurementData_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementDataItem.c b/e2sm/lib/MeasurementDataItem.c index 4c3ad22..063c3b1 100644 --- a/e2sm/lib/MeasurementDataItem.c +++ b/e2sm/lib/MeasurementDataItem.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementDataItem.h" @@ -11,11 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_incompleteFlag_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_incompleteFlag_constr_3 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_incompleteFlag_value2enum_3[] = { { 0, 4, "true" } /* This list is extensible */ @@ -48,7 +55,15 @@ asn_TYPE_descriptor_t asn_DEF_incompleteFlag_3 = { asn_DEF_incompleteFlag_tags_3, /* Same as above */ sizeof(asn_DEF_incompleteFlag_tags_3) /sizeof(asn_DEF_incompleteFlag_tags_3[0]), /* 2 */ - { 0, &asn_PER_type_incompleteFlag_constr_3, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_incompleteFlag_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_incompleteFlag_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_incompleteFlag_specs_3 /* Additional specs */ }; @@ -59,7 +74,15 @@ asn_TYPE_member_t asn_MBR_MeasurementDataItem_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementRecord, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measRecord" }, @@ -68,7 +91,15 @@ asn_TYPE_member_t asn_MBR_MeasurementDataItem_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_incompleteFlag_3, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "incompleteFlag" }, @@ -100,7 +131,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementDataItem = { asn_DEF_MeasurementDataItem_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementDataItem_tags_1) /sizeof(asn_DEF_MeasurementDataItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_MeasurementDataItem_1, 2, /* Elements count */ &asn_SPC_MeasurementDataItem_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementInfo-Action-Item.c b/e2sm/lib/MeasurementInfo-Action-Item.c index 76f69bd..7dc6d2c 100644 --- a/e2sm/lib/MeasurementInfo-Action-Item.c +++ b/e2sm/lib/MeasurementInfo-Action-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementInfo-Action-Item.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_MeasurementInfo_Action_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementTypeName, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measName" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_MeasurementInfo_Action_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementTypeID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measID" }, @@ -54,7 +70,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementInfo_Action_Item = { asn_DEF_MeasurementInfo_Action_Item_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementInfo_Action_Item_tags_1) /sizeof(asn_DEF_MeasurementInfo_Action_Item_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_MeasurementInfo_Action_Item_1, 2, /* Elements count */ &asn_SPC_MeasurementInfo_Action_Item_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementInfo-Action-List.c b/e2sm/lib/MeasurementInfo-Action-List.c index 19eb2cb..65611d1 100644 --- a/e2sm/lib/MeasurementInfo-Action-List.c +++ b/e2sm/lib/MeasurementInfo-Action-List.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementInfo-Action-List.h" #include "MeasurementInfo-Action-Item.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MeasurementInfo_Action_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MeasurementInfo_Action_List_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 1, 65535 } /* (SIZE(1..65535)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_MeasurementInfo_Action_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_MeasurementInfo_Action_Item, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -42,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementInfo_Action_List = { asn_DEF_MeasurementInfo_Action_List_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementInfo_Action_List_tags_1) /sizeof(asn_DEF_MeasurementInfo_Action_List_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MeasurementInfo_Action_List_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MeasurementInfo_Action_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MeasurementInfo_Action_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_MeasurementInfo_Action_List_1, 1, /* Single element */ &asn_SPC_MeasurementInfo_Action_List_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementInfoItem.c b/e2sm/lib/MeasurementInfoItem.c index a3f9433..3d770f7 100644 --- a/e2sm/lib/MeasurementInfoItem.c +++ b/e2sm/lib/MeasurementInfoItem.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementInfoItem.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_MeasurementInfoItem_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_MeasurementType, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measType" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_MeasurementInfoItem_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_LabelInfoList, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "labelInfoList" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementInfoItem = { asn_DEF_MeasurementInfoItem_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementInfoItem_tags_1) /sizeof(asn_DEF_MeasurementInfoItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_MeasurementInfoItem_1, 2, /* Elements count */ &asn_SPC_MeasurementInfoItem_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementInfoList.c b/e2sm/lib/MeasurementInfoList.c index c3861f2..22a1324 100644 --- a/e2sm/lib/MeasurementInfoList.c +++ b/e2sm/lib/MeasurementInfoList.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementInfoList.h" #include "MeasurementInfoItem.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MeasurementInfoList_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MeasurementInfoList_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 1, 65535 } /* (SIZE(1..65535)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_MeasurementInfoList_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_MeasurementInfoItem, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -42,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementInfoList = { asn_DEF_MeasurementInfoList_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementInfoList_tags_1) /sizeof(asn_DEF_MeasurementInfoList_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MeasurementInfoList_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MeasurementInfoList_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MeasurementInfoList_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_MeasurementInfoList_1, 1, /* Single element */ &asn_SPC_MeasurementInfoList_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementLabel.c b/e2sm/lib/MeasurementLabel.c index 6283b1c..6b12042 100644 --- a/e2sm/lib/MeasurementLabel.c +++ b/e2sm/lib/MeasurementLabel.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementLabel.h" @@ -50,7 +50,7 @@ memb_aRPmax_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 1 && value <= 15)) { + if((value >= 1L && value <= 15L)) { /* Constraint check succeeded */ return 0; } else { @@ -75,7 +75,7 @@ memb_aRPmin_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 1 && value <= 15)) { + if((value >= 1L && value <= 15L)) { /* Constraint check succeeded */ return 0; } else { @@ -100,7 +100,7 @@ memb_bitrateRange_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr value = *(const long *)sptr; - if((value >= 1 && value <= 65535)) { + if((value >= 1L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -125,7 +125,7 @@ memb_layerMU_MIMO_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr value = *(const long *)sptr; - if((value >= 1 && value <= 65535)) { + if((value >= 1L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -150,7 +150,7 @@ memb_distBinX_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 1 && value <= 65535)) { + if((value >= 1L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -175,7 +175,7 @@ memb_distBinY_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 1 && value <= 65535)) { + if((value >= 1L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -200,7 +200,7 @@ memb_distBinZ_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 1 && value <= 65535)) { + if((value >= 1L && value <= 65535L)) { /* Constraint check succeeded */ return 0; } else { @@ -211,76 +211,174 @@ memb_distBinZ_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, } } +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_noLabel_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_noLabel_constr_2 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_sUM_constr_16 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_sUM_constr_16 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_preLabelOverride_constr_22 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_preLabelOverride_constr_22 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_startEndInd_constr_25 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_startEndInd_constr_25 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_min_constr_29 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_min_constr_29 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_max_constr_32 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_max_constr_32 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_avg_constr_35 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_avg_constr_35 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_aRPmax_constr_12 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_aRPmax_constr_12 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 4, 4, 1, 15 } /* (1..15,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_aRPmin_constr_13 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_aRPmin_constr_13 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 4, 4, 1, 15 } /* (1..15,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_bitrateRange_constr_14 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_bitrateRange_constr_14 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 16, 16, 1, 65535 } /* (1..65535,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_layerMU_MIMO_constr_15 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_layerMU_MIMO_constr_15 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 16, 16, 1, 65535 } /* (1..65535,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_distBinX_constr_19 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_distBinX_constr_19 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 16, 16, 1, 65535 } /* (1..65535,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_distBinY_constr_20 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_distBinY_constr_20 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 16, 16, 1, 65535 } /* (1..65535,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_distBinZ_constr_21 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_distBinZ_constr_21 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 16, 16, 1, 65535 } /* (1..65535,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_noLabel_value2enum_2[] = { { 0, 4, "true" } /* This list is extensible */ @@ -313,7 +411,15 @@ asn_TYPE_descriptor_t asn_DEF_noLabel_2 = { asn_DEF_noLabel_tags_2, /* Same as above */ sizeof(asn_DEF_noLabel_tags_2) /sizeof(asn_DEF_noLabel_tags_2[0]), /* 2 */ - { 0, &asn_PER_type_noLabel_constr_2, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_noLabel_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_noLabel_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_noLabel_specs_2 /* Additional specs */ }; @@ -350,7 +456,15 @@ asn_TYPE_descriptor_t asn_DEF_sUM_16 = { asn_DEF_sUM_tags_16, /* Same as above */ sizeof(asn_DEF_sUM_tags_16) /sizeof(asn_DEF_sUM_tags_16[0]), /* 2 */ - { 0, &asn_PER_type_sUM_constr_16, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_sUM_constr_16, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_sUM_constr_16, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_sUM_specs_16 /* Additional specs */ }; @@ -387,7 +501,15 @@ asn_TYPE_descriptor_t asn_DEF_preLabelOverride_22 = { asn_DEF_preLabelOverride_tags_22, /* Same as above */ sizeof(asn_DEF_preLabelOverride_tags_22) /sizeof(asn_DEF_preLabelOverride_tags_22[0]), /* 2 */ - { 0, &asn_PER_type_preLabelOverride_constr_22, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_preLabelOverride_constr_22, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_preLabelOverride_constr_22, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_preLabelOverride_specs_22 /* Additional specs */ }; @@ -426,7 +548,15 @@ asn_TYPE_descriptor_t asn_DEF_startEndInd_25 = { asn_DEF_startEndInd_tags_25, /* Same as above */ sizeof(asn_DEF_startEndInd_tags_25) /sizeof(asn_DEF_startEndInd_tags_25[0]), /* 2 */ - { 0, &asn_PER_type_startEndInd_constr_25, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_startEndInd_constr_25, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_startEndInd_constr_25, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_startEndInd_specs_25 /* Additional specs */ }; @@ -463,7 +593,15 @@ asn_TYPE_descriptor_t asn_DEF_min_29 = { asn_DEF_min_tags_29, /* Same as above */ sizeof(asn_DEF_min_tags_29) /sizeof(asn_DEF_min_tags_29[0]), /* 2 */ - { 0, &asn_PER_type_min_constr_29, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_min_constr_29, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_min_constr_29, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_min_specs_29 /* Additional specs */ }; @@ -500,7 +638,15 @@ asn_TYPE_descriptor_t asn_DEF_max_32 = { asn_DEF_max_tags_32, /* Same as above */ sizeof(asn_DEF_max_tags_32) /sizeof(asn_DEF_max_tags_32[0]), /* 2 */ - { 0, &asn_PER_type_max_constr_32, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_max_constr_32, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_max_constr_32, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_max_specs_32 /* Additional specs */ }; @@ -537,7 +683,15 @@ asn_TYPE_descriptor_t asn_DEF_avg_35 = { asn_DEF_avg_tags_35, /* Same as above */ sizeof(asn_DEF_avg_tags_35) /sizeof(asn_DEF_avg_tags_35[0]), /* 2 */ - { 0, &asn_PER_type_avg_constr_35, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_avg_constr_35, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_avg_constr_35, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_avg_specs_35 /* Additional specs */ }; @@ -548,7 +702,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_noLabel_2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "noLabel" }, @@ -557,7 +719,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMNIdentity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "plmnID" }, @@ -566,7 +736,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_S_NSSAI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "sliceID" }, @@ -575,7 +753,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_FiveQI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "fiveQI" }, @@ -584,7 +770,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_QosFlowIdentifier, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "qFI" }, @@ -593,7 +787,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_QCI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "qCI" }, @@ -602,7 +804,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_QCI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "qCImax" }, @@ -611,7 +821,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_QCI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "qCImin" }, @@ -620,7 +838,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, &asn_PER_memb_aRPmax_constr_12, memb_aRPmax_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_aRPmax_constr_12, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_aRPmax_constr_12, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_aRPmax_constraint_1 + }, 0, 0, /* No default value */ "aRPmax" }, @@ -629,7 +855,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, &asn_PER_memb_aRPmin_constr_13, memb_aRPmin_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_aRPmin_constr_13, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_aRPmin_constr_13, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_aRPmin_constraint_1 + }, 0, 0, /* No default value */ "aRPmin" }, @@ -638,7 +872,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, &asn_PER_memb_bitrateRange_constr_14, memb_bitrateRange_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_bitrateRange_constr_14, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_bitrateRange_constr_14, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_bitrateRange_constraint_1 + }, 0, 0, /* No default value */ "bitrateRange" }, @@ -647,7 +889,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, &asn_PER_memb_layerMU_MIMO_constr_15, memb_layerMU_MIMO_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_layerMU_MIMO_constr_15, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_layerMU_MIMO_constr_15, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_layerMU_MIMO_constraint_1 + }, 0, 0, /* No default value */ "layerMU-MIMO" }, @@ -656,7 +906,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_sUM_16, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "sUM" }, @@ -665,7 +923,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, &asn_PER_memb_distBinX_constr_19, memb_distBinX_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_distBinX_constr_19, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_distBinX_constr_19, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_distBinX_constraint_1 + }, 0, 0, /* No default value */ "distBinX" }, @@ -674,7 +940,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, &asn_PER_memb_distBinY_constr_20, memb_distBinY_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_distBinY_constr_20, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_distBinY_constr_20, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_distBinY_constraint_1 + }, 0, 0, /* No default value */ "distBinY" }, @@ -683,7 +957,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, &asn_PER_memb_distBinZ_constr_21, memb_distBinZ_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_distBinZ_constr_21, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_distBinZ_constr_21, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_distBinZ_constraint_1 + }, 0, 0, /* No default value */ "distBinZ" }, @@ -692,7 +974,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_preLabelOverride_22, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "preLabelOverride" }, @@ -701,7 +991,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_startEndInd_25, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "startEndInd" }, @@ -710,7 +1008,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_min_29, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "min" }, @@ -719,7 +1025,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_max_32, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "max" }, @@ -728,7 +1042,15 @@ asn_TYPE_member_t asn_MBR_MeasurementLabel_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_avg_35, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "avg" }, @@ -779,7 +1101,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementLabel = { asn_DEF_MeasurementLabel_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementLabel_tags_1) /sizeof(asn_DEF_MeasurementLabel_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_MeasurementLabel_1, 21, /* Elements count */ &asn_SPC_MeasurementLabel_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementRecord.c b/e2sm/lib/MeasurementRecord.c index e8bdb53..8885f9e 100644 --- a/e2sm/lib/MeasurementRecord.c +++ b/e2sm/lib/MeasurementRecord.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementRecord.h" #include "MeasurementRecordItem.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MeasurementRecord_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..2147483647)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MeasurementRecord_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 31, -1, 1, 2147483647 } /* (SIZE(1..2147483647)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_MeasurementRecord_1[] = { { ATF_POINTER, 0, 0, -1 /* Ambiguous tag (CHOICE?) */, 0, &asn_DEF_MeasurementRecordItem, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -42,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementRecord = { asn_DEF_MeasurementRecord_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementRecord_tags_1) /sizeof(asn_DEF_MeasurementRecord_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MeasurementRecord_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MeasurementRecord_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MeasurementRecord_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_MeasurementRecord_1, 1, /* Single element */ &asn_SPC_MeasurementRecord_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementRecordItem.c b/e2sm/lib/MeasurementRecordItem.c index d415c59..487ead6 100644 --- a/e2sm/lib/MeasurementRecordItem.c +++ b/e2sm/lib/MeasurementRecordItem.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementRecordItem.h" @@ -43,21 +43,42 @@ memb_integer_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, return 0; } +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_integer_constr_2 CC_NOTUSED = { + { 4, 1 } /* (0..4294967295) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_integer_constr_2 CC_NOTUSED = { { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_integer_constr_2 CC_NOTUSED = { + { 4, 1 } /* (0..4294967295) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_integer_constr_2 CC_NOTUSED = { { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MeasurementRecordItem_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MeasurementRecordItem_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_specifics_t asn_SPC_integer_specs_2 = { 0, 0, 0, 0, 0, 0, /* Native long size */ @@ -78,7 +99,15 @@ asn_TYPE_descriptor_t asn_DEF_integer_2 = { asn_DEF_integer_tags_2, /* Same as above */ sizeof(asn_DEF_integer_tags_2) /sizeof(asn_DEF_integer_tags_2[0]), /* 2 */ - { 0, &asn_PER_type_integer_constr_2, integer_2_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_integer_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_integer_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + integer_2_constraint + }, 0, 0, /* No members */ &asn_SPC_integer_specs_2 /* Additional specs */ }; @@ -89,7 +118,15 @@ asn_TYPE_member_t asn_MBR_MeasurementRecordItem_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_integer_2, 0, - { 0, &asn_PER_memb_integer_constr_2, memb_integer_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_integer_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_integer_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_integer_constraint_1 + }, 0, 0, /* No default value */ "integer" }, @@ -98,7 +135,15 @@ asn_TYPE_member_t asn_MBR_MeasurementRecordItem_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeReal, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "real" }, @@ -107,7 +152,15 @@ asn_TYPE_member_t asn_MBR_MeasurementRecordItem_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "noValue" }, @@ -135,7 +188,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementRecordItem = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_MeasurementRecordItem_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MeasurementRecordItem_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MeasurementRecordItem_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_MeasurementRecordItem_1, 3, /* Elements count */ &asn_SPC_MeasurementRecordItem_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementType.c b/e2sm/lib/MeasurementType.c index e3f65c9..2392989 100644 --- a/e2sm/lib/MeasurementType.c +++ b/e2sm/lib/MeasurementType.c @@ -1,24 +1,39 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementType.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MeasurementType_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MeasurementType_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_MeasurementType_1[] = { { ATF_NOFLAGS, 0, offsetof(struct MeasurementType, choice.measName), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementTypeName, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measName" }, @@ -27,7 +42,15 @@ asn_TYPE_member_t asn_MBR_MeasurementType_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementTypeID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measID" }, @@ -54,7 +77,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementType = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_MeasurementType_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MeasurementType_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MeasurementType_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_MeasurementType_1, 2, /* Elements count */ &asn_SPC_MeasurementType_specs_1 /* Additional specs */ diff --git a/e2sm/lib/MeasurementTypeID.c b/e2sm/lib/MeasurementTypeID.c index 9efb8ec..308db3a 100644 --- a/e2sm/lib/MeasurementTypeID.c +++ b/e2sm/lib/MeasurementTypeID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementTypeID.h" @@ -21,7 +21,7 @@ MeasurementTypeID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 1 && value <= 65536)) { + if((value >= 1L && value <= 65536L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ MeasurementTypeID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MeasurementTypeID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MeasurementTypeID_constr_1 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 16, -1, 1, 65536 } /* (1..65536,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_MeasurementTypeID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementTypeID = { asn_DEF_MeasurementTypeID_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementTypeID_tags_1) /sizeof(asn_DEF_MeasurementTypeID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MeasurementTypeID_constr_1, MeasurementTypeID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MeasurementTypeID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MeasurementTypeID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + MeasurementTypeID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/MeasurementTypeName.c b/e2sm/lib/MeasurementTypeName.c index 978f59c..961108b 100644 --- a/e2sm/lib/MeasurementTypeName.c +++ b/e2sm/lib/MeasurementTypeName.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "MeasurementTypeName.h" @@ -54,7 +54,7 @@ MeasurementTypeName_constraint(const asn_TYPE_descriptor_t *td, const void *sptr size = st->size; - if((size >= 1 && size <= 150) + if((size >= 1UL && size <= 150UL) && !check_permitted_alphabet_1(st)) { /* Constraint check succeeded */ return 0; @@ -80,12 +80,19 @@ static int asn_PER_MAP_MeasurementTypeName_1_c2v(unsigned int code) { * This type is implemented using PrintableString, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_MeasurementTypeName_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_MeasurementTypeName_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_MeasurementTypeName_1_v2c, /* Value to PER code map */ asn_PER_MAP_MeasurementTypeName_1_c2v /* PER code to value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_MeasurementTypeName_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)) }; @@ -99,7 +106,15 @@ asn_TYPE_descriptor_t asn_DEF_MeasurementTypeName = { asn_DEF_MeasurementTypeName_tags_1, /* Same as above */ sizeof(asn_DEF_MeasurementTypeName_tags_1) /sizeof(asn_DEF_MeasurementTypeName_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_MeasurementTypeName_constr_1, MeasurementTypeName_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_MeasurementTypeName_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_MeasurementTypeName_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + MeasurementTypeName_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/NG-RANnodeUEXnAPID.c b/e2sm/lib/NG-RANnodeUEXnAPID.c index 1541b4e..bb21b01 100644 --- a/e2sm/lib/NG-RANnodeUEXnAPID.c +++ b/e2sm/lib/NG-RANnodeUEXnAPID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "NG-RANnodeUEXnAPID.h" @@ -27,11 +27,18 @@ NG_RANnodeUEXnAPID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_NG_RANnodeUEXnAPID_constr_1 CC_NOTUSED = { + { 4, 1 } /* (0..4294967295) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_NG_RANnodeUEXnAPID_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ const asn_INTEGER_specifics_t asn_SPC_NG_RANnodeUEXnAPID_specs_1 = { 0, 0, 0, 0, 0, 0, /* Native long size */ @@ -50,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_NG_RANnodeUEXnAPID = { asn_DEF_NG_RANnodeUEXnAPID_tags_1, /* Same as above */ sizeof(asn_DEF_NG_RANnodeUEXnAPID_tags_1) /sizeof(asn_DEF_NG_RANnodeUEXnAPID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_NG_RANnodeUEXnAPID_constr_1, NG_RANnodeUEXnAPID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_NG_RANnodeUEXnAPID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_NG_RANnodeUEXnAPID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NG_RANnodeUEXnAPID_constraint + }, 0, 0, /* No members */ &asn_SPC_NG_RANnodeUEXnAPID_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/NGENB-CU-UE-W1AP-ID.c b/e2sm/lib/NGENB-CU-UE-W1AP-ID.c index 2859907..7526f9b 100644 --- a/e2sm/lib/NGENB-CU-UE-W1AP-ID.c +++ b/e2sm/lib/NGENB-CU-UE-W1AP-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "NGENB-CU-UE-W1AP-ID.h" @@ -27,11 +27,18 @@ NGENB_CU_UE_W1AP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_NGENB_CU_UE_W1AP_ID_constr_1 CC_NOTUSED = { + { 4, 1 } /* (0..4294967295) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_NGENB_CU_UE_W1AP_ID_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ const asn_INTEGER_specifics_t asn_SPC_NGENB_CU_UE_W1AP_ID_specs_1 = { 0, 0, 0, 0, 0, 0, /* Native long size */ @@ -50,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_NGENB_CU_UE_W1AP_ID = { asn_DEF_NGENB_CU_UE_W1AP_ID_tags_1, /* Same as above */ sizeof(asn_DEF_NGENB_CU_UE_W1AP_ID_tags_1) /sizeof(asn_DEF_NGENB_CU_UE_W1AP_ID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_NGENB_CU_UE_W1AP_ID_constr_1, NGENB_CU_UE_W1AP_ID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_NGENB_CU_UE_W1AP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_NGENB_CU_UE_W1AP_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NGENB_CU_UE_W1AP_ID_constraint + }, 0, 0, /* No members */ &asn_SPC_NGENB_CU_UE_W1AP_ID_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/NGENB-DU-ID.c b/e2sm/lib/NGENB-DU-ID.c index 5bfea48..c1e9f04 100644 --- a/e2sm/lib/NGENB-DU-ID.c +++ b/e2sm/lib/NGENB-DU-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "NGENB-DU-ID.h" @@ -27,7 +27,7 @@ NGENB_DU_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if((value >= 0 && value <= 68719476735)) { + if((value >= 0L && value <= 68719476735L)) { /* Constraint check succeeded */ return 0; } else { @@ -42,11 +42,18 @@ NGENB_DU_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using INTEGER, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_NGENB_DU_ID_constr_1 CC_NOTUSED = { + { 8, 1 } /* (0..68719476735) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_NGENB_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_NGENB_DU_ID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -60,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_NGENB_DU_ID = { asn_DEF_NGENB_DU_ID_tags_1, /* Same as above */ sizeof(asn_DEF_NGENB_DU_ID_tags_1) /sizeof(asn_DEF_NGENB_DU_ID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_NGENB_DU_ID_constr_1, NGENB_DU_ID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_NGENB_DU_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_NGENB_DU_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NGENB_DU_ID_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/NI-Type.c b/e2sm/lib/NI-Type.c deleted file mode 100644 index 7045c05..0000000 --- a/e2sm/lib/NI-Type.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/NR-ARFCN.c b/e2sm/lib/NR-ARFCN.c index 166f4f6..9d34d5b 100644 --- a/e2sm/lib/NR-ARFCN.c +++ b/e2sm/lib/NR-ARFCN.c @@ -1,12 +1,13 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "NR-ARFCN.h" +#include "FreqBandNrItem.h" static int memb_nRARFCN_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { @@ -21,7 +22,7 @@ memb_nRARFCN_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 3279165)) { + if((value >= 0L && value <= 3279165L)) { /* Constraint check succeeded */ return 0; } else { @@ -32,35 +33,171 @@ memb_nRARFCN_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, } } +static int +memb_freqBandListNr_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 >= 1UL && size <= 32UL)) { + /* Perform validation of the inner elements */ + return SEQUENCE_OF_constraint(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_freqBandListNr_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..32)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_type_freqBandListNr_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_nRARFCN_constr_2 CC_NOTUSED = { + { 4, 1 } /* (0..3279165) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_nRARFCN_constr_2 CC_NOTUSED = { { APC_CONSTRAINED, 22, -1, 0, 3279165 } /* (0..3279165) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_freqBandListNr_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..32)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +static asn_per_constraints_t asn_PER_memb_freqBandListNr_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, + 0, 0 /* No PER value map */ +}; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +static asn_TYPE_member_t asn_MBR_freqBandListNr_3[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_FreqBandNrItem, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_freqBandListNr_tags_3[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_freqBandListNr_specs_3 = { + sizeof(struct NR_ARFCN__freqBandListNr), + offsetof(struct NR_ARFCN__freqBandListNr, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_freqBandListNr_3 = { + "freqBandListNr", + "freqBandListNr", + &asn_OP_SEQUENCE_OF, + asn_DEF_freqBandListNr_tags_3, + sizeof(asn_DEF_freqBandListNr_tags_3) + /sizeof(asn_DEF_freqBandListNr_tags_3[0]) - 1, /* 1 */ + asn_DEF_freqBandListNr_tags_3, /* Same as above */ + sizeof(asn_DEF_freqBandListNr_tags_3) + /sizeof(asn_DEF_freqBandListNr_tags_3[0]), /* 2 */ + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_freqBandListNr_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_freqBandListNr_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, + asn_MBR_freqBandListNr_3, + 1, /* Single element */ + &asn_SPC_freqBandListNr_specs_3 /* Additional specs */ +}; + asn_TYPE_member_t asn_MBR_NR_ARFCN_1[] = { { ATF_NOFLAGS, 0, offsetof(struct NR_ARFCN, nRARFCN), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, &asn_PER_memb_nRARFCN_constr_2, memb_nRARFCN_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_nRARFCN_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_nRARFCN_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_nRARFCN_constraint_1 + }, 0, 0, /* No default value */ "nRARFCN" }, + { ATF_NOFLAGS, 0, offsetof(struct NR_ARFCN, freqBandListNr), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + 0, + &asn_DEF_freqBandListNr_3, + 0, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_freqBandListNr_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_freqBandListNr_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_freqBandListNr_constraint_1 + }, + 0, 0, /* No default value */ + "freqBandListNr" + }, }; static const ber_tlv_tag_t asn_DEF_NR_ARFCN_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static const asn_TYPE_tag2member_t asn_MAP_NR_ARFCN_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* nRARFCN */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nRARFCN */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* freqBandListNr */ }; asn_SEQUENCE_specifics_t asn_SPC_NR_ARFCN_specs_1 = { sizeof(struct NR_ARFCN), offsetof(struct NR_ARFCN, _asn_ctx), asn_MAP_NR_ARFCN_tag2el_1, - 1, /* Count of tags in the map */ + 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ - 1, /* First extension addition */ + 2, /* First extension addition */ }; asn_TYPE_descriptor_t asn_DEF_NR_ARFCN = { "NR-ARFCN", @@ -72,9 +209,17 @@ asn_TYPE_descriptor_t asn_DEF_NR_ARFCN = { asn_DEF_NR_ARFCN_tags_1, /* Same as above */ sizeof(asn_DEF_NR_ARFCN_tags_1) /sizeof(asn_DEF_NR_ARFCN_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_NR_ARFCN_1, - 1, /* Elements count */ + 2, /* Elements count */ &asn_SPC_NR_ARFCN_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/NR-CGI.c b/e2sm/lib/NR-CGI.c index d5cb1c4..7306f48 100644 --- a/e2sm/lib/NR-CGI.c +++ b/e2sm/lib/NR-CGI.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "NR-CGI.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_NR_CGI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PLMNIdentity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "pLMNIdentity" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_NR_CGI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NRCellIdentity, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "nRCellIdentity" }, @@ -52,7 +68,15 @@ asn_TYPE_descriptor_t asn_DEF_NR_CGI = { asn_DEF_NR_CGI_tags_1, /* Same as above */ sizeof(asn_DEF_NR_CGI_tags_1) /sizeof(asn_DEF_NR_CGI_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_NR_CGI_1, 2, /* Elements count */ &asn_SPC_NR_CGI_specs_1 /* Additional specs */ diff --git a/e2sm/lib/NR-PCI.c b/e2sm/lib/NR-PCI.c index 8a0f74a..a7c8d05 100644 --- a/e2sm/lib/NR-PCI.c +++ b/e2sm/lib/NR-PCI.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "NR-PCI.h" @@ -21,7 +21,7 @@ NR_PCI_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 1007)) { + if((value >= 0L && value <= 1007L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ NR_PCI_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_NR_PCI_constr_1 CC_NOTUSED = { + { 2, 1 } /* (0..1007) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_NR_PCI_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 10, 10, 0, 1007 } /* (0..1007) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_NR_PCI_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_NR_PCI = { asn_DEF_NR_PCI_tags_1, /* Same as above */ sizeof(asn_DEF_NR_PCI_tags_1) /sizeof(asn_DEF_NR_PCI_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_NR_PCI_constr_1, NR_PCI_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_NR_PCI_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_NR_PCI_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NR_PCI_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/NRCGI.c b/e2sm/lib/NRCGI.c deleted file mode 100644 index 74780d4..0000000 --- a/e2sm/lib/NRCGI.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/NRCellIdentity.c b/e2sm/lib/NRCellIdentity.c index 601fd16..7356d89 100644 --- a/e2sm/lib/NRCellIdentity.c +++ b/e2sm/lib/NRCellIdentity.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "NRCellIdentity.h" @@ -27,7 +27,7 @@ NRCellIdentity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = 0; } - if((size == 36)) { + if((size == 36UL)) { /* Constraint check succeeded */ return 0; } else { @@ -42,11 +42,18 @@ NRCellIdentity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_NRCellIdentity_constr_1 CC_NOTUSED = { + { 0, 0 }, + 36 /* (SIZE(36..36)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_NRCellIdentity_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; @@ -60,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_NRCellIdentity = { asn_DEF_NRCellIdentity_tags_1, /* Same as above */ sizeof(asn_DEF_NRCellIdentity_tags_1) /sizeof(asn_DEF_NRCellIdentity_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_NRCellIdentity_constr_1, NRCellIdentity_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_NRCellIdentity_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_NRCellIdentity_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NRCellIdentity_constraint + }, 0, 0, /* No members */ &asn_SPC_BIT_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/NRFrequencyBand-List.c b/e2sm/lib/NRFrequencyBand-List.c deleted file mode 100644 index 3245541..0000000 --- a/e2sm/lib/NRFrequencyBand-List.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#include "NRFrequencyBand-List.h" - -#include "NRFrequencyBandItem.h" -asn_per_constraints_t asn_PER_type_NRFrequencyBand_List_constr_1 CC_NOTUSED = { - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, - 0, 0 /* No PER value map */ -}; -asn_TYPE_member_t asn_MBR_NRFrequencyBand_List_1[] = { - { ATF_POINTER, 0, 0, - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - 0, - &asn_DEF_NRFrequencyBandItem, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "" - }, -}; -static const ber_tlv_tag_t asn_DEF_NRFrequencyBand_List_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -asn_SET_OF_specifics_t asn_SPC_NRFrequencyBand_List_specs_1 = { - sizeof(struct NRFrequencyBand_List), - offsetof(struct NRFrequencyBand_List, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ -}; -asn_TYPE_descriptor_t asn_DEF_NRFrequencyBand_List = { - "NRFrequencyBand-List", - "NRFrequencyBand-List", - &asn_OP_SEQUENCE_OF, - asn_DEF_NRFrequencyBand_List_tags_1, - sizeof(asn_DEF_NRFrequencyBand_List_tags_1) - /sizeof(asn_DEF_NRFrequencyBand_List_tags_1[0]), /* 1 */ - asn_DEF_NRFrequencyBand_List_tags_1, /* Same as above */ - sizeof(asn_DEF_NRFrequencyBand_List_tags_1) - /sizeof(asn_DEF_NRFrequencyBand_List_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_NRFrequencyBand_List_constr_1, SEQUENCE_OF_constraint }, - asn_MBR_NRFrequencyBand_List_1, - 1, /* Single element */ - &asn_SPC_NRFrequencyBand_List_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/NRFrequencyBandItem.c b/e2sm/lib/NRFrequencyBandItem.c deleted file mode 100644 index 1d2f2bc..0000000 --- a/e2sm/lib/NRFrequencyBandItem.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#include "NRFrequencyBandItem.h" - -static int -memb_freqBandIndicatorNr_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 >= 1 && value <= 1024)) { - /* 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_per_constraints_t asn_PER_memb_freqBandIndicatorNr_constr_2 CC_NOTUSED = { - { APC_CONSTRAINED | APC_EXTENSIBLE, 10, 10, 1, 1024 } /* (1..1024,...) */, - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - 0, 0 /* No PER value map */ -}; -asn_TYPE_member_t asn_MBR_NRFrequencyBandItem_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct NRFrequencyBandItem, freqBandIndicatorNr), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_NativeInteger, - 0, - { 0, &asn_PER_memb_freqBandIndicatorNr_constr_2, memb_freqBandIndicatorNr_constraint_1 }, - 0, 0, /* No default value */ - "freqBandIndicatorNr" - }, - { ATF_NOFLAGS, 0, offsetof(struct NRFrequencyBandItem, supportedSULBandList), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_SupportedSULBandList, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "supportedSULBandList" - }, -}; -static const ber_tlv_tag_t asn_DEF_NRFrequencyBandItem_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_NRFrequencyBandItem_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* freqBandIndicatorNr */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* supportedSULBandList */ -}; -asn_SEQUENCE_specifics_t asn_SPC_NRFrequencyBandItem_specs_1 = { - sizeof(struct NRFrequencyBandItem), - offsetof(struct NRFrequencyBandItem, _asn_ctx), - asn_MAP_NRFrequencyBandItem_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_NRFrequencyBandItem = { - "NRFrequencyBandItem", - "NRFrequencyBandItem", - &asn_OP_SEQUENCE, - asn_DEF_NRFrequencyBandItem_tags_1, - sizeof(asn_DEF_NRFrequencyBandItem_tags_1) - /sizeof(asn_DEF_NRFrequencyBandItem_tags_1[0]), /* 1 */ - asn_DEF_NRFrequencyBandItem_tags_1, /* Same as above */ - sizeof(asn_DEF_NRFrequencyBandItem_tags_1) - /sizeof(asn_DEF_NRFrequencyBandItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_NRFrequencyBandItem_1, - 2, /* Elements count */ - &asn_SPC_NRFrequencyBandItem_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/NRFrequencyInfo.c b/e2sm/lib/NRFrequencyInfo.c deleted file mode 100644 index dfc4dbb..0000000 --- a/e2sm/lib/NRFrequencyInfo.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#include "NRFrequencyInfo.h" - -static asn_TYPE_member_t asn_MBR_NRFrequencyInfo_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct NRFrequencyInfo, nrARFCN), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_NR_ARFCN, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "nrARFCN" - }, - { ATF_NOFLAGS, 0, offsetof(struct NRFrequencyInfo, frequencyBand_List), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_NRFrequencyBand_List, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "frequencyBand-List" - }, - { ATF_POINTER, 1, offsetof(struct NRFrequencyInfo, frequencyShift7p5khz), - (ASN_TAG_CLASS_CONTEXT | (2 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_NRFrequencyShift7p5khz, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "frequencyShift7p5khz" - }, -}; -static const int asn_MAP_NRFrequencyInfo_oms_1[] = { 2 }; -static const ber_tlv_tag_t asn_DEF_NRFrequencyInfo_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_NRFrequencyInfo_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nrARFCN */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* frequencyBand-List */ - { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* frequencyShift7p5khz */ -}; -static asn_SEQUENCE_specifics_t asn_SPC_NRFrequencyInfo_specs_1 = { - sizeof(struct NRFrequencyInfo), - offsetof(struct NRFrequencyInfo, _asn_ctx), - asn_MAP_NRFrequencyInfo_tag2el_1, - 3, /* Count of tags in the map */ - asn_MAP_NRFrequencyInfo_oms_1, /* Optional members */ - 1, 0, /* Root/Additions */ - 3, /* First extension addition */ -}; -asn_TYPE_descriptor_t asn_DEF_NRFrequencyInfo = { - "NRFrequencyInfo", - "NRFrequencyInfo", - &asn_OP_SEQUENCE, - asn_DEF_NRFrequencyInfo_tags_1, - sizeof(asn_DEF_NRFrequencyInfo_tags_1) - /sizeof(asn_DEF_NRFrequencyInfo_tags_1[0]), /* 1 */ - asn_DEF_NRFrequencyInfo_tags_1, /* Same as above */ - sizeof(asn_DEF_NRFrequencyInfo_tags_1) - /sizeof(asn_DEF_NRFrequencyInfo_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_NRFrequencyInfo_1, - 3, /* Elements count */ - &asn_SPC_NRFrequencyInfo_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/NRFrequencyShift7p5khz.c b/e2sm/lib/NRFrequencyShift7p5khz.c deleted file mode 100644 index d79fbfd..0000000 --- a/e2sm/lib/NRFrequencyShift7p5khz.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#include "NRFrequencyShift7p5khz.h" - -/* - * This type is implemented using NativeEnumerated, - * so here we adjust the DEF accordingly. - */ -asn_per_constraints_t asn_PER_type_NRFrequencyShift7p5khz_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_NRFrequencyShift7p5khz_value2enum_1[] = { - { 0, 5, "false" }, - { 1, 4, "true" } - /* This list is extensible */ -}; -static const unsigned int asn_MAP_NRFrequencyShift7p5khz_enum2value_1[] = { - 0, /* false(0) */ - 1 /* true(1) */ - /* This list is extensible */ -}; -const asn_INTEGER_specifics_t asn_SPC_NRFrequencyShift7p5khz_specs_1 = { - asn_MAP_NRFrequencyShift7p5khz_value2enum_1, /* "tag" => N; sorted by tag */ - asn_MAP_NRFrequencyShift7p5khz_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_NRFrequencyShift7p5khz_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) -}; -asn_TYPE_descriptor_t asn_DEF_NRFrequencyShift7p5khz = { - "NRFrequencyShift7p5khz", - "NRFrequencyShift7p5khz", - &asn_OP_NativeEnumerated, - asn_DEF_NRFrequencyShift7p5khz_tags_1, - sizeof(asn_DEF_NRFrequencyShift7p5khz_tags_1) - /sizeof(asn_DEF_NRFrequencyShift7p5khz_tags_1[0]), /* 1 */ - asn_DEF_NRFrequencyShift7p5khz_tags_1, /* Same as above */ - sizeof(asn_DEF_NRFrequencyShift7p5khz_tags_1) - /sizeof(asn_DEF_NRFrequencyShift7p5khz_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_NRFrequencyShift7p5khz_constr_1, NativeEnumerated_constraint }, - 0, 0, /* Defined elsewhere */ - &asn_SPC_NRFrequencyShift7p5khz_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/NULL.c b/e2sm/lib/NULL.c index 4a2914f..d160e69 100644 --- a/e2sm/lib/NULL.c +++ b/e2sm/lib/NULL.c @@ -3,114 +3,105 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include #include -#include /* Implemented in terms of BOOLEAN type */ /* * NULL basic type description. */ static const ber_tlv_tag_t asn_DEF_NULL_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)) }; asn_TYPE_operation_t asn_OP_NULL = { - BOOLEAN_free, - NULL_print, - NULL_compare, - BOOLEAN_decode_ber, /* Implemented in terms of BOOLEAN */ - NULL_encode_der, /* Special handling of DER encoding */ - NULL_decode_xer, - NULL_encode_xer, -#ifdef ASN_DISABLE_OER_SUPPORT - 0, - 0, + NULL_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + NULL_print, #else - NULL_decode_oer, - NULL_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + NULL_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + NULL_decode_ber, + NULL_encode_der, /* Special handling of DER encoding */ #else - NULL_decode_uper, /* Unaligned PER decoder */ - NULL_encode_uper, /* Unaligned PER encoder */ - NULL_decode_aper, /* Aligned PER decoder */ - NULL_encode_aper, /* Aligned PER encoder */ -#endif /* ASN_DISABLE_PER_SUPPORT */ - NULL_random_fill, - 0 /* Use generic outmost tag fetcher */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + NULL_decode_xer, + NULL_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + NULL_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + NULL_decode_oer, + NULL_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + NULL_decode_uper, /* Unaligned PER decoder */ + NULL_encode_uper, /* Unaligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + NULL_decode_aper, /* Aligned PER decoder */ + NULL_encode_aper, /* Aligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + NULL_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ }; asn_TYPE_descriptor_t asn_DEF_NULL = { - "NULL", - "NULL", - &asn_OP_NULL, - asn_DEF_NULL_tags, - sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), - asn_DEF_NULL_tags, /* Same as above */ - sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), - { 0, 0, asn_generic_no_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ + "NULL", + "NULL", + &asn_OP_NULL, + asn_DEF_NULL_tags, + sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), + asn_DEF_NULL_tags, /* Same as above */ + sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_no_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ }; -asn_enc_rval_t -NULL_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_enc_rval_t erval = {0,0,0}; - - erval.encoded = der_write_tags(td, 0, tag_mode, 0, tag, cb, app_key); - if(erval.encoded == -1) { - erval.failed_type = td; - erval.structure_ptr = ptr; - } - - ASN__ENCODED_OK(erval); -} - -asn_enc_rval_t -NULL_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}; - - (void)td; - (void)sptr; - (void)ilevel; - (void)flags; - (void)cb; - (void)app_key; - - /* XMLNullValue is empty */ - er.encoded = 0; - ASN__ENCODED_OK(er); -} - - -static enum xer_pbd_rval -NULL__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, - const void *chunk_buf, size_t chunk_size) { - (void)td; - (void)sptr; - (void)chunk_buf; /* Going to be empty according to the rules below. */ - - /* - * There must be no content in self-terminating tag. - */ - if(chunk_size) - return XPBD_BROKEN_ENCODING; - else - return XPBD_BODY_CONSUMED; -} - -asn_dec_rval_t -NULL_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(NULL_t), opt_mname, buf_ptr, size, - NULL__xer_body_decode); +void +NULL_free(const asn_TYPE_descriptor_t *td, void *ptr, + enum asn_struct_free_method method) { + if(td && 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(NULL_t)); + break; + } + } } int @@ -120,180 +111,3 @@ NULL_compare(const asn_TYPE_descriptor_t *td, const void *a, const void *b) { (void)b; return 0; } - -int -NULL_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, - asn_app_consume_bytes_f *cb, void *app_key) { - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(sptr) { - return (cb("", 9, app_key) < 0) ? -1 : 0; - } else { - return (cb("", 8, app_key) < 0) ? -1 : 0; - } -} - -#ifndef ASN_DISABLE_OER_SUPPORT - -asn_dec_rval_t -NULL_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) { - asn_dec_rval_t rv = {RC_OK, 0}; - (void)opt_codec_ctx; - (void)td; - (void)constraints; - (void)ptr; - (void)size; - - if(!*sptr) { - *sptr = MALLOC(sizeof(NULL_t)); - if(*sptr) { - *(NULL_t *)*sptr = 0; - } else { - ASN__DECODE_FAILED; - } - } - - return rv; -} - -asn_enc_rval_t -NULL_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}; - - (void)td; - (void)sptr; - (void)constraints; - (void)cb; - (void)app_key; - - er.encoded = 0; /* Encoding in 0 bytes. */ - - ASN__ENCODED_OK(er); -} - -#endif /* ASN_DISABLE_OER_SUPPORT */ - -#ifndef ASN_DISABLE_PER_SUPPORT - -asn_dec_rval_t -NULL_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; - - (void)opt_codec_ctx; - (void)td; - (void)constraints; - (void)pd; - - if(!*sptr) { - *sptr = MALLOC(sizeof(NULL_t)); - if(*sptr) { - *(NULL_t *)*sptr = 0; - } else { - ASN__DECODE_FAILED; - } - } - - /* - * NULL type does not have content octets. - */ - - rv.code = RC_OK; - rv.consumed = 0; - return rv; -} - -asn_enc_rval_t -NULL_encode_uper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, const void *sptr, - asn_per_outp_t *po) { - asn_enc_rval_t er = {0,0,0}; - - (void)td; - (void)constraints; - (void)sptr; - (void)po; - - er.encoded = 0; - ASN__ENCODED_OK(er); -} - -asn_dec_rval_t -NULL_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}; - - (void)opt_codec_ctx; - (void)td; - (void)constraints; - (void)pd; - - if(!*sptr) { - *sptr = MALLOC(sizeof(NULL_t)); - if(*sptr) { - *(NULL_t *)*sptr = 0; - } else { - ASN__DECODE_FAILED; - } - } - - /* - * NULL type does not have content octets. - */ - - rv.code = RC_OK; - rv.consumed = 0; - return rv; -} - - -asn_enc_rval_t -NULL_encode_aper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, - const void *sptr, asn_per_outp_t *po) { - asn_enc_rval_t er = {0,0,0}; - - (void)td; - (void)constraints; - (void)sptr; - (void)po; - - er.encoded = 0; - ASN__ENCODED_OK(er); -} - -#endif /* ASN_DISABLE_PER_SUPPORT */ - -asn_random_fill_result_t -NULL_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, - const asn_encoding_constraints_t *constr, - size_t max_length) { - 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}; - NULL_t *st = *sptr; - - (void)td; - (void)constr; - - if(max_length == 0) return result_skipped; - - if(st == NULL) { - st = (NULL_t *)(*sptr = CALLOC(1, sizeof(*st))); - if(st == NULL) { - return result_failed; - } - } - - return result_ok; -} - diff --git a/e2sm/lib/NULL_aper.c b/e2sm/lib/NULL_aper.c new file mode 100644 index 0000000..5176880 --- /dev/null +++ b/e2sm/lib/NULL_aper.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_dec_rval_t +NULL_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}; + + (void)opt_codec_ctx; + (void)td; + (void)constraints; + (void)pd; + + if(!*sptr) { + *sptr = MALLOC(sizeof(NULL_t)); + if(*sptr) { + *(NULL_t *)*sptr = 0; + } else { + ASN__DECODE_FAILED; + } + } + + /* + * NULL type does not have content octets. + */ + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} + + +asn_enc_rval_t +NULL_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + asn_enc_rval_t er = {0,0,0}; + + (void)td; + (void)constraints; + (void)sptr; + (void)po; + + er.encoded = 0; + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/NULL_ber.c b/e2sm/lib/NULL_ber.c new file mode 100644 index 0000000..38c85c9 --- /dev/null +++ b/e2sm/lib/NULL_ber.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Decode NULL type. + */ +asn_dec_rval_t +NULL_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **bool_value, + const void *buf_ptr, size_t size, int tag_mode) { + NULL_t *st = (NULL_t *)*bool_value; + asn_dec_rval_t rval; + ber_tlv_len_t length; + + if(st == NULL) { + st = (NULL_t *)(*bool_value = CALLOC(1, sizeof(*st))); + if(st == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as NULL (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; + } + + // X.690-201508, #8.8.2, length shall be zero. + if(length != 0) { + ASN_DEBUG("Decoding %s as NULL failed: too much data", td->name); + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + return rval; +} + +asn_enc_rval_t +NULL_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_enc_rval_t erval = {0,0,0}; + + erval.encoded = der_write_tags(td, 0, tag_mode, 0, tag, cb, app_key); + if(erval.encoded == -1) { + erval.failed_type = td; + erval.structure_ptr = ptr; + } + + ASN__ENCODED_OK(erval); +} diff --git a/e2sm/lib/NULL_jer.c b/e2sm/lib/NULL_jer.c new file mode 100644 index 0000000..f69c64e --- /dev/null +++ b/e2sm/lib/NULL_jer.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +asn_enc_rval_t +NULL_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum jer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, + void *app_key) { + asn_enc_rval_t er = {0,0,0}; + + (void)td; + (void)sptr; + (void)ilevel; + (void)flags; + (void)cb; + (void)app_key; + + /* XMLNullValue is empty */ + er.encoded = 0; + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/NULL_oer.c b/e2sm/lib/NULL_oer.c new file mode 100644 index 0000000..29abaa2 --- /dev/null +++ b/e2sm/lib/NULL_oer.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_dec_rval_t +NULL_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) { + asn_dec_rval_t rv = {RC_OK, 0}; + (void)opt_codec_ctx; + (void)td; + (void)constraints; + (void)ptr; + (void)size; + + if(!*sptr) { + *sptr = MALLOC(sizeof(NULL_t)); + if(*sptr) { + *(NULL_t *)*sptr = 0; + } else { + ASN__DECODE_FAILED; + } + } + + return rv; +} + +asn_enc_rval_t +NULL_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}; + + (void)td; + (void)sptr; + (void)constraints; + (void)cb; + (void)app_key; + + er.encoded = 0; /* Encoding in 0 bytes. */ + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/NULL_print.c b/e2sm/lib/NULL_print.c new file mode 100644 index 0000000..52fcc0e --- /dev/null +++ b/e2sm/lib/NULL_print.c @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +int +NULL_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(sptr) { + return (cb("", 9, app_key) < 0) ? -1 : 0; + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} diff --git a/e2sm/lib/NULL_rfill.c b/e2sm/lib/NULL_rfill.c new file mode 100644 index 0000000..f1b60ce --- /dev/null +++ b/e2sm/lib/NULL_rfill.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_random_fill_result_t +NULL_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constr, + size_t max_length) { + 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}; + NULL_t *st = *sptr; + + (void)td; + (void)constr; + + if(max_length == 0) return result_skipped; + + if(st == NULL) { + st = (NULL_t *)(*sptr = CALLOC(1, sizeof(*st))); + if(st == NULL) { + return result_failed; + } + } + + return result_ok; +} diff --git a/e2sm/lib/NULL_uper.c b/e2sm/lib/NULL_uper.c new file mode 100644 index 0000000..c871a48 --- /dev/null +++ b/e2sm/lib/NULL_uper.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_dec_rval_t +NULL_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; + + (void)opt_codec_ctx; + (void)td; + (void)constraints; + (void)pd; + + if(!*sptr) { + *sptr = MALLOC(sizeof(NULL_t)); + if(*sptr) { + *(NULL_t *)*sptr = 0; + } else { + ASN__DECODE_FAILED; + } + } + + /* + * NULL type does not have content octets. + */ + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} + +asn_enc_rval_t +NULL_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + asn_enc_rval_t er = {0,0,0}; + + (void)td; + (void)constraints; + (void)sptr; + (void)po; + + er.encoded = 0; + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/NULL_xer.c b/e2sm/lib/NULL_xer.c new file mode 100644 index 0000000..5a6e4b9 --- /dev/null +++ b/e2sm/lib/NULL_xer.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +asn_enc_rval_t +NULL_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}; + + (void)td; + (void)sptr; + (void)ilevel; + (void)flags; + (void)cb; + (void)app_key; + + /* XMLNullValue is empty */ + er.encoded = 0; + ASN__ENCODED_OK(er); +} + + +static enum xer_pbd_rval +NULL__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, + const void *chunk_buf, size_t chunk_size) { + (void)td; + (void)sptr; + (void)chunk_buf; /* Going to be empty according to the rules below. */ + + /* + * There must be no content in self-terminating tag. + */ + if(chunk_size) + return XPBD_BROKEN_ENCODING; + else + return XPBD_BODY_CONSUMED; +} + +asn_dec_rval_t +NULL_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(NULL_t), opt_mname, buf_ptr, size, + NULL__xer_body_decode); +} diff --git a/e2sm/lib/NativeEnumerated.c b/e2sm/lib/NativeEnumerated.c index 50ffb1d..aee450c 100644 --- a/e2sm/lib/NativeEnumerated.c +++ b/e2sm/lib/NativeEnumerated.c @@ -16,352 +16,93 @@ * NativeEnumerated basic type description. */ static const ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) + (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, + NativeInteger_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + NativeInteger_print, #else - NativeEnumerated_decode_oer, - NativeEnumerated_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + NativeInteger_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + NativeInteger_decode_ber, + NativeInteger_encode_der, #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + NativeInteger_decode_xer, + NativeEnumerated_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + NativeEnumerated_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + NativeEnumerated_decode_oer, + NativeEnumerated_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + NativeEnumerated_decode_uper, + NativeEnumerated_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + NativeEnumerated_decode_aper, + NativeEnumerated_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + NativeEnumerated_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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 */ + "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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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 +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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); + 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; } +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ diff --git a/e2sm/lib/NativeEnumerated_aper.c b/e2sm/lib/NativeEnumerated_aper.c new file mode 100644 index 0000000..5c4c256 --- /dev/null +++ b/e2sm/lib/NativeEnumerated_aper.c @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; + 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->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 = %zu Padding bits = %d", + td->name, pd->moved, padding); + ASN_DEBUG("For NativeEnumerated %s, upper bound = %llu", + td->name, (unsigned long long)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; + */ + + /* XXX handle indefinite index length > 64k */ + value = aper_get_nsnnwn(pd, 65537); + if(value < 0) ASN__DECODE_STARVED; + value += specs->extension - 1; + //if(value >= specs->map_count) + // ASN__DECODE_FAILED; + if(value >= specs->map_count) { + ASN_DEBUG("Decoded unknown index value %s = %ld", td->name, value); + /* unknown index. Workaround => set the first enumeration value */ + *native = specs->value2enum[0].nat_value; + return rval; + } + } + + *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; + int inext = 0, range_bits = 1; + 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->range_bits >= 0) { + int cmpWith = specs->extension + ? specs->extension - 1 : specs->map_count; + if(value >= cmpWith) + inext = 1; + } + if(ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) range_bits = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + + if(range_bits && 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(aper_put_nsnnwn(po, + ct->upper_bound - ct->lower_bound + 1, + value - (inext ? (specs->extension - 1) : 0))) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/NativeEnumerated_jer.c b/e2sm/lib/NativeEnumerated_jer.c new file mode 100644 index 0000000..046afe9 --- /dev/null +++ b/e2sm/lib/NativeEnumerated_jer.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +NativeEnumerated_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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; + } +} diff --git a/e2sm/lib/NativeEnumerated_oer.c b/e2sm/lib/NativeEnumerated_oer.c index ee3c189..52dbcb8 100644 --- a/e2sm/lib/NativeEnumerated_oer.c +++ b/e2sm/lib/NativeEnumerated_oer.c @@ -3,11 +3,8 @@ * 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) { @@ -145,5 +142,3 @@ NativeEnumerated_encode_oer(const asn_TYPE_descriptor_t *td, ASN__ENCODED_OK(er); } } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2sm/lib/NativeEnumerated_uper.c b/e2sm/lib/NativeEnumerated_uper.c new file mode 100644 index 0000000..e2f932a --- /dev/null +++ b/e2sm/lib/NativeEnumerated_uper.c @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; + 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->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; +} + +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; + 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->range_bits >= 0) { + int cmpWith = specs->extension + ? specs->extension - 1 : specs->map_count; + if(value >= cmpWith) + inext = 1; + } + 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; + } + + 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/e2sm/lib/NativeEnumerated_xer.c b/e2sm/lib/NativeEnumerated_xer.c new file mode 100644 index 0000000..e8d6d0d --- /dev/null +++ b/e2sm/lib/NativeEnumerated_xer.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; + } +} diff --git a/e2sm/lib/NativeInteger.c b/e2sm/lib/NativeInteger.c index 316e872..f0309b0 100644 --- a/e2sm/lib/NativeInteger.c +++ b/e2sm/lib/NativeInteger.c @@ -17,408 +17,84 @@ * NativeInteger basic type description. */ static const ber_tlv_tag_t asn_DEF_NativeInteger_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) + (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, + NativeInteger_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + NativeInteger_print, #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, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + NativeInteger_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + NativeInteger_decode_ber, + NativeInteger_encode_der, #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + NativeInteger_decode_xer, + NativeInteger_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + NativeInteger_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + NativeInteger_decode_oer, /* OER decoder */ + NativeInteger_encode_oer, /* Canonical OER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + NativeInteger_decode_uper, /* Unaligned PER decoder */ + NativeInteger_encode_uper, /* Unaligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + NativeInteger_decode_aper, /* Aligned PER decoder */ + NativeInteger_encode_aper, /* Aligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + NativeInteger_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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 */ + "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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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) { @@ -474,77 +150,3 @@ NativeInteger_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const v 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/e2sm/lib/NativeInteger_aper.c b/e2sm/lib/NativeInteger_aper.c new file mode 100644 index 0000000..1d13070 --- /dev/null +++ b/e2sm/lib/NativeInteger_aper.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2sm/lib/NativeInteger_ber.c b/e2sm/lib/NativeInteger_ber.c new file mode 100644 index 0000000..ed68362 --- /dev/null +++ b/e2sm/lib/NativeInteger_ber.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * 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 occurred, 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; +} diff --git a/e2sm/lib/NativeInteger_jer.c b/e2sm/lib/NativeInteger_jer.c new file mode 100644 index 0000000..f48f8ec --- /dev/null +++ b/e2sm/lib/NativeInteger_jer.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +NativeInteger_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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); +} diff --git a/e2sm/lib/NativeInteger_oer.c b/e2sm/lib/NativeInteger_oer.c index 411413a..4e90046 100644 --- a/e2sm/lib/NativeInteger_oer.c +++ b/e2sm/lib/NativeInteger_oer.c @@ -3,11 +3,8 @@ * 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, @@ -95,5 +92,3 @@ NativeInteger_encode_oer(const asn_TYPE_descriptor_t *td, return er; } } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2sm/lib/NativeInteger_print.c b/e2sm/lib/NativeInteger_print.c new file mode 100644 index 0000000..0602e0d --- /dev/null +++ b/e2sm/lib/NativeInteger_print.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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; + } +} diff --git a/e2sm/lib/NativeInteger_rfill.c b/e2sm/lib/NativeInteger_rfill.c new file mode 100644 index 0000000..0e2cee8 --- /dev/null +++ b/e2sm/lib/NativeInteger_rfill.c @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 { + 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; +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + const asn_per_constraints_t *ct; + + 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); + } + } +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + } + + *sptr = st; + *st = value; + return result_ok; +} diff --git a/e2sm/lib/NativeInteger_uper.c b/e2sm/lib/NativeInteger_uper.c new file mode 100644 index 0000000..4fc4ba1 --- /dev/null +++ b/e2sm/lib/NativeInteger_uper.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2sm/lib/NativeInteger_xer.c b/e2sm/lib/NativeInteger_xer.c new file mode 100644 index 0000000..18ec59a --- /dev/null +++ b/e2sm/lib/NativeInteger_xer.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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); +} diff --git a/e2sm/lib/NativeReal.c b/e2sm/lib/NativeReal.c index 160a471..f6c37e1 100644 --- a/e2sm/lib/NativeReal.c +++ b/e2sm/lib/NativeReal.c @@ -12,9 +12,7 @@ #include #include #include -#include #include -#include #if defined(__clang__) /* @@ -38,583 +36,83 @@ static int asn_isnan(double d) { * NativeReal basic type description. */ static const ber_tlv_tag_t asn_DEF_NativeReal_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_operation_t asn_OP_NativeReal = { - NativeReal_free, - NativeReal_print, - NativeReal_compare, - NativeReal_decode_ber, - NativeReal_encode_der, - NativeReal_decode_xer, - NativeReal_encode_xer, -#ifdef ASN_DISABLE_OER_SUPPORT - 0, - 0, + NativeReal_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + NativeReal_print, #else - NativeReal_decode_oer, - NativeReal_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + NativeReal_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + NativeReal_decode_ber, + NativeReal_encode_der, #else - NativeReal_decode_uper, - NativeReal_encode_uper, - NativeReal_decode_aper, - NativeReal_encode_aper, -#endif /* ASN_DISABLE_PER_SUPPORT */ - NativeReal_random_fill, - 0 /* Use generic outmost tag fetcher */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + NativeReal_decode_xer, + NativeReal_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + NativeReal_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + NativeReal_decode_oer, + NativeReal_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + NativeReal_decode_uper, + NativeReal_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + NativeReal_decode_aper, + NativeReal_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + NativeReal_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ }; asn_TYPE_descriptor_t asn_DEF_NativeReal = { - "REAL", /* The ASN.1 type is still REAL */ - "REAL", - &asn_OP_NativeReal, - asn_DEF_NativeReal_tags, - sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]), - asn_DEF_NativeReal_tags, /* Same as above */ - sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]), - { 0, 0, asn_generic_no_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - -static size_t NativeReal__float_size(const asn_TYPE_descriptor_t *td); -static double NativeReal__get_double(const asn_TYPE_descriptor_t *td, - const void *ptr); -static ssize_t NativeReal__set(const asn_TYPE_descriptor_t *td, void **sptr, - double d); - -/* - * Decode REAL type. - */ -asn_dec_rval_t -NativeReal_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) { - asn_dec_rval_t rval; - ber_tlv_len_t length; - - ASN_DEBUG("Decoding %s as REAL (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; - assert(length >= 0); /* Ensured by ber_check_tags */ - - 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 REAL: buf_ptr, length - * Fill the Dbl, at the same time checking for overflow. - * If overflow occured, return with RC_FAIL. - */ + "REAL", /* The ASN.1 type is still REAL */ + "REAL", + &asn_OP_NativeReal, + asn_DEF_NativeReal_tags, + sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]), + asn_DEF_NativeReal_tags, /* Same as above */ + sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]), { - uint8_t scratch[24]; /* Longer than %.16f in decimal */ - REAL_t tmp; - double d; - int ret; - - if((size_t)length < sizeof(scratch)) { - tmp.buf = scratch; - tmp.size = length; - } else { - /* This rarely happens: impractically long value */ - tmp.buf = CALLOC(1, length + 1); - tmp.size = length; - if(!tmp.buf) { - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } - } - - memcpy(tmp.buf, buf_ptr, length); - tmp.buf[length] = '\0'; - - ret = asn_REAL2double(&tmp, &d); - if(tmp.buf != scratch) FREEMEM(tmp.buf); - if(ret) { - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } - - if(NativeReal__set(td, sptr, d) < 0) - ASN__DECODE_FAILED; - } - - 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 the NativeReal using the standard REAL type DER encoder. - */ -asn_enc_rval_t -NativeReal_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) { - double d = NativeReal__get_double(td, sptr); - asn_enc_rval_t erval = {0,0,0}; - REAL_t tmp; - - /* Prepare a temporary clean structure */ - memset(&tmp, 0, sizeof(tmp)); - - if(asn_double2REAL(&tmp, d)) - ASN__ENCODE_FAILED; - - /* Encode a fake REAL */ - erval = der_encode_primitive(td, &tmp, tag_mode, tag, cb, app_key); - if(erval.encoded == -1) { - assert(erval.structure_ptr == &tmp); - erval.structure_ptr = sptr; - } - - /* Free possibly allocated members of the temporary structure */ - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); - - return erval; -} - -#ifndef ASN_DISABLE_PER_SUPPORT - -/* - * Decode REAL type using PER. - */ -asn_dec_rval_t -NativeReal_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 rval; - double d; - REAL_t tmp; - void *ptmp = &tmp; - int ret; - - (void)constraints; - - memset(&tmp, 0, sizeof(tmp)); - rval = OCTET_STRING_decode_uper(opt_codec_ctx, &asn_DEF_REAL, - NULL, &ptmp, pd); - if(rval.code != RC_OK) { - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); - return rval; - } - - ret = asn_REAL2double(&tmp, &d); - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); - if(ret) ASN__DECODE_FAILED; - - if(NativeReal__set(td, sptr, d) < 0 ) - ASN__DECODE_FAILED; - - return rval; -} - -/* - * Encode the NativeReal using the OCTET STRING PER encoder. - */ -asn_enc_rval_t -NativeReal_encode_uper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, - const void *sptr, asn_per_outp_t *po) { - double d = NativeReal__get_double(td, sptr); - asn_enc_rval_t erval = {0,0,0}; - REAL_t tmp; - - (void)constraints; - - /* Prepare a temporary clean structure */ - memset(&tmp, 0, sizeof(tmp)); - - if(asn_double2REAL(&tmp, d)) - ASN__ENCODE_FAILED; - - /* Encode a DER REAL */ - erval = OCTET_STRING_encode_uper(&asn_DEF_REAL, NULL, &tmp, po); - if(erval.encoded == -1) - erval.structure_ptr = sptr; - - /* Free possibly allocated members of the temporary structure */ - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); - - return erval; -} - - -asn_dec_rval_t -NativeReal_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, - const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, - void **dbl_ptr, asn_per_data_t *pd) { - double *Dbl = (double *)*dbl_ptr; - asn_dec_rval_t rval; - REAL_t tmp; - void *ptmp = &tmp; - int ret; - - (void)constraints; - - /* - * If the structure is not there, allocate it. - */ - if(Dbl == NULL) { - *dbl_ptr = CALLOC(1, sizeof(*Dbl)); - Dbl = (double *)*dbl_ptr; - if(Dbl == NULL) - ASN__DECODE_FAILED; - } - - memset(&tmp, 0, sizeof(tmp)); - rval = OCTET_STRING_decode_aper(opt_codec_ctx, td, NULL, - &ptmp, pd); - if(rval.code != RC_OK) { - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); - return rval; - } - - ret = asn_REAL2double(&tmp, Dbl); - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); - if(ret) ASN__DECODE_FAILED; - - return rval; -} - -asn_enc_rval_t -NativeReal_encode_aper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, - const void *sptr, asn_per_outp_t *po) { - double Dbl = *(const double *)sptr; - asn_enc_rval_t erval = {0,0,0}; - REAL_t tmp; - - (void)constraints; - - /* Prepare a temporary clean structure */ - memset(&tmp, 0, sizeof(tmp)); - - if(asn_double2REAL(&tmp, Dbl)) - ASN__ENCODE_FAILED; - - /* Encode a DER REAL */ - erval = OCTET_STRING_encode_aper(td, NULL, &tmp, po); - if(erval.encoded == -1) - erval.structure_ptr = sptr; - - /* Free possibly allocated members of the temporary structure */ - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); - - return erval; -} - -#endif /* ASN_DISABLE_PER_SUPPORT */ - -#ifndef ASN_DISABLE_OER_SUPPORT - -/* - * Swap bytes from/to network, if local is little-endian. - * Unused endianness sections are likely removed at compile phase. - */ -static void -NativeReal__network_swap(size_t float_size, const void *srcp, uint8_t *dst) { - const uint8_t *src = srcp; - double test = -0.0; - int float_big_endian = *(const char *)&test != 0; - /* In lieu of static_assert(sizeof(double) == 8) */ - static const char sizeof_double_is_8_a[sizeof(double)-7] CC_NOTUSED; - static const char sizeof_double_is_8_b[9-sizeof(double)] CC_NOTUSED; - /* In lieu of static_assert(sizeof(sizeof) == 4) */ - static const char sizeof_float_is_4_a[sizeof(float)-3] CC_NOTUSED; - static const char sizeof_float_is_4_b[5-sizeof(float)] CC_NOTUSED; - - switch(float_size) { - case sizeof(double): - assert(sizeof(double) == 8); - if(float_big_endian) { - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; - dst[4] = src[4]; - dst[5] = src[5]; - dst[6] = src[6]; - dst[7] = src[7]; - } else { - dst[0] = src[7]; - dst[1] = src[6]; - dst[2] = src[5]; - dst[3] = src[4]; - dst[4] = src[3]; - dst[5] = src[2]; - dst[6] = src[1]; - dst[7] = src[0]; - } - return; - case sizeof(float): - assert(sizeof(float) == 4); - if(float_big_endian) { - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; - } else { - dst[0] = src[3]; - dst[1] = src[2]; - dst[2] = src[1]; - dst[3] = src[0]; - } - return; - } -} - -/* - * Encode as Canonical OER. - */ -asn_enc_rval_t -NativeReal_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}; - - if(!constraints) constraints = td->encoding_constraints.oer_constraints; - if(constraints && constraints->value.width != 0) { - /* X.696 IEEE 754 binary32 and binary64 encoding */ - uint8_t scratch[sizeof(double)]; - const asn_NativeReal_specifics_t *specs = - (const asn_NativeReal_specifics_t *)td->specifics; - size_t wire_size = constraints->value.width; - - if(specs ? (wire_size == specs->float_size) - : (wire_size == sizeof(double))) { - /* - * Our representation matches the wire, modulo endianness. - * That was the whole point of compact encoding! - */ - } else { - assert((wire_size == sizeof(double)) - || (specs && specs->float_size == wire_size)); - ASN__ENCODE_FAILED; - } - - /* - * The X.696 standard doesn't specify endianness, neither is IEEE 754. - * So we assume the network format is big endian. - */ - NativeReal__network_swap(wire_size, sptr, scratch); - if(cb(scratch, wire_size, app_key) < 0) { - ASN__ENCODE_FAILED; - } else { - er.encoded = wire_size; - ASN__ENCODED_OK(er); - } - } else { - double d = NativeReal__get_double(td, sptr); - ssize_t len_len; - REAL_t tmp; - - /* Prepare a temporary clean structure */ - memset(&tmp, 0, sizeof(tmp)); - - if(asn_double2REAL(&tmp, d)) { - ASN__ENCODE_FAILED; - } - - /* Encode a fake REAL */ - len_len = oer_serialize_length(tmp.size, cb, app_key); - if(len_len < 0 || cb(tmp.buf, tmp.size, app_key) < 0) { - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); - ASN__ENCODE_FAILED; - } else { - er.encoded = len_len + tmp.size; - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); - ASN__ENCODED_OK(er); - } - } -} - -asn_dec_rval_t -NativeReal_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) { - asn_dec_rval_t ok = {RC_OK, 0}; - double d; - ssize_t len_len; - size_t real_body_len; - - (void)opt_codec_ctx; - - if(!constraints) constraints = td->encoding_constraints.oer_constraints; - if(constraints && constraints->value.width != 0) { - /* X.696 IEEE 754 binary32 and binary64 encoding */ - uint8_t scratch[sizeof(double)]; - size_t wire_size = constraints->value.width; - - if(size < wire_size) - ASN__DECODE_STARVED; - - /* - * The X.696 standard doesn't specify endianness, neither is IEEE 754. - * So we assume the network format is big endian. - */ - NativeReal__network_swap(wire_size, ptr, scratch); - - - switch(wire_size) { - case sizeof(double): - { - double tmp; - memcpy(&tmp, scratch, sizeof(double)); - if(NativeReal__set(td, sptr, tmp) < 0) - ASN__DECODE_FAILED; - } - break; - case sizeof(float): - { - float tmp; - memcpy(&tmp, scratch, sizeof(float)); - if(NativeReal__set(td, sptr, tmp) < 0) - ASN__DECODE_FAILED; - } - break; - default: - ASN__DECODE_FAILED; - } - - ok.consumed = wire_size; - return ok; - } - - len_len = oer_fetch_length(ptr, size, &real_body_len); - if(len_len < 0) ASN__DECODE_FAILED; - if(len_len == 0) ASN__DECODE_STARVED; - - ptr = (const char *)ptr + len_len; - size -= len_len; - - if(real_body_len > size) ASN__DECODE_STARVED; - - { - uint8_t scratch[24]; /* Longer than %.16f in decimal */ - REAL_t tmp; - int ret; - - if(real_body_len < sizeof(scratch)) { - tmp.buf = scratch; - tmp.size = real_body_len; - } else { - /* This rarely happens: impractically long value */ - tmp.buf = CALLOC(1, real_body_len + 1); - tmp.size = real_body_len; - if(!tmp.buf) { - ASN__DECODE_FAILED; - } - } - - memcpy(tmp.buf, ptr, real_body_len); - tmp.buf[real_body_len] = '\0'; - - ret = asn_REAL2double(&tmp, &d); - if(tmp.buf != scratch) FREEMEM(tmp.buf); - if(ret) { - ASN_DEBUG("REAL decoded in %" ASN_PRI_SIZE " bytes, but can't convert t double", - real_body_len); - ASN__DECODE_FAILED; - } - } - - if(NativeReal__set(td, sptr, d) < 0) - ASN__DECODE_FAILED; - - ok.consumed = len_len + real_body_len; - return ok; -} - -#endif /* ASN_DISABLE_OER_SUPPORT */ - -/* - * Decode the chunk of XML text encoding REAL. - */ -asn_dec_rval_t -NativeReal_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) { - asn_dec_rval_t rval; - REAL_t st = { 0, 0 }; - REAL_t *stp = &st; - - rval = REAL_decode_xer(opt_codec_ctx, td, (void **)&stp, opt_mname, - buf_ptr, size); - if(rval.code == RC_OK) { - double d; - if(asn_REAL2double(&st, &d) || NativeReal__set(td, sptr, d) < 0) { - rval.code = RC_FAIL; - rval.consumed = 0; - } - } else { - /* Convert all errors into RC_FAIL */ - rval.consumed = 0; - } - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &st); - return rval; -} - -asn_enc_rval_t -NativeReal_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) { - double d = NativeReal__get_double(td, sptr); - asn_enc_rval_t er = {0,0,0}; - - (void)ilevel; - - er.encoded = REAL__dump(d, flags & XER_F_CANONICAL, cb, app_key); - if(er.encoded < 0) ASN__ENCODE_FAILED; - - ASN__ENCODED_OK(er); -} - -/* - * REAL specific human-readable output. - */ -int -NativeReal_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, - asn_app_consume_bytes_f *cb, void *app_key) { - (void)ilevel; /* Unused argument */ - - if(sptr) { - double d = NativeReal__get_double(td, sptr); - return (REAL__dump(d, 0, cb, app_key) < 0) ? -1 : 0; - } else { - return (cb("", 8, app_key) < 0) ? -1 : 0; - } -} +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_no_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; int NativeReal_compare(const asn_TYPE_descriptor_t *td, const void *aptr, @@ -674,79 +172,18 @@ NativeReal_free(const asn_TYPE_descriptor_t *td, void *ptr, } } -asn_random_fill_result_t -NativeReal_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, - const asn_encoding_constraints_t *constraints, - size_t max_length) { - 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}; -#ifndef INFINITY -#define INFINITY (1.0/0.0) -#endif -#ifndef NAN -#define NAN (0.0/0.0) -#endif - static const double double_values[] = { - -M_E, M_E, -M_PI, M_PI, /* Better precision than with floats */ - -1E+308, 1E+308, - /* 2^51 */ - -2251799813685248.0, 2251799813685248.0, - /* 2^52 */ - -4503599627370496.0, 4503599627370496.0, - /* 2^100 */ - -1267650600228229401496703205376.0, 1267650600228229401496703205376.0, - -DBL_MIN, DBL_MIN, - -DBL_MAX, DBL_MAX, -#ifdef DBL_TRUE_MIN - -DBL_TRUE_MIN, DBL_TRUE_MIN -#endif - }; - static const float float_values[] = { - 0, -0.0, -1, 1, -M_E, M_E, -3.14, 3.14, -M_PI, M_PI, -255, 255, - -FLT_MIN, FLT_MIN, - -FLT_MAX, FLT_MAX, -#ifdef FLT_TRUE_MIN - -FLT_TRUE_MIN, FLT_TRUE_MIN, -#endif - INFINITY, -INFINITY, NAN - }; - ssize_t float_set_size = NativeReal__float_size(td); - const size_t n_doubles = sizeof(double_values) / sizeof(double_values[0]); - const size_t n_floats = sizeof(float_values) / sizeof(float_values[0]); - double d; - - (void)constraints; - - if(max_length == 0) return result_skipped; - - if(float_set_size == sizeof(double) && asn_random_between(0, 1) == 0) { - d = double_values[asn_random_between(0, n_doubles - 1)]; - } else { - d = float_values[asn_random_between(0, n_floats - 1)]; - } - - if(NativeReal__set(td, sptr, d) < 0) { - return result_failed; - } - - result_ok.length = float_set_size; - return result_ok; -} - - /* * Local helper functions. */ -static size_t +size_t NativeReal__float_size(const asn_TYPE_descriptor_t *td) { const asn_NativeReal_specifics_t *specs = (const asn_NativeReal_specifics_t *)td->specifics; return specs ? specs->float_size : sizeof(double); } -static double +double NativeReal__get_double(const asn_TYPE_descriptor_t *td, const void *ptr) { size_t float_size = NativeReal__float_size(td); if(float_size == sizeof(float)) { @@ -756,7 +193,7 @@ NativeReal__get_double(const asn_TYPE_descriptor_t *td, const void *ptr) { } } -static ssize_t /* Returns -1 or float size. */ +ssize_t /* Returns -1 or float size. */ NativeReal__set(const asn_TYPE_descriptor_t *td, void **sptr, double d) { size_t float_size = NativeReal__float_size(td); void *native; diff --git a/e2sm/lib/NativeReal_aper.c b/e2sm/lib/NativeReal_aper.c new file mode 100644 index 0000000..27f0f1d --- /dev/null +++ b/e2sm/lib/NativeReal_aper.c @@ -0,0 +1,74 @@ +/* + * 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 +NativeReal_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **dbl_ptr, asn_per_data_t *pd) { + double *Dbl = (double *)*dbl_ptr; + asn_dec_rval_t rval; + REAL_t tmp; + void *ptmp = &tmp; + int ret; + + (void)constraints; + + /* + * If the structure is not there, allocate it. + */ + if(Dbl == NULL) { + *dbl_ptr = CALLOC(1, sizeof(*Dbl)); + Dbl = (double *)*dbl_ptr; + if(Dbl == NULL) + ASN__DECODE_FAILED; + } + + memset(&tmp, 0, sizeof(tmp)); + rval = OCTET_STRING_decode_aper(opt_codec_ctx, td, NULL, + &ptmp, pd); + if(rval.code != RC_OK) { + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); + return rval; + } + + ret = asn_REAL2double(&tmp, Dbl); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); + if(ret) ASN__DECODE_FAILED; + + return rval; +} + +asn_enc_rval_t +NativeReal_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + double Dbl = *(const double *)sptr; + asn_enc_rval_t erval = {0,0,0}; + REAL_t tmp; + + (void)constraints; + + /* Prepare a temporary clean structure */ + memset(&tmp, 0, sizeof(tmp)); + + if(asn_double2REAL(&tmp, Dbl)) + ASN__ENCODE_FAILED; + + /* Encode a DER REAL */ + erval = OCTET_STRING_encode_aper(td, NULL, &tmp, po); + if(erval.encoded == -1) + erval.structure_ptr = sptr; + + /* Free possibly allocated members of the temporary structure */ + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); + + return erval; +} diff --git a/e2sm/lib/NativeReal_ber.c b/e2sm/lib/NativeReal_ber.c new file mode 100644 index 0000000..923c3df --- /dev/null +++ b/e2sm/lib/NativeReal_ber.c @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Decode REAL type. + */ +asn_dec_rval_t +NativeReal_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) { + asn_dec_rval_t rval; + ber_tlv_len_t length; + + ASN_DEBUG("Decoding %s as REAL (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; + assert(length >= 0); /* Ensured by ber_check_tags */ + + 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 REAL: buf_ptr, length + * Fill the Dbl, at the same time checking for overflow. + * If overflow occurred, return with RC_FAIL. + */ + { + uint8_t scratch[24]; /* Longer than %.16f in decimal */ + REAL_t tmp; + double d; + int ret; + + if((size_t)length < sizeof(scratch)) { + tmp.buf = scratch; + tmp.size = length; + } else { + /* This rarely happens: impractically long value */ + tmp.buf = CALLOC(1, length + 1); + tmp.size = length; + if(!tmp.buf) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + memcpy(tmp.buf, buf_ptr, length); + tmp.buf[length] = '\0'; + + ret = asn_REAL2double(&tmp, &d); + if(tmp.buf != scratch) FREEMEM(tmp.buf); + if(ret) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + if(NativeReal__set(td, sptr, d) < 0) + ASN__DECODE_FAILED; + } + + 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 the NativeReal using the standard REAL type DER encoder. + */ +asn_enc_rval_t +NativeReal_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) { + double d = NativeReal__get_double(td, sptr); + asn_enc_rval_t erval = {0,0,0}; + REAL_t tmp; + + /* Prepare a temporary clean structure */ + memset(&tmp, 0, sizeof(tmp)); + + if(asn_double2REAL(&tmp, d)) + ASN__ENCODE_FAILED; + + /* Encode a fake REAL */ + erval = der_encode_primitive(td, &tmp, tag_mode, tag, cb, app_key); + if(erval.encoded == -1) { + assert(erval.structure_ptr == &tmp); + erval.structure_ptr = sptr; + } + + /* Free possibly allocated members of the temporary structure */ + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); + + return erval; +} diff --git a/e2sm/lib/NativeReal_jer.c b/e2sm/lib/NativeReal_jer.c new file mode 100644 index 0000000..9c62208 --- /dev/null +++ b/e2sm/lib/NativeReal_jer.c @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +asn_enc_rval_t + NativeReal_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + double d = NativeReal__get_double(td, sptr); + asn_enc_rval_t er = {0,0,0}; + + (void)ilevel; + + er.encoded = REAL__dump(d, flags, cb, app_key); + if(er.encoded < 0) ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/NativeReal_oer.c b/e2sm/lib/NativeReal_oer.c new file mode 100644 index 0000000..66c3319 --- /dev/null +++ b/e2sm/lib/NativeReal_oer.c @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Swap bytes from/to network, if local is little-endian. + * Unused endianness sections are likely removed at compile phase. + */ +static void +NativeReal__network_swap(size_t float_size, const void *srcp, uint8_t *dst) { + const uint8_t *src = srcp; + double test = -0.0; + int float_big_endian = *(const char *)&test != 0; + /* In lieu of static_assert(sizeof(double) == 8) */ + static const char sizeof_double_is_8_a[sizeof(double)-7] CC_NOTUSED; + static const char sizeof_double_is_8_b[9-sizeof(double)] CC_NOTUSED; + /* In lieu of static_assert(sizeof(sizeof) == 4) */ + static const char sizeof_float_is_4_a[sizeof(float)-3] CC_NOTUSED; + static const char sizeof_float_is_4_b[5-sizeof(float)] CC_NOTUSED; + + switch(float_size) { + case sizeof(double): + assert(sizeof(double) == 8); + if(float_big_endian) { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + dst[4] = src[4]; + dst[5] = src[5]; + dst[6] = src[6]; + dst[7] = src[7]; + } else { + dst[0] = src[7]; + dst[1] = src[6]; + dst[2] = src[5]; + dst[3] = src[4]; + dst[4] = src[3]; + dst[5] = src[2]; + dst[6] = src[1]; + dst[7] = src[0]; + } + return; + case sizeof(float): + assert(sizeof(float) == 4); + if(float_big_endian) { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + } else { + dst[0] = src[3]; + dst[1] = src[2]; + dst[2] = src[1]; + dst[3] = src[0]; + } + return; + } +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +NativeReal_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}; + + if(!constraints) constraints = td->encoding_constraints.oer_constraints; + if(constraints && constraints->value.width != 0) { + /* X.696 IEEE 754 binary32 and binary64 encoding */ + uint8_t scratch[sizeof(double)]; + const asn_NativeReal_specifics_t *specs = + (const asn_NativeReal_specifics_t *)td->specifics; + size_t wire_size = constraints->value.width; + + if(specs ? (wire_size == specs->float_size) + : (wire_size == sizeof(double))) { + /* + * Our representation matches the wire, modulo endianness. + * That was the whole point of compact encoding! + */ + } else { + assert((wire_size == sizeof(double)) + || (specs && specs->float_size == wire_size)); + ASN__ENCODE_FAILED; + } + + /* + * The X.696 standard doesn't specify endianness, neither is IEEE 754. + * So we assume the network format is big endian. + */ + NativeReal__network_swap(wire_size, sptr, scratch); + if(cb(scratch, wire_size, app_key) < 0) { + ASN__ENCODE_FAILED; + } else { + er.encoded = wire_size; + ASN__ENCODED_OK(er); + } + } else { + double d = NativeReal__get_double(td, sptr); + ssize_t len_len; + REAL_t tmp; + + /* Prepare a temporary clean structure */ + memset(&tmp, 0, sizeof(tmp)); + + if(asn_double2REAL(&tmp, d)) { + ASN__ENCODE_FAILED; + } + + /* Encode a fake REAL */ + len_len = oer_serialize_length(tmp.size, cb, app_key); + if(len_len < 0 || cb(tmp.buf, tmp.size, app_key) < 0) { + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); + ASN__ENCODE_FAILED; + } else { + er.encoded = len_len + tmp.size; + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); + ASN__ENCODED_OK(er); + } + } +} + +asn_dec_rval_t +NativeReal_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) { + asn_dec_rval_t ok = {RC_OK, 0}; + double d; + ssize_t len_len; + size_t real_body_len; + + (void)opt_codec_ctx; + + if(!constraints) constraints = td->encoding_constraints.oer_constraints; + if(constraints && constraints->value.width != 0) { + /* X.696 IEEE 754 binary32 and binary64 encoding */ + uint8_t scratch[sizeof(double)]; + size_t wire_size = constraints->value.width; + + if(size < wire_size) + ASN__DECODE_STARVED; + + /* + * The X.696 standard doesn't specify endianness, neither is IEEE 754. + * So we assume the network format is big endian. + */ + NativeReal__network_swap(wire_size, ptr, scratch); + + + switch(wire_size) { + case sizeof(double): + { + double tmp; + memcpy(&tmp, scratch, sizeof(double)); + if(NativeReal__set(td, sptr, tmp) < 0) + ASN__DECODE_FAILED; + } + break; + case sizeof(float): + { + float tmp; + memcpy(&tmp, scratch, sizeof(float)); + if(NativeReal__set(td, sptr, tmp) < 0) + ASN__DECODE_FAILED; + } + break; + default: + ASN__DECODE_FAILED; + } + + ok.consumed = wire_size; + return ok; + } + + len_len = oer_fetch_length(ptr, size, &real_body_len); + if(len_len < 0) ASN__DECODE_FAILED; + if(len_len == 0) ASN__DECODE_STARVED; + + ptr = (const char *)ptr + len_len; + size -= len_len; + + if(real_body_len > size) ASN__DECODE_STARVED; + + { + uint8_t scratch[24]; /* Longer than %.16f in decimal */ + REAL_t tmp; + int ret; + + if(real_body_len < sizeof(scratch)) { + tmp.buf = scratch; + tmp.size = real_body_len; + } else { + /* This rarely happens: impractically long value */ + tmp.buf = CALLOC(1, real_body_len + 1); + tmp.size = real_body_len; + if(!tmp.buf) { + ASN__DECODE_FAILED; + } + } + + memcpy(tmp.buf, ptr, real_body_len); + tmp.buf[real_body_len] = '\0'; + + ret = asn_REAL2double(&tmp, &d); + if(tmp.buf != scratch) FREEMEM(tmp.buf); + if(ret) { + ASN_DEBUG("REAL decoded in %" ASN_PRI_SIZE " bytes, but can't convert t double", + real_body_len); + ASN__DECODE_FAILED; + } + } + + if(NativeReal__set(td, sptr, d) < 0) + ASN__DECODE_FAILED; + + ok.consumed = len_len + real_body_len; + return ok; +} diff --git a/e2sm/lib/NativeReal_print.c b/e2sm/lib/NativeReal_print.c new file mode 100644 index 0000000..1914696 --- /dev/null +++ b/e2sm/lib/NativeReal_print.c @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * REAL specific human-readable output. + */ +int +NativeReal_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + (void)ilevel; /* Unused argument */ + + if(sptr) { + double d = NativeReal__get_double(td, sptr); + return (REAL__dump(d, 0, cb, app_key) < 0) ? -1 : 0; + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} diff --git a/e2sm/lib/NativeReal_rfill.c b/e2sm/lib/NativeReal_rfill.c new file mode 100644 index 0000000..04153ea --- /dev/null +++ b/e2sm/lib/NativeReal_rfill.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +asn_random_fill_result_t +NativeReal_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + 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}; +#ifndef INFINITY +#define INFINITY (1.0/0.0) +#endif +#ifndef NAN +#define NAN (0.0/0.0) +#endif + static const double double_values[] = { + -M_E, M_E, -M_PI, M_PI, /* Better precision than with floats */ + -1E+308, 1E+308, + /* 2^51 */ + -2251799813685248.0, 2251799813685248.0, + /* 2^52 */ + -4503599627370496.0, 4503599627370496.0, + /* 2^100 */ + -1267650600228229401496703205376.0, 1267650600228229401496703205376.0, + -DBL_MIN, DBL_MIN, + -DBL_MAX, DBL_MAX, +#ifdef DBL_TRUE_MIN + -DBL_TRUE_MIN, DBL_TRUE_MIN +#endif + }; + static const float float_values[] = { + 0, -0.0, -1, 1, -M_E, M_E, -3.14, 3.14, -M_PI, M_PI, -255, 255, + -FLT_MIN, FLT_MIN, + -FLT_MAX, FLT_MAX, +#ifdef FLT_TRUE_MIN + -FLT_TRUE_MIN, FLT_TRUE_MIN, +#endif + INFINITY, -INFINITY, NAN + }; + ssize_t float_set_size = NativeReal__float_size(td); + const size_t n_doubles = sizeof(double_values) / sizeof(double_values[0]); + const size_t n_floats = sizeof(float_values) / sizeof(float_values[0]); + double d; + + (void)constraints; + + if(max_length == 0) return result_skipped; + + if(float_set_size == sizeof(double) && asn_random_between(0, 1) == 0) { + d = double_values[asn_random_between(0, n_doubles - 1)]; + } else { + d = float_values[asn_random_between(0, n_floats - 1)]; + } + + if(NativeReal__set(td, sptr, d) < 0) { + return result_failed; + } + + result_ok.length = float_set_size; + return result_ok; +} diff --git a/e2sm/lib/NativeReal_uper.c b/e2sm/lib/NativeReal_uper.c new file mode 100644 index 0000000..78fc242 --- /dev/null +++ b/e2sm/lib/NativeReal_uper.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +/* + * Decode REAL type using PER. + */ +asn_dec_rval_t +NativeReal_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 rval; + double d; + REAL_t tmp; + void *ptmp = &tmp; + int ret; + + (void)constraints; + + memset(&tmp, 0, sizeof(tmp)); + rval = OCTET_STRING_decode_uper(opt_codec_ctx, &asn_DEF_REAL, + NULL, &ptmp, pd); + if(rval.code != RC_OK) { + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); + return rval; + } + + ret = asn_REAL2double(&tmp, &d); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); + if(ret) ASN__DECODE_FAILED; + + if(NativeReal__set(td, sptr, d) < 0 ) + ASN__DECODE_FAILED; + + return rval; +} + +/* + * Encode the NativeReal using the OCTET STRING PER encoder. + */ +asn_enc_rval_t +NativeReal_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + double d = NativeReal__get_double(td, sptr); + asn_enc_rval_t erval = {0,0,0}; + REAL_t tmp; + + (void)constraints; + + /* Prepare a temporary clean structure */ + memset(&tmp, 0, sizeof(tmp)); + + if(asn_double2REAL(&tmp, d)) + ASN__ENCODE_FAILED; + + /* Encode a DER REAL */ + erval = OCTET_STRING_encode_uper(&asn_DEF_REAL, NULL, &tmp, po); + if(erval.encoded == -1) + erval.structure_ptr = sptr; + + /* Free possibly allocated members of the temporary structure */ + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp); + + return erval; +} diff --git a/e2sm/lib/NativeReal_xer.c b/e2sm/lib/NativeReal_xer.c new file mode 100644 index 0000000..21cbe66 --- /dev/null +++ b/e2sm/lib/NativeReal_xer.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Decode the chunk of XML text encoding REAL. + */ +asn_dec_rval_t +NativeReal_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) { + asn_dec_rval_t rval; + REAL_t st = { 0, 0 }; + REAL_t *stp = &st; + + rval = REAL_decode_xer(opt_codec_ctx, td, (void **)&stp, opt_mname, + buf_ptr, size); + if(rval.code == RC_OK) { + double d; + if(asn_REAL2double(&st, &d) || NativeReal__set(td, sptr, d) < 0) { + rval.code = RC_FAIL; + rval.consumed = 0; + } + } else { + /* Convert all errors into RC_FAIL */ + rval.consumed = 0; + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &st); + return rval; +} + +asn_enc_rval_t +NativeReal_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) { + double d = NativeReal__get_double(td, sptr); + asn_enc_rval_t er = {0,0,0}; + + (void)ilevel; + + er.encoded = REAL__dump(d, flags & XER_F_CANONICAL, cb, app_key); + if(er.encoded < 0) ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/NgENB-ID.c b/e2sm/lib/NgENB-ID.c index 9c538bd..805d0c2 100644 --- a/e2sm/lib/NgENB-ID.c +++ b/e2sm/lib/NgENB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "NgENB-ID.h" @@ -27,7 +27,7 @@ memb_macroNgENB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *spt size = 0; } - if((size == 20)) { + if((size == 20UL)) { /* Constraint check succeeded */ return 0; } else { @@ -58,7 +58,7 @@ memb_shortMacroNgENB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void size = 0; } - if((size == 18)) { + if((size == 18UL)) { /* Constraint check succeeded */ return 0; } else { @@ -89,7 +89,7 @@ memb_longMacroNgENB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void size = 0; } - if((size == 21)) { + if((size == 21UL)) { /* Constraint check succeeded */ return 0; } else { @@ -100,33 +100,69 @@ memb_longMacroNgENB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void } } +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_macroNgENB_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + 20 /* (SIZE(20..20)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_macroNgENB_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_shortMacroNgENB_ID_constr_3 CC_NOTUSED = { + { 0, 0 }, + 18 /* (SIZE(18..18)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_shortMacroNgENB_ID_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_longMacroNgENB_ID_constr_4 CC_NOTUSED = { + { 0, 0 }, + 21 /* (SIZE(21..21)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_memb_longMacroNgENB_ID_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_NgENB_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_NgENB_ID_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_NgENB_ID_1[] = { { ATF_NOFLAGS, 0, offsetof(struct NgENB_ID, choice.macroNgENB_ID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, 0, - { 0, &asn_PER_memb_macroNgENB_ID_constr_2, memb_macroNgENB_ID_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_macroNgENB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_macroNgENB_ID_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_macroNgENB_ID_constraint_1 + }, 0, 0, /* No default value */ "macroNgENB-ID" }, @@ -135,7 +171,15 @@ asn_TYPE_member_t asn_MBR_NgENB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, 0, - { 0, &asn_PER_memb_shortMacroNgENB_ID_constr_3, memb_shortMacroNgENB_ID_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_shortMacroNgENB_ID_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_shortMacroNgENB_ID_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_shortMacroNgENB_ID_constraint_1 + }, 0, 0, /* No default value */ "shortMacroNgENB-ID" }, @@ -144,7 +188,15 @@ asn_TYPE_member_t asn_MBR_NgENB_ID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, 0, - { 0, &asn_PER_memb_longMacroNgENB_ID_constr_4, memb_longMacroNgENB_ID_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_longMacroNgENB_ID_constr_4, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_longMacroNgENB_ID_constr_4, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_longMacroNgENB_ID_constraint_1 + }, 0, 0, /* No default value */ "longMacroNgENB-ID" }, @@ -172,7 +224,15 @@ asn_TYPE_descriptor_t asn_DEF_NgENB_ID = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_NgENB_ID_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_NgENB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_NgENB_ID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_NgENB_ID_1, 3, /* Elements count */ &asn_SPC_NgENB_ID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/NumericString.c b/e2sm/lib/NumericString.c deleted file mode 100644 index ec98ba5..0000000 --- a/e2sm/lib/NumericString.c +++ /dev/null @@ -1,121 +0,0 @@ -/*- - * Copyright (c) 2003, 2006 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include - -/* - * NumericString basic type description. - */ -static const ber_tlv_tag_t asn_DEF_NumericString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (18 << 2)), /* [UNIVERSAL 18] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ -}; -static int asn_DEF_NumericString_v2c(unsigned int value) { - switch(value) { - case 0x20: return 0; - case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: - case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: - return value - (0x30 - 1); - } - return -1; -} -static int asn_DEF_NumericString_c2v(unsigned int code) { - if(code > 0) { - if(code <= 10) - return code + (0x30 - 1); - else - return -1; - } else { - return 0x20; - } -} -static asn_per_constraints_t asn_DEF_NumericString_per_constraints = { - { APC_CONSTRAINED, 4, 4, 0x20, 0x39 }, /* Value */ - { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ - asn_DEF_NumericString_v2c, - asn_DEF_NumericString_c2v -}; -asn_TYPE_operation_t asn_OP_NumericString = { - 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_NumericString = { - "NumericString", - "NumericString", - &asn_OP_NumericString, - asn_DEF_NumericString_tags, - sizeof(asn_DEF_NumericString_tags) - / sizeof(asn_DEF_NumericString_tags[0]) - 1, - asn_DEF_NumericString_tags, - sizeof(asn_DEF_NumericString_tags) - / sizeof(asn_DEF_NumericString_tags[0]), - { 0, &asn_DEF_NumericString_per_constraints, NumericString_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - -int -NumericString_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, - asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const NumericString_t *st = (const NumericString_t *)sptr; - - if(st && st->buf) { - uint8_t *buf = st->buf; - uint8_t *end = buf + st->size; - - /* - * Check the alphabet of the NumericString. - * ASN.1:1984 (X.409) - */ - for(; buf < end; buf++) { - switch(*buf) { - case 0x20: - case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: - case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: - continue; - } - ASN__CTFAIL(app_key, td, sptr, - "%s: value byte %ld (%d) " - "not in NumericString 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/e2sm/lib/OBJECT_IDENTIFIER.c b/e2sm/lib/OBJECT_IDENTIFIER.c index 8dccf01..5cf2d60 100644 --- a/e2sm/lib/OBJECT_IDENTIFIER.c +++ b/e2sm/lib/OBJECT_IDENTIFIER.c @@ -5,58 +5,93 @@ #include #include #include -#include +#include #include /* for CHAR_BIT */ #include +#include /* * OBJECT IDENTIFIER basic type description. */ static const ber_tlv_tag_t asn_DEF_OBJECT_IDENTIFIER_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)) }; asn_TYPE_operation_t asn_OP_OBJECT_IDENTIFIER = { - ASN__PRIMITIVE_TYPE_free, - OBJECT_IDENTIFIER_print, - OCTET_STRING_compare, /* Implemented in terms of a string comparison */ - ber_decode_primitive, - der_encode_primitive, - OBJECT_IDENTIFIER_decode_xer, - OBJECT_IDENTIFIER_encode_xer, -#ifdef ASN_DISABLE_OER_SUPPORT - 0, - 0, + ASN__PRIMITIVE_TYPE_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OBJECT_IDENTIFIER_print, #else - OBJECT_IDENTIFIER_decode_oer, - OBJECT_IDENTIFIER_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, /* Implemented in terms of a string comparison */ +#if !defined(ASN_DISABLE_BER_SUPPORT) + ber_decode_primitive, + der_encode_primitive, #else - OCTET_STRING_decode_uper, - OCTET_STRING_encode_uper, - OCTET_STRING_decode_aper, - OCTET_STRING_encode_aper, -#endif /* ASN_DISABLE_PER_SUPPORT */ - OBJECT_IDENTIFIER_random_fill, - 0 /* Use generic outmost tag fetcher */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OBJECT_IDENTIFIER_decode_xer, + OBJECT_IDENTIFIER_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OBJECT_IDENTIFIER_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + OBJECT_IDENTIFIER_decode_oer, + OBJECT_IDENTIFIER_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, + OCTET_STRING_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + OBJECT_IDENTIFIER_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ }; asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = { - "OBJECT IDENTIFIER", - "OBJECT_IDENTIFIER", - &asn_OP_OBJECT_IDENTIFIER, - asn_DEF_OBJECT_IDENTIFIER_tags, - sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) - / sizeof(asn_DEF_OBJECT_IDENTIFIER_tags[0]), - asn_DEF_OBJECT_IDENTIFIER_tags, /* Same as above */ - sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) - / sizeof(asn_DEF_OBJECT_IDENTIFIER_tags[0]), - { 0, 0, OBJECT_IDENTIFIER_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ + "OBJECT IDENTIFIER", + "OBJECT_IDENTIFIER", + &asn_OP_OBJECT_IDENTIFIER, + asn_DEF_OBJECT_IDENTIFIER_tags, + sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) + / sizeof(asn_DEF_OBJECT_IDENTIFIER_tags[0]), + asn_DEF_OBJECT_IDENTIFIER_tags, /* Same as above */ + sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) + / sizeof(asn_DEF_OBJECT_IDENTIFIER_tags[0]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + OBJECT_IDENTIFIER_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ }; int @@ -143,11 +178,12 @@ OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, size_t arcbuf_len, } -static ssize_t +ssize_t OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st, asn_app_consume_bytes_f *cb, void *app_key) { char scratch[32]; - asn_oid_arc_t arc0, arc1; + asn_oid_arc_t arc0 = 0; + asn_oid_arc_t arc1 = 0; size_t produced = 0; size_t off = 0; ssize_t rd; @@ -195,105 +231,11 @@ OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st, return produced; } -static enum xer_pbd_rval -OBJECT_IDENTIFIER__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, - const void *chunk_buf, size_t chunk_size) { - OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)sptr; - const char *chunk_end = (const char *)chunk_buf + chunk_size; - const char *endptr; - asn_oid_arc_t s_arcs[10]; - asn_oid_arc_t *arcs = s_arcs; - ssize_t num_arcs; - ssize_t ret; - - (void)td; - - num_arcs = OBJECT_IDENTIFIER_parse_arcs( - (const char *)chunk_buf, chunk_size, arcs, - sizeof(s_arcs) / sizeof(s_arcs[0]), &endptr); - if(num_arcs < 0) { - /* Expecting more than zero arcs */ - return XPBD_BROKEN_ENCODING; - } else if(num_arcs == 0) { - return XPBD_NOT_BODY_IGNORE; - } - assert(endptr == chunk_end); - - if((size_t)num_arcs > sizeof(s_arcs)/sizeof(s_arcs[0])) { - arcs = (asn_oid_arc_t *)MALLOC(num_arcs * sizeof(asn_oid_arc_t)); - if(!arcs) return XPBD_SYSTEM_FAILURE; - ret = OBJECT_IDENTIFIER_parse_arcs((const char *)chunk_buf, chunk_size, - arcs, num_arcs, &endptr); - if(ret != num_arcs) - return XPBD_SYSTEM_FAILURE; /* assert?.. */ - } - - /* - * Convert arcs into BER representation. - */ - ret = OBJECT_IDENTIFIER_set_arcs(st, arcs, num_arcs); - if(arcs != s_arcs) FREEMEM(arcs); - - return ret ? XPBD_SYSTEM_FAILURE : XPBD_BODY_CONSUMED; -} - -asn_dec_rval_t -OBJECT_IDENTIFIER_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(OBJECT_IDENTIFIER_t), opt_mname, - buf_ptr, size, OBJECT_IDENTIFIER__xer_body_decode); -} - -asn_enc_rval_t -OBJECT_IDENTIFIER_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 OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; - asn_enc_rval_t er = {0,0,0}; - - (void)ilevel; - (void)flags; - - if(!st || !st->buf) { - ASN__ENCODE_FAILED; - } - - er.encoded = OBJECT_IDENTIFIER__dump_body(st, cb, app_key); - if(er.encoded < 0) ASN__ENCODE_FAILED; - - ASN__ENCODED_OK(er); -} - -int -OBJECT_IDENTIFIER_print(const asn_TYPE_descriptor_t *td, const void *sptr, - int ilevel, asn_app_consume_bytes_f *cb, - void *app_key) { - const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; - - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(!st || !st->buf) - return (cb("", 8, app_key) < 0) ? -1 : 0; - - /* Dump preamble */ - if(cb("{ ", 2, app_key) < 0) - return -1; - - if(OBJECT_IDENTIFIER__dump_body(st, cb, app_key) < 0) { - return -1; - } - - return (cb(" }", 2, app_key) < 0) ? -1 : 0; -} - ssize_t OBJECT_IDENTIFIER_get_arcs(const OBJECT_IDENTIFIER_t *st, asn_oid_arc_t *arcs, size_t arc_slots) { - asn_oid_arc_t arc0, arc1; + asn_oid_arc_t arc0 = 0; + asn_oid_arc_t arc1 = 0; size_t num_arcs = 0; size_t off; ssize_t rd; @@ -588,69 +530,3 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, errno = EINVAL; /* Broken OID */ return -1; } - -/* - * Generate values from the list of interesting values, or just a random - * value up to the upper limit. - */ -static asn_oid_arc_t -OBJECT_IDENTIFIER__biased_random_arc(asn_oid_arc_t upper_bound) { - const asn_oid_arc_t values[] = {0, 1, 127, 128, 129, 254, 255, 256}; - size_t idx; - - switch(asn_random_between(0, 2)) { - case 0: - idx = asn_random_between(0, sizeof(values) / sizeof(values[0]) - 1); - if(values[idx] < upper_bound) { - return values[idx]; - } - /* Fall through */ - case 1: - return asn_random_between(0, upper_bound); - case 2: - default: - return upper_bound; - } -} - -asn_random_fill_result_t -OBJECT_IDENTIFIER_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, - const asn_encoding_constraints_t *constraints, - size_t max_length) { - 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}; - OBJECT_IDENTIFIER_t *st; - asn_oid_arc_t arcs[5]; - size_t arcs_len = asn_random_between(2, 5); - size_t i; - - (void)constraints; - - if(max_length < arcs_len) return result_skipped; - - if(*sptr) { - st = *sptr; - } else { - st = CALLOC(1, sizeof(*st)); - } - - arcs[0] = asn_random_between(0, 2); - arcs[1] = OBJECT_IDENTIFIER__biased_random_arc( - arcs[0] <= 1 ? 39 : (ASN_OID_ARC_MAX - 80)); - for(i = 2; i < arcs_len; i++) { - arcs[i] = OBJECT_IDENTIFIER__biased_random_arc(ASN_OID_ARC_MAX); - } - - if(OBJECT_IDENTIFIER_set_arcs(st, arcs, arcs_len)) { - if(st != *sptr) { - ASN_STRUCT_FREE(*td, st); - } - return result_failed; - } - - *sptr = st; - - result_ok.length = st->size; - return result_ok; -} diff --git a/e2sm/lib/OBJECT_IDENTIFIER_jer.c b/e2sm/lib/OBJECT_IDENTIFIER_jer.c new file mode 100644 index 0000000..f105f03 --- /dev/null +++ b/e2sm/lib/OBJECT_IDENTIFIER_jer.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + + +asn_enc_rval_t +OBJECT_IDENTIFIER_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; + asn_enc_rval_t er = {0,0,0}; + + (void)ilevel; + (void)flags; + + if(!st || !st->buf) { + ASN__ENCODE_FAILED; + } + + er.encoded = OBJECT_IDENTIFIER__dump_body(st, cb, app_key); + if(er.encoded < 0) ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/OBJECT_IDENTIFIER_print.c b/e2sm/lib/OBJECT_IDENTIFIER_print.c new file mode 100644 index 0000000..b0c3a9e --- /dev/null +++ b/e2sm/lib/OBJECT_IDENTIFIER_print.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +int +OBJECT_IDENTIFIER_print(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, asn_app_consume_bytes_f *cb, + void *app_key) { + const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(!st || !st->buf) + return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb("{ ", 2, app_key) < 0) + return -1; + + if(OBJECT_IDENTIFIER__dump_body(st, cb, app_key) < 0) { + return -1; + } + + return (cb(" }", 2, app_key) < 0) ? -1 : 0; +} diff --git a/e2sm/lib/OBJECT_IDENTIFIER_rfill.c b/e2sm/lib/OBJECT_IDENTIFIER_rfill.c new file mode 100644 index 0000000..55093c8 --- /dev/null +++ b/e2sm/lib/OBJECT_IDENTIFIER_rfill.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Generate values from the list of interesting values, or just a random + * value up to the upper limit. + */ +static asn_oid_arc_t +OBJECT_IDENTIFIER__biased_random_arc(asn_oid_arc_t upper_bound) { + const asn_oid_arc_t values[] = {0, 1, 127, 128, 129, 254, 255, 256}; + size_t idx; + + switch(asn_random_between(0, 2)) { + case 0: + idx = asn_random_between(0, sizeof(values) / sizeof(values[0]) - 1); + if(values[idx] < upper_bound) { + return values[idx]; + } + /* Fall through */ + case 1: + return asn_random_between(0, upper_bound); + case 2: + default: + return upper_bound; + } +} + +asn_random_fill_result_t +OBJECT_IDENTIFIER_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + 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}; + OBJECT_IDENTIFIER_t *st; + asn_oid_arc_t arcs[5]; + size_t arcs_len = asn_random_between(2, 5); + size_t i; + + (void)constraints; + + if(max_length < arcs_len) return result_skipped; + + if(*sptr) { + st = *sptr; + } else { + st = CALLOC(1, sizeof(*st)); + } + + arcs[0] = asn_random_between(0, 2); + arcs[1] = OBJECT_IDENTIFIER__biased_random_arc( + arcs[0] <= 1 ? 39 : (ASN_OID_ARC_MAX - 80)); + for(i = 2; i < arcs_len; i++) { + arcs[i] = OBJECT_IDENTIFIER__biased_random_arc(ASN_OID_ARC_MAX); + } + + if(OBJECT_IDENTIFIER_set_arcs(st, arcs, arcs_len)) { + if(st != *sptr) { + ASN_STRUCT_FREE(*td, st); + } + return result_failed; + } + + *sptr = st; + + result_ok.length = st->size; + return result_ok; +} diff --git a/e2sm/lib/OBJECT_IDENTIFIER_xer.c b/e2sm/lib/OBJECT_IDENTIFIER_xer.c new file mode 100644 index 0000000..706e51a --- /dev/null +++ b/e2sm/lib/OBJECT_IDENTIFIER_xer.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +static enum xer_pbd_rval +OBJECT_IDENTIFIER__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, + const void *chunk_buf, size_t chunk_size) { + OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)sptr; + const char *chunk_end = (const char *)chunk_buf + chunk_size; + const char *endptr; + asn_oid_arc_t s_arcs[10]; + asn_oid_arc_t *arcs = s_arcs; + ssize_t num_arcs; + ssize_t ret; + + (void)td; + + num_arcs = OBJECT_IDENTIFIER_parse_arcs( + (const char *)chunk_buf, chunk_size, arcs, + sizeof(s_arcs) / sizeof(s_arcs[0]), &endptr); + if(num_arcs < 0) { + /* Expecting more than zero arcs */ + return XPBD_BROKEN_ENCODING; + } else if(num_arcs == 0) { + return XPBD_NOT_BODY_IGNORE; + } + (void)chunk_end; + assert(endptr == chunk_end); + + if((size_t)num_arcs > sizeof(s_arcs)/sizeof(s_arcs[0])) { + arcs = (asn_oid_arc_t *)MALLOC(num_arcs * sizeof(asn_oid_arc_t)); + if(!arcs) return XPBD_SYSTEM_FAILURE; + ret = OBJECT_IDENTIFIER_parse_arcs((const char *)chunk_buf, chunk_size, + arcs, num_arcs, &endptr); + if(ret != num_arcs) + return XPBD_SYSTEM_FAILURE; /* assert?.. */ + } + + /* + * Convert arcs into BER representation. + */ + ret = OBJECT_IDENTIFIER_set_arcs(st, arcs, num_arcs); + if(arcs != s_arcs) FREEMEM(arcs); + + return ret ? XPBD_SYSTEM_FAILURE : XPBD_BODY_CONSUMED; +} + +asn_dec_rval_t +OBJECT_IDENTIFIER_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(OBJECT_IDENTIFIER_t), opt_mname, + buf_ptr, size, OBJECT_IDENTIFIER__xer_body_decode); +} + +asn_enc_rval_t +OBJECT_IDENTIFIER_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 OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; + asn_enc_rval_t er = {0,0,0}; + + (void)ilevel; + (void)flags; + + if(!st || !st->buf) { + ASN__ENCODE_FAILED; + } + + er.encoded = OBJECT_IDENTIFIER__dump_body(st, cb, app_key); + if(er.encoded < 0) ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/OCTET_STRING.c b/e2sm/lib/OCTET_STRING.c index ae34c96..d0bdead 100644 --- a/e2sm/lib/OCTET_STRING.c +++ b/e2sm/lib/OCTET_STRING.c @@ -5,2088 +5,105 @@ */ #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_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 + 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, + OCTET_STRING_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OCTET_STRING_print, /* OCTET STRING generally means a non-ascii sequence */ +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, + OCTET_STRING_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_hex, + OCTET_STRING_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_encode_jer, #else - OCTET_STRING_decode_oer, - OCTET_STRING_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + OCTET_STRING_decode_oer, + OCTET_STRING_encode_oer, #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OCTET_STRING_decode_uper, /* Unaligned PER decoder */ + OCTET_STRING_encode_uper, /* Unaligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, /* Aligned PER decoder */ + OCTET_STRING_encode_aper, /* Aligned PER encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + OCTET_STRING_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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 + "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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_no_constraint + }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs }; -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) { @@ -2094,18 +111,29 @@ OCTET_STRING_free(const asn_TYPE_descriptor_t *td, void *sptr, 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); - } +#if !defined(ASN_DISABLE_BER_SUPPORT) + const asn_OCTET_STRING_specifics_t *specs; + asn_struct_ctx_t *ctx; + + 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); + + /* + * Remove decode-time stack. + */ + struct _stack *stck; + stck = (struct _stack *)ctx->ptr; + if(stck) { + while(stck->tail) { + struct _stack_el *sel = stck->tail; + stck->tail = sel->prev; + FREEMEM(sel); + } + FREEMEM(stck); + } +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ switch(method) { case ASFM_FREE_EVERYTHING: @@ -2191,6 +219,7 @@ OCTET_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const OCTET_STRING_t *a = aptr; const OCTET_STRING_t *b = bptr; + (void)specs; assert(!specs || specs->subvariant != ASN_OSUBV_BIT); if(a && b) { @@ -2218,194 +247,137 @@ OCTET_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, } -/* - * 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 !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) +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 */ } - 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); + 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; } - } else { - rnd_len = asn_random_between(0, max_length); } - } else if(rnd_len > max_length) { - rnd_len = asn_random_between(0, max_length); + return 0; } - 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; + /* 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); } - 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; + 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; } } - 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]; + return 0; +} - 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; +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; } - *(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; - } + /* 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); } - st->buf = buf; - st->size = unit_bytes * rnd_len; + 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; + } - result_ok.length = st->size; - return result_ok; + return 0; } +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ diff --git a/e2sm/lib/OCTET_STRING_aper.c b/e2sm/lib/OCTET_STRING_aper.c new file mode 100644 index 0000000..0373fe6 --- /dev/null +++ b/e2sm/lib/OCTET_STRING_aper.c @@ -0,0 +1,414 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ + +#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_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_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 %lld .. %lld bits %d", + csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible", + (long long int)csiz->lower_bound, (long long int)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; + /* X.691 #16 NOTE 1 for fixed length (<= 16 bits) strings */ + if (st->size > 2 || csiz->range_bits != 0) { + if (aper_get_align(pd) < 0) + RETURN(RC_FAIL); + } + if(bpc) { + ASN_DEBUG("Decoding OCTET STRING size %lld", + (long long int)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 %lld", + (long long int)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; + + repeat = 0; + /* Get the PER length */ + if (csiz->upper_bound - csiz->lower_bound == 0) + /* Indefinite length case */ + raw_len = aper_get_length(pd, -1, -1, csiz->effective_bits, &repeat); + else + raw_len = aper_get_length(pd, csiz->lower_bound, csiz->upper_bound, + csiz->effective_bits, &repeat); + 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); + + /* X.691 #16 NOTE 1 for fixed length (<=16 bits) strings */ + if ((raw_len > 2) || (csiz->upper_bound > 2) || (csiz->range_bits != 0)) + { + 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" + " (%lld..%lld, effective %d)%s", + td->name, sizeinunits, unit_bits, + (long long int)csiz->lower_bound, + (long long int)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 %zu bytes (%lld), length in %d bits", + st->size, (long long int)(sizeinunits - csiz->lower_bound), + csiz->effective_bits); + if (csiz->effective_bits > 0) { + ret = aper_put_length(po, csiz->lower_bound, csiz->upper_bound, + sizeinunits - csiz->lower_bound, NULL); + if(ret < 0) ASN__ENCODE_FAILED; + } + if (csiz->effective_bits > 0 || (st->size > 2) + || (csiz->upper_bound > (2 * 8 / unit_bits)) + || (csiz->range_bits != 0)) + { /* X.691 #16 NOTE 1 for fixed length (<=16 bits) strings*/ + 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 %zu bytes", st->size); + + if(sizeinunits == 0) { + if(aper_put_length(po, -1, -1, 0, NULL) < 0) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + buf = st->buf; + while(sizeinunits) { + int need_eom = 0; + ssize_t maySave = aper_put_length(po, -1, -1, sizeinunits, &need_eom); + + 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); + if(need_eom && (aper_put_length(po, -1, -1, 0, NULL) < 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + } + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/OCTET_STRING_ber.c b/e2sm/lib/OCTET_STRING_ber.c new file mode 100644 index 0000000..9530eae --- /dev/null +++ b/e2sm/lib/OCTET_STRING_ber.c @@ -0,0 +1,525 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ + +#undef _CH_PHASE +#define _CH_PHASE(ctx, inc) do {\ + if(ctx->phase == 0)\ + ctx->context = 0;\ + ctx->phase += inc;\ + } while(0) + +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) _CH_PHASE(ctx, +1) +#undef PREV_PHASE +#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 acquired skill everywhere afterwards. + * No, I am not going to explain what the following stuff is. + */ +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; +} diff --git a/e2sm/lib/OCTET_STRING_jer.c b/e2sm/lib/OCTET_STRING_jer.c new file mode 100644 index 0000000..d744cc3 --- /dev/null +++ b/e2sm/lib/OCTET_STRING_jer.c @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ + +asn_enc_rval_t +OCTET_STRING_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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; + ASN__CALLBACK("\"", 1); + for(i = 0; buf < end; buf++, i++) { + if(!(i % 16) && (i || st->size > 16)) { + ASN__CALLBACK(scratch, p-scratch); + p = scratch; + } + *p++ = h2c[(*buf >> 4) & 0x0F]; + *p++ = h2c[*buf & 0x0F]; + } + if(p - scratch) { + ASN__CALLBACK(scratch, p-scratch); /* Dump the rest */ + } + ASN__CALLBACK("\"", 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +static const struct OCTET_STRING__jer_escape_table_s { + const char *string; + int size; +} OCTET_STRING__jer_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"), /* > */ +}; + +asn_enc_rval_t +OCTET_STRING_encode_jer_utf8(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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__jer_escape_table) + / sizeof(OCTET_STRING__jer_escape_table[0]) + && (s_len = OCTET_STRING__jer_escape_table[ch].size)) { + if(((buf - ss) && cb(ss, buf - ss, app_key) < 0) + || cb(OCTET_STRING__jer_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); +} + diff --git a/e2sm/lib/OCTET_STRING_oer.c b/e2sm/lib/OCTET_STRING_oer.c index c16faea..e69d0a6 100644 --- a/e2sm/lib/OCTET_STRING_oer.c +++ b/e2sm/lib/OCTET_STRING_oer.c @@ -3,11 +3,8 @@ * 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, @@ -167,5 +164,3 @@ OCTET_STRING_encode_oer(const asn_TYPE_descriptor_t *td, ASN__ENCODED_OK(er); } } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2sm/lib/OCTET_STRING_print.c b/e2sm/lib/OCTET_STRING_print.c new file mode 100644 index 0000000..6daa33e --- /dev/null +++ b/e2sm/lib/OCTET_STRING_print.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 == NULL)? NULL : 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; + } +} diff --git a/e2sm/lib/OCTET_STRING_rfill.c b/e2sm/lib/OCTET_STRING_rfill.c new file mode 100644 index 0000000..5c8b064 --- /dev/null +++ b/e2sm/lib/OCTET_STRING_rfill.c @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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); + } +} + +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 !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 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; + } + } +#else + if(!constraints) constraints = &td->encoding_constraints; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + + 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; +} + +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 !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 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 { +#else + if(!constraints) constraints = &td->encoding_constraints; + { +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + if(rnd_len > max_length) { + rnd_len = asn_random_between(0, max_length); + } + } + + return rnd_len; +} diff --git a/e2sm/lib/OCTET_STRING_uper.c b/e2sm/lib/OCTET_STRING_uper.c new file mode 100644 index 0000000..80130ca --- /dev/null +++ b/e2sm/lib/OCTET_STRING_uper.c @@ -0,0 +1,319 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ + +#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_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); +} diff --git a/e2sm/lib/OCTET_STRING_xer.c b/e2sm/lib/OCTET_STRING_xer.c new file mode 100644 index 0000000..490f362 --- /dev/null +++ b/e2sm/lib/OCTET_STRING_xer.c @@ -0,0 +1,627 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ + +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 == NULL)? NULL : 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); +} diff --git a/e2sm/lib/OCUCP-PF-Container.c b/e2sm/lib/OCUCP-PF-Container.c deleted file mode 100644 index e71aefd..0000000 --- a/e2sm/lib/OCUCP-PF-Container.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/OCUUP-PF-Container.c b/e2sm/lib/OCUUP-PF-Container.c deleted file mode 100644 index ea7d6bc..0000000 --- a/e2sm/lib/OCUUP-PF-Container.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/ODU-PF-Container.c b/e2sm/lib/ODU-PF-Container.c deleted file mode 100644 index fde90d1..0000000 --- a/e2sm/lib/ODU-PF-Container.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/OPEN_TYPE.c b/e2sm/lib/OPEN_TYPE.c index a54e99c..c9afecf 100644 --- a/e2sm/lib/OPEN_TYPE.c +++ b/e2sm/lib/OPEN_TYPE.c @@ -5,505 +5,59 @@ #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 */ + OPEN_TYPE_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OPEN_TYPE_print, #else - OPEN_TYPE_decode_oer, - OPEN_TYPE_encode_oer, -#endif -#ifdef ASN_DISABLE_PER_SUPPORT - 0, 0, 0, 0, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OPEN_TYPE_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OPEN_TYPE_decode_ber, + OPEN_TYPE_encode_der, #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OPEN_TYPE_decode_xer, + OPEN_TYPE_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OPEN_TYPE_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + OPEN_TYPE_decode_oer, + OPEN_TYPE_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OPEN_TYPE_decode_uper, + OPEN_TYPE_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OPEN_TYPE_decode_aper, + OPEN_TYPE_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + 0, /* Random fill is not supported for open type */ +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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/e2sm/lib/OPEN_TYPE_aper.c b/e2sm/lib/OPEN_TYPE_aper.c new file mode 100644 index 0000000..3e2ab18 --- /dev/null +++ b/e2sm/lib/OPEN_TYPE_aper.c @@ -0,0 +1,173 @@ +/* + * 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_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); +} + + +int OPEN_TYPE_aper_is_unknown_type(const asn_TYPE_descriptor_t *td, void *sptr, const asn_TYPE_member_t *elm) { + asn_type_selector_result_t selected; + + if(!elm->type_selector) { + return 1; + } + else { + selected = elm->type_selector(td, sptr); + if(!selected.presence_index) { + return 1; + } + } + return 0; +} + +asn_dec_rval_t +OPEN_TYPE_aper_unknown_type_discard_bytes (asn_per_data_t *pd) { +#define ASN_DUMMY_BYTES 256 + unsigned char dummy[ASN_DUMMY_BYTES], *dummy_ptr = NULL; + ssize_t bytes; + int repeat; + asn_dec_rval_t rv; + + rv.consumed = 0; + rv.code = RC_FAIL; + + do { + bytes = aper_get_length(pd, -1, -1, -1, &repeat); + if (bytes > 10 * ASN_DUMMY_BYTES) + { + return rv; + } + else if (bytes > ASN_DUMMY_BYTES) + { + dummy_ptr = CALLOC(1, bytes); + if (!dummy_ptr) + return rv; + } + + per_get_many_bits(pd, (dummy_ptr ? dummy_ptr : dummy), 0, bytes << 3); + + if (dummy_ptr) + { + FREEMEM(dummy_ptr); + dummy_ptr = NULL; + } + } while (repeat); + + rv.code = RC_OK; + return rv; +#undef ASN_DUMMY_BYTES +} diff --git a/e2sm/lib/OPEN_TYPE_ber.c b/e2sm/lib/OPEN_TYPE_ber.c new file mode 100644 index 0000000..7d89480 --- /dev/null +++ b/e2sm/lib/OPEN_TYPE_ber.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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; +} diff --git a/e2sm/lib/OPEN_TYPE_oer.c b/e2sm/lib/OPEN_TYPE_oer.c index dd2f5c6..05a5eaa 100644 --- a/e2sm/lib/OPEN_TYPE_oer.c +++ b/e2sm/lib/OPEN_TYPE_oer.c @@ -5,7 +5,6 @@ #include #include #include -#include asn_dec_rval_t OPEN_TYPE_oer_get(const asn_codec_ctx_t *opt_codec_ctx, diff --git a/e2sm/lib/OPEN_TYPE_uper.c b/e2sm/lib/OPEN_TYPE_uper.c new file mode 100644 index 0000000..2f27bb9 --- /dev/null +++ b/e2sm/lib/OPEN_TYPE_uper.c @@ -0,0 +1,119 @@ +/* + * 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_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); +} diff --git a/e2sm/lib/OPEN_TYPE_xer.c b/e2sm/lib/OPEN_TYPE_xer.c new file mode 100644 index 0000000..fc38562 --- /dev/null +++ b/e2sm/lib/OPEN_TYPE_xer.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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; +} diff --git a/e2sm/lib/ObjectDescriptor.c b/e2sm/lib/ObjectDescriptor.c index 5d8bfb2..c311a92 100644 --- a/e2sm/lib/ObjectDescriptor.c +++ b/e2sm/lib/ObjectDescriptor.c @@ -9,50 +9,83 @@ * ObjectDescriptor basic type description. */ static const ber_tlv_tag_t asn_DEF_ObjectDescriptor_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)), /* [UNIVERSAL 7] IMPLICIT ... */ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ + (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)), /* [UNIVERSAL 7] IMPLICIT ... */ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_operation_t asn_OP_ObjectDescriptor = { - OCTET_STRING_free, - OCTET_STRING_print_utf8, /* Treat as ASCII subset (it's not) */ - 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 - 0, - 0, -#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 */ - 0, /* Not supported for ObjectDescriptor */ - 0 /* Use generic outmost tag fetcher */ + OCTET_STRING_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OCTET_STRING_print_utf8, /* Treat as ASCII subset (it's not) */ +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_encode_jer_utf8, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, + 0, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, + OCTET_STRING_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + 0, /* Not supported for ObjectDescriptor */ +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ }; asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor = { - "ObjectDescriptor", - "ObjectDescriptor", - &asn_OP_ObjectDescriptor, - asn_DEF_ObjectDescriptor_tags, - sizeof(asn_DEF_ObjectDescriptor_tags) - / sizeof(asn_DEF_ObjectDescriptor_tags[0]) - 1, - asn_DEF_ObjectDescriptor_tags, - sizeof(asn_DEF_ObjectDescriptor_tags) - / sizeof(asn_DEF_ObjectDescriptor_tags[0]), - { 0, 0, asn_generic_unknown_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ + "ObjectDescriptor", + "ObjectDescriptor", + &asn_OP_ObjectDescriptor, + asn_DEF_ObjectDescriptor_tags, + sizeof(asn_DEF_ObjectDescriptor_tags) + / sizeof(asn_DEF_ObjectDescriptor_tags[0]) - 1, + asn_DEF_ObjectDescriptor_tags, + sizeof(asn_DEF_ObjectDescriptor_tags) + / sizeof(asn_DEF_ObjectDescriptor_tags[0]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_unknown_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ }; - diff --git a/e2sm/lib/PF-Container.c b/e2sm/lib/PF-Container.c deleted file mode 100644 index b380786..0000000 --- a/e2sm/lib/PF-Container.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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 | 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_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, - 3 /* 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/e2sm/lib/PF-ContainerListItem.c b/e2sm/lib/PF-ContainerListItem.c deleted file mode 100644 index 3c3df6f..0000000 --- a/e2sm/lib/PF-ContainerListItem.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/PLMN-Identity.c b/e2sm/lib/PLMN-Identity.c deleted file mode 100644 index 5ebacad..0000000 --- a/e2sm/lib/PLMN-Identity.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/PLMNIdentity.c b/e2sm/lib/PLMNIdentity.c index d375735..0997f3b 100644 --- a/e2sm/lib/PLMNIdentity.c +++ b/e2sm/lib/PLMNIdentity.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "PLMNIdentity.h" @@ -22,7 +22,7 @@ PLMNIdentity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size == 3)) { + if((size == 3UL)) { /* Constraint check succeeded */ return 0; } else { @@ -37,11 +37,18 @@ PLMNIdentity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_PLMNIdentity_constr_1 CC_NOTUSED = { + { 0, 0 }, + 3 /* (SIZE(3..3)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_PLMNIdentity_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_PLMNIdentity_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; @@ -55,7 +62,15 @@ asn_TYPE_descriptor_t asn_DEF_PLMNIdentity = { asn_DEF_PLMNIdentity_tags_1, /* Same as above */ sizeof(asn_DEF_PLMNIdentity_tags_1) /sizeof(asn_DEF_PLMNIdentity_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_PLMNIdentity_constr_1, PLMNIdentity_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_PLMNIdentity_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_PLMNIdentity_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + PLMNIdentity_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/PM-Containers-List.c b/e2sm/lib/PM-Containers-List.c deleted file mode 100644 index 2a4b953..0000000 --- a/e2sm/lib/PM-Containers-List.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "PM-Containers-List.h" - -#include "PF-Container.h" -#include "RAN-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/e2sm/lib/PerQCIReportListItem.c b/e2sm/lib/PerQCIReportListItem.c deleted file mode 100644 index b420e15..0000000 --- a/e2sm/lib/PerQCIReportListItem.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/PerQCIReportListItemFormat.c b/e2sm/lib/PerQCIReportListItemFormat.c deleted file mode 100644 index d95ad56..0000000 --- a/e2sm/lib/PerQCIReportListItemFormat.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/PlmnID-List.c b/e2sm/lib/PlmnID-List.c deleted file mode 100644 index 210c424..0000000 --- a/e2sm/lib/PlmnID-List.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/PrintableString.c b/e2sm/lib/PrintableString.c index 8fc3939..f046f12 100644 --- a/e2sm/lib/PrintableString.c +++ b/e2sm/lib/PrintableString.c @@ -30,68 +30,103 @@ static const int _PrintableString_code2value[74] = { * 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 */ + (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)), /* [UNIVERSAL 19] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static int asn_DEF_PrintableString_v2c(unsigned int value) { - return _PrintableString_alphabet[value > 255 ? 0 : value] - 1; + 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; + 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 + { APC_CONSTRAINED, 4, 4, 0x20, 0x39 }, /* Value */ + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ + asn_DEF_PrintableString_v2c, + asn_DEF_PrintableString_c2v }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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, + OCTET_STRING_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + OCTET_STRING_print_utf8, /* ASCII subset */ #else - OCTET_STRING_decode_oer, - OCTET_STRING_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + OCTET_STRING_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, #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 */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + OCTET_STRING_encode_jer_utf8, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + OCTET_STRING_decode_oer, + OCTET_STRING_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + OCTET_STRING_decode_aper, + OCTET_STRING_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + OCTET_STRING_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 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 */ + "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]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_DEF_PrintableString_per_constraints, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 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, diff --git a/e2sm/lib/QCI.c b/e2sm/lib/QCI.c index 75e4c56..ae12699 100644 --- a/e2sm/lib/QCI.c +++ b/e2sm/lib/QCI.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "QCI.h" @@ -21,7 +21,7 @@ QCI_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 255)) { + if((value >= 0L && value <= 255L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ QCI_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_QCI_constr_1 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_QCI_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_QCI_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_QCI = { asn_DEF_QCI_tags_1, /* Same as above */ sizeof(asn_DEF_QCI_tags_1) /sizeof(asn_DEF_QCI_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_QCI_constr_1, QCI_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_QCI_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_QCI_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + QCI_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/QoSID.c b/e2sm/lib/QoSID.c index bae6079..b14a5e5 100644 --- a/e2sm/lib/QoSID.c +++ b/e2sm/lib/QoSID.c @@ -1,24 +1,39 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "QoSID.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_QoSID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_QoSID_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_QoSID_1[] = { { ATF_NOFLAGS, 0, offsetof(struct QoSID, choice.fiveGC), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FiveQI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "fiveGC" }, @@ -27,7 +42,15 @@ static asn_TYPE_member_t asn_MBR_QoSID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_QCI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ePC" }, @@ -54,7 +77,15 @@ asn_TYPE_descriptor_t asn_DEF_QoSID = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_QoSID_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_QoSID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_QoSID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_QoSID_1, 2, /* Elements count */ &asn_SPC_QoSID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/QosFlowIdentifier.c b/e2sm/lib/QosFlowIdentifier.c index a24d12a..ce5d086 100644 --- a/e2sm/lib/QosFlowIdentifier.c +++ b/e2sm/lib/QosFlowIdentifier.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "QosFlowIdentifier.h" @@ -21,7 +21,7 @@ QosFlowIdentifier_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= 0 && value <= 63)) { + if((value >= 0L && value <= 63L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ QosFlowIdentifier_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_QosFlowIdentifier_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_QosFlowIdentifier_constr_1 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 6, 6, 0, 63 } /* (0..63,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_QosFlowIdentifier_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_QosFlowIdentifier = { asn_DEF_QosFlowIdentifier_tags_1, /* Same as above */ sizeof(asn_DEF_QosFlowIdentifier_tags_1) /sizeof(asn_DEF_QosFlowIdentifier_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_QosFlowIdentifier_constr_1, QosFlowIdentifier_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_QosFlowIdentifier_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_QosFlowIdentifier_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + QosFlowIdentifier_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/RAN-Container.c b/e2sm/lib/RAN-Container.c deleted file mode 100644 index d0ee73f..0000000 --- a/e2sm/lib/RAN-Container.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "RAN-Container.h" - -#include "DU-Usage-Report-Per-UE.h" -#include "CU-CP-Usage-Report-Per-UE.h" -#include "CU-UP-Usage-Report-Per-UE.h" -static asn_oer_constraints_t asn_OER_type_reportContainer_constr_3 CC_NOTUSED = { - { 0, 0 }, - -1}; -static asn_per_constraints_t asn_PER_type_reportContainer_constr_3 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_reportContainer_3[] = { - { ATF_POINTER, 0, offsetof(struct RAN_Container__reportContainer, choice.oDU_UE), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_DU_Usage_Report_Per_UE, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "oDU-UE" - }, - { ATF_POINTER, 0, offsetof(struct RAN_Container__reportContainer, choice.oCU_CP_UE), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_CU_CP_Usage_Report_Per_UE, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "oCU-CP-UE" - }, - { ATF_POINTER, 0, offsetof(struct RAN_Container__reportContainer, choice.oCU_UP_UE), - (ASN_TAG_CLASS_CONTEXT | (2 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_CU_UP_Usage_Report_Per_UE, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "oCU-UP-UE" - }, -}; -static const asn_TYPE_tag2member_t asn_MAP_reportContainer_tag2el_3[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* oDU-UE */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* oCU-CP-UE */ - { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* oCU-UP-UE */ -}; -static asn_CHOICE_specifics_t asn_SPC_reportContainer_specs_3 = { - sizeof(struct RAN_Container__reportContainer), - offsetof(struct RAN_Container__reportContainer, _asn_ctx), - offsetof(struct RAN_Container__reportContainer, present), - sizeof(((struct RAN_Container__reportContainer *)0)->present), - asn_MAP_reportContainer_tag2el_3, - 3, /* Count of tags in the map */ - 0, 0, - 3 /* Extensions start */ -}; -static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_reportContainer_3 = { - "reportContainer", - "reportContainer", - &asn_OP_CHOICE, - 0, /* No effective tags (pointer) */ - 0, /* No effective tags (count) */ - 0, /* No tags (pointer) */ - 0, /* No tags (count) */ - { &asn_OER_type_reportContainer_constr_3, &asn_PER_type_reportContainer_constr_3, CHOICE_constraint }, - asn_MBR_reportContainer_3, - 3, /* Elements count */ - &asn_SPC_reportContainer_specs_3 /* Additional specs */ -}; - -asn_TYPE_member_t asn_MBR_RAN_Container_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct RAN_Container, timestamp), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_Timestamp, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "timestamp" - }, - { ATF_NOFLAGS, 0, offsetof(struct RAN_Container, reportContainer), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - +1, /* EXPLICIT tag at current level */ - &asn_DEF_reportContainer_3, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "reportContainer" - }, -}; -static const ber_tlv_tag_t asn_DEF_RAN_Container_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_RAN_Container_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* timestamp */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* reportContainer */ -}; -asn_SEQUENCE_specifics_t asn_SPC_RAN_Container_specs_1 = { - sizeof(struct RAN_Container), - offsetof(struct RAN_Container, _asn_ctx), - asn_MAP_RAN_Container_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_RAN_Container = { - "RAN-Container", - "RAN-Container", - &asn_OP_SEQUENCE, - 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, SEQUENCE_constraint }, - asn_MBR_RAN_Container_1, - 2, /* Elements count */ - &asn_SPC_RAN_Container_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/RANUEID.c b/e2sm/lib/RANUEID.c index 11bbdfe..88ad3de 100644 --- a/e2sm/lib/RANUEID.c +++ b/e2sm/lib/RANUEID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RANUEID.h" @@ -22,7 +22,7 @@ RANUEID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size == 8)) { + if((size == 8UL)) { /* Constraint check succeeded */ return 0; } else { @@ -37,11 +37,18 @@ RANUEID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_RANUEID_constr_1 CC_NOTUSED = { + { 0, 0 }, + 8 /* (SIZE(8..8)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_RANUEID_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 8, 8 } /* (SIZE(8..8)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_RANUEID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; @@ -55,7 +62,15 @@ asn_TYPE_descriptor_t asn_DEF_RANUEID = { asn_DEF_RANUEID_tags_1, /* Same as above */ sizeof(asn_DEF_RANUEID_tags_1) /sizeof(asn_DEF_RANUEID_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_RANUEID_constr_1, RANUEID_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RANUEID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RANUEID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + RANUEID_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/RANfunction-Name.c b/e2sm/lib/RANfunction-Name.c index cc349e4..f81ba38 100644 --- a/e2sm/lib/RANfunction-Name.c +++ b/e2sm/lib/RANfunction-Name.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RANfunction-Name.h" @@ -118,7 +118,7 @@ memb_ranFunction_ShortName_constraint_1(const asn_TYPE_descriptor_t *td, const v size = st->size; - if((size >= 1 && size <= 150) + if((size >= 1UL && size <= 150UL) && !check_permitted_alphabet_2(st)) { /* Constraint check succeeded */ return 0; @@ -155,7 +155,7 @@ memb_ranFunction_E2SM_OID_constraint_1(const asn_TYPE_descriptor_t *td, const vo size = st->size; - if((size >= 1 && size <= 1000) + if((size >= 1UL && size <= 1000UL) && !check_permitted_alphabet_3(st)) { /* Constraint check succeeded */ return 0; @@ -192,7 +192,7 @@ memb_ranFunction_Description_constraint_1(const asn_TYPE_descriptor_t *td, const size = st->size; - if((size >= 1 && size <= 150) + if((size >= 1UL && size <= 150UL) && !check_permitted_alphabet_4(st)) { /* Constraint check succeeded */ return 0; @@ -214,31 +214,60 @@ static int asn_PER_MAP_ranFunction_Description_4_c2v(unsigned int code) { return -1; return permitted_alphabet_code2value_4[code]; } +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_ranFunction_ShortName_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_ranFunction_E2SM_OID_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_memb_ranFunction_Description_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ 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, - { 0, &asn_PER_memb_ranFunction_ShortName_constr_2, memb_ranFunction_ShortName_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_ranFunction_ShortName_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_ranFunction_ShortName_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_ranFunction_ShortName_constraint_1 + }, 0, 0, /* No default value */ "ranFunction-ShortName" }, @@ -247,7 +276,15 @@ asn_TYPE_member_t asn_MBR_RANfunction_Name_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PrintableString, 0, - { 0, &asn_PER_memb_ranFunction_E2SM_OID_constr_3, memb_ranFunction_E2SM_OID_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_ranFunction_E2SM_OID_constr_3, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_ranFunction_E2SM_OID_constr_3, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_ranFunction_E2SM_OID_constraint_1 + }, 0, 0, /* No default value */ "ranFunction-E2SM-OID" }, @@ -256,7 +293,15 @@ asn_TYPE_member_t asn_MBR_RANfunction_Name_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PrintableString, 0, - { 0, &asn_PER_memb_ranFunction_Description_constr_4, memb_ranFunction_Description_constraint_1 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_memb_ranFunction_Description_constr_4, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_memb_ranFunction_Description_constr_4, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + memb_ranFunction_Description_constraint_1 + }, 0, 0, /* No default value */ "ranFunction-Description" }, @@ -265,7 +310,15 @@ asn_TYPE_member_t asn_MBR_RANfunction_Name_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ranFunction-Instance" }, @@ -299,7 +352,15 @@ asn_TYPE_descriptor_t asn_DEF_RANfunction_Name = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RANfunction_Name_1, 4, /* Elements count */ &asn_SPC_RANfunction_Name_specs_1 /* Additional specs */ diff --git a/e2sm/lib/REAL.c b/e2sm/lib/REAL.c index e3daf37..a551fe5 100644 --- a/e2sm/lib/REAL.c +++ b/e2sm/lib/REAL.c @@ -2,33 +2,21 @@ * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ -#define _ISOC99_SOURCE /* For ilogb() and quiet NAN */ -#ifndef _BSD_SOURCE -#define _BSD_SOURCE /* To reintroduce finite(3) */ -#endif #include -#if defined(__alpha) -#include /* For INFINITY */ -#endif #include /* for strtod(3) */ -#include -#include #include #include -#include #undef INT_MAX #define INT_MAX ((int)(((unsigned int)-1) >> 1)) -#if !(defined(NAN) || defined(INFINITY)) -static volatile double real_zero CC_NOTUSED = 0.0; -#endif -#ifndef NAN -#define NAN (0.0/0.0) -#endif -#ifndef INFINITY -#define INFINITY (1.0/0.0) -#endif +struct specialRealValue_s specialRealValue[] = { +#define SRV_SET(foo, val) { (char *)foo, sizeof(foo) - 1, val } + SRV_SET("", 0), + SRV_SET("", -1), + SRV_SET("", 1), +#undef SRV_SET +}; #if defined(__clang__) /* @@ -64,66 +52,82 @@ static int asn_isfinite(double d) { * REAL basic type description. */ static const ber_tlv_tag_t asn_DEF_REAL_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_operation_t asn_OP_REAL = { - ASN__PRIMITIVE_TYPE_free, - REAL_print, - REAL_compare, - ber_decode_primitive, - der_encode_primitive, - REAL_decode_xer, - REAL_encode_xer, -#ifdef ASN_DISABLE_OER_SUPPORT - 0, - 0, + ASN__PRIMITIVE_TYPE_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + REAL_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + REAL_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + ber_decode_primitive, + der_encode_primitive, #else - REAL_decode_oer, - REAL_encode_oer, -#endif /* ASN_DISABLE_OER_SUPPORT */ -#ifdef ASN_DISABLE_PER_SUPPORT - 0, - 0, - 0, - 0, + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + REAL_decode_xer, + REAL_encode_xer, #else - REAL_decode_uper, - REAL_encode_uper, - REAL_decode_aper, - REAL_encode_aper, -#endif /* ASN_DISABLE_PER_SUPPORT */ - REAL_random_fill, - 0 /* Use generic outmost tag fetcher */ + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + REAL_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + REAL_decode_oer, + REAL_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + REAL_decode_uper, + REAL_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + REAL_decode_aper, + REAL_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + REAL_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ }; asn_TYPE_descriptor_t asn_DEF_REAL = { - "REAL", - "REAL", - &asn_OP_REAL, - asn_DEF_REAL_tags, - sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]), - asn_DEF_REAL_tags, /* Same as above */ - sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]), - { 0, 0, asn_generic_no_constraint }, - 0, - 0, /* No members */ - 0 /* No specifics */ -}; - -typedef enum specialRealValue { - SRV__NOT_A_NUMBER, - SRV__MINUS_INFINITY, - SRV__PLUS_INFINITY -} specialRealValue_e; -static struct specialRealValue_s { - char *string; - size_t length; - long dv; -} specialRealValue[] = { -#define SRV_SET(foo, val) { foo, sizeof(foo) - 1, val } - SRV_SET("", 0), - SRV_SET("", -1), - SRV_SET("", 1), -#undef SRV_SET + "REAL", + "REAL", + &asn_OP_REAL, + asn_DEF_REAL_tags, + sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]), + asn_DEF_REAL_tags, /* Same as above */ + sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]), + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + asn_generic_no_constraint + }, + 0, 0, /* No members */ + 0 /* No specifics */ }; ssize_t @@ -131,7 +135,6 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) char local_buf[64]; char *buf = local_buf; ssize_t buflen = sizeof(local_buf); - const char *fmt = canonical ? "%.17E" /* Precise */ : "%.15f" /* Pleasant*/; ssize_t ret; /* @@ -166,7 +169,10 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) * Use the libc's double printing, hopefully they got it right. */ do { - ret = snprintf(buf, buflen, fmt, d); + ret = snprintf(buf, + buflen, + canonical ? "%.17E" /* Precise */ : "%.15f" /* Pleasant*/, + d); if(ret < 0) { /* There are some old broken APIs. */ buflen <<= 1; @@ -234,10 +240,11 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) assert(*s == 0x45); { + int sign; char *E = s; char *expptr = ++E; - char *s = expptr; - int sign; + + s = expptr; if(*expptr == 0x2b /* '+' */) { /* Skip the "+" */ @@ -309,26 +316,6 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) return (ret < 0) ? -1 : buflen; } -int -REAL_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, - asn_app_consume_bytes_f *cb, void *app_key) { - const REAL_t *st = (const REAL_t *)sptr; - ssize_t ret; - double d; - - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(!st || !st->buf) - ret = cb("", 8, app_key); - else if(asn_REAL2double(st, &d)) - ret = cb("", 7, app_key); - else - ret = REAL__dump(d, 0, cb, app_key); - - return (ret < 0) ? -1 : 0; -} - int REAL_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bptr) { @@ -372,104 +359,6 @@ REAL_compare(const asn_TYPE_descriptor_t *td, const void *aptr, } } -asn_enc_rval_t -REAL_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 REAL_t *st = (const REAL_t *)sptr; - asn_enc_rval_t er = {0,0,0}; - double d; - - (void)ilevel; - - if(!st || !st->buf || asn_REAL2double(st, &d)) - ASN__ENCODE_FAILED; - - er.encoded = REAL__dump(d, flags & XER_F_CANONICAL, cb, app_key); - if(er.encoded < 0) ASN__ENCODE_FAILED; - - ASN__ENCODED_OK(er); -} - - -/* - * Decode the chunk of XML text encoding REAL. - */ -static enum xer_pbd_rval -REAL__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, - const void *chunk_buf, size_t chunk_size) { - REAL_t *st = (REAL_t *)sptr; - double value; - const char *xerdata = (const char *)chunk_buf; - char *endptr = 0; - char *b; - - (void)td; - - if(!chunk_size) return XPBD_BROKEN_ENCODING; - - /* - * Decode an XMLSpecialRealValue: , etc. - */ - if(xerdata[0] == 0x3c /* '<' */) { - size_t i; - for(i = 0; i < sizeof(specialRealValue) - / sizeof(specialRealValue[0]); i++) { - struct specialRealValue_s *srv = &specialRealValue[i]; - double dv; - - if(srv->length != chunk_size - || memcmp(srv->string, chunk_buf, chunk_size)) - continue; - - /* - * It could've been done using - * (double)srv->dv / real_zero, - * but it summons fp exception on some platforms. - */ - switch(srv->dv) { - case -1: dv = - INFINITY; break; - case 0: dv = NAN; break; - case 1: dv = INFINITY; break; - default: return XPBD_SYSTEM_FAILURE; - } - - if(asn_double2REAL(st, dv)) - return XPBD_SYSTEM_FAILURE; - - return XPBD_BODY_CONSUMED; - } - ASN_DEBUG("Unknown XMLSpecialRealValue"); - return XPBD_BROKEN_ENCODING; - } - - /* - * Copy chunk into the nul-terminated string, and run strtod. - */ - b = (char *)MALLOC(chunk_size + 1); - if(!b) return XPBD_SYSTEM_FAILURE; - memcpy(b, chunk_buf, chunk_size); - b[chunk_size] = 0; /* nul-terminate */ - - value = strtod(b, &endptr); - FREEMEM(b); - if(endptr == b) return XPBD_BROKEN_ENCODING; - - if(asn_double2REAL(st, value)) - return XPBD_SYSTEM_FAILURE; - - return XPBD_BODY_CONSUMED; -} - -asn_dec_rval_t -REAL_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(REAL_t), opt_mname, - buf_ptr, size, REAL__xer_body_decode); -} - int asn_REAL2double(const REAL_t *st, double *dbl_value) { unsigned int octv; @@ -843,186 +732,3 @@ asn_double2float(double d, float *outcome) { return -1; } } - -#ifndef ASN_DISABLE_OER_SUPPORT - -/* - * Encode as Canonical OER - */ -asn_enc_rval_t -REAL_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 REAL_t *st = sptr; - asn_enc_rval_t er = {0,0,0}; - ssize_t len_len; - - if(!st || !st->buf || !td) - ASN__ENCODE_FAILED; - - if(!constraints) constraints = td->encoding_constraints.oer_constraints; - if(constraints && constraints->value.width != 0) { - /* If we're constrained to a narrow float/double representation, we - * shouldn't have ended up using REAL. Expecting NativeReal. */ - ASN__ENCODE_FAILED; - } - - /* Encode a fake REAL */ - len_len = oer_serialize_length(st->size, cb, app_key); - if(len_len < 0 || cb(st->buf, st->size, app_key) < 0) { - ASN__ENCODE_FAILED; - } else { - er.encoded = len_len + st->size; - ASN__ENCODED_OK(er); - } -} - -asn_dec_rval_t -REAL_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) { - asn_dec_rval_t ok = {RC_OK, 0}; - REAL_t *st; - uint8_t *buf; - ssize_t len_len; - size_t real_body_len; - - (void)opt_codec_ctx; - - if(!constraints) constraints = td->encoding_constraints.oer_constraints; - if(constraints && constraints->value.width != 0) { - /* If we're constrained to a narrow float/double representation, we - * shouldn't have ended up using REAL. Expecting NativeReal. */ - ASN__DECODE_FAILED; - } - - len_len = oer_fetch_length(ptr, size, &real_body_len); - if(len_len < 0) ASN__DECODE_FAILED; - if(len_len == 0) ASN__DECODE_STARVED; - - ptr = (const char *)ptr + len_len; - size -= len_len; - - if(real_body_len > size) ASN__DECODE_STARVED; - - buf = CALLOC(1, real_body_len + 1); - if(!buf) ASN__DECODE_FAILED; - - if(!(st = *sptr)) { - st = (*sptr = CALLOC(1, sizeof(REAL_t))); - if(!st) { - FREEMEM(buf); - ASN__DECODE_FAILED; - } - } else { - FREEMEM(st->buf); - } - - memcpy(buf, ptr, real_body_len); - buf[real_body_len] = '\0'; - - st->buf = buf; - st->size = real_body_len; - - ok.consumed = len_len + real_body_len; - return ok; -} - -#endif /* ASN_DISABLE_OER_SUPPORT */ - -#ifndef ASN_DISABLE_PER_SUPPORT - -asn_dec_rval_t -REAL_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) { - (void)constraints; /* No PER visible constraints */ - return OCTET_STRING_decode_uper(opt_codec_ctx, td, 0, sptr, pd); -} - -asn_enc_rval_t -REAL_encode_uper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, const void *sptr, - asn_per_outp_t *po) { - (void)constraints; /* No PER visible constraints */ - return OCTET_STRING_encode_uper(td, 0, sptr, po); -} - -asn_dec_rval_t -REAL_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) { - (void)constraints; /* No PER visible constraints */ - return OCTET_STRING_decode_aper(opt_codec_ctx, td, 0, sptr, pd); -} - -asn_enc_rval_t -REAL_encode_aper(const asn_TYPE_descriptor_t *td, - const asn_per_constraints_t *constraints, - const void *sptr, asn_per_outp_t *po) { - (void)constraints; /* No PER visible constraints */ - return OCTET_STRING_encode_aper(td, 0, sptr, po); -} - -#endif /* ASN_DISABLE_PER_SUPPORT */ - -asn_random_fill_result_t -REAL_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, - const asn_encoding_constraints_t *constraints, - size_t max_length) { - 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 const double values[] = { - 0, -0.0, -1, 1, -M_E, M_E, -3.14, 3.14, -M_PI, M_PI, -255, 255, - /* 2^51 */ - -2251799813685248.0, 2251799813685248.0, - /* 2^52 */ - -4503599627370496.0, 4503599627370496.0, - /* 2^100 */ - -1267650600228229401496703205376.0, 1267650600228229401496703205376.0, - -FLT_MIN, FLT_MIN, - -FLT_MAX, FLT_MAX, - -DBL_MIN, DBL_MIN, - -DBL_MAX, DBL_MAX, -#ifdef FLT_TRUE_MIN - -FLT_TRUE_MIN, FLT_TRUE_MIN, -#endif -#ifdef DBL_TRUE_MIN - -DBL_TRUE_MIN, DBL_TRUE_MIN, -#endif - INFINITY, -INFINITY, NAN}; - REAL_t *st; - double d; - - (void)constraints; - - if(max_length == 0) return result_skipped; - - d = values[asn_random_between(0, sizeof(values) / sizeof(values[0]) - 1)]; - - if(*sptr) { - st = *sptr; - } else { - st = (REAL_t*)(*sptr = CALLOC(1, sizeof(REAL_t))); - if(!st) { - return result_failed; - } - } - - if(asn_double2REAL(st, d)) { - if(st == *sptr) { - ASN_STRUCT_RESET(*td, st); - } else { - ASN_STRUCT_FREE(*td, st); - } - return result_failed; - } - - result_ok.length = st->size; - return result_ok; -} - diff --git a/e2sm/lib/REAL_aper.c b/e2sm/lib/REAL_aper.c new file mode 100644 index 0000000..9881275 --- /dev/null +++ b/e2sm/lib/REAL_aper.c @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +asn_dec_rval_t +REAL_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) { + (void)constraints; /* No PER visible constraints */ + return OCTET_STRING_decode_aper(opt_codec_ctx, td, 0, sptr, pd); +} + +asn_enc_rval_t +REAL_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + (void)constraints; /* No PER visible constraints */ + return OCTET_STRING_encode_aper(td, 0, sptr, po); +} diff --git a/e2sm/lib/REAL_jer.c b/e2sm/lib/REAL_jer.c new file mode 100644 index 0000000..c524e4b --- /dev/null +++ b/e2sm/lib/REAL_jer.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +REAL_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum jer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, + void *app_key) { + const REAL_t *st = (const REAL_t *)sptr; + asn_enc_rval_t er = {0,0,0}; + double d; + + (void)ilevel; + + if(!st || !st->buf || asn_REAL2double(st, &d)) + ASN__ENCODE_FAILED; + + er.encoded = REAL__dump(d, flags, cb, app_key); + if(er.encoded < 0) ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/REAL_oer.c b/e2sm/lib/REAL_oer.c new file mode 100644 index 0000000..679abd9 --- /dev/null +++ b/e2sm/lib/REAL_oer.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Encode as Canonical OER + */ +asn_enc_rval_t +REAL_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 REAL_t *st = sptr; + asn_enc_rval_t er = {0,0,0}; + ssize_t len_len; + + if(!st || !st->buf || !td) + ASN__ENCODE_FAILED; + + if(!constraints) constraints = td->encoding_constraints.oer_constraints; + if(constraints && constraints->value.width != 0) { + /* If we're constrained to a narrow float/double representation, we + * shouldn't have ended up using REAL. Expecting NativeReal. */ + ASN__ENCODE_FAILED; + } + + /* Encode a fake REAL */ + len_len = oer_serialize_length(st->size, cb, app_key); + if(len_len < 0 || cb(st->buf, st->size, app_key) < 0) { + ASN__ENCODE_FAILED; + } else { + er.encoded = len_len + st->size; + ASN__ENCODED_OK(er); + } +} + +asn_dec_rval_t +REAL_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) { + asn_dec_rval_t ok = {RC_OK, 0}; + REAL_t *st; + uint8_t *buf; + ssize_t len_len; + size_t real_body_len; + + (void)opt_codec_ctx; + + if(!constraints) constraints = td->encoding_constraints.oer_constraints; + if(constraints && constraints->value.width != 0) { + /* If we're constrained to a narrow float/double representation, we + * shouldn't have ended up using REAL. Expecting NativeReal. */ + ASN__DECODE_FAILED; + } + + len_len = oer_fetch_length(ptr, size, &real_body_len); + if(len_len < 0) ASN__DECODE_FAILED; + if(len_len == 0) ASN__DECODE_STARVED; + + ptr = (const char *)ptr + len_len; + size -= len_len; + + if(real_body_len > size) ASN__DECODE_STARVED; + + buf = CALLOC(1, real_body_len + 1); + if(!buf) ASN__DECODE_FAILED; + + if(!(st = *sptr)) { + st = (*sptr = CALLOC(1, sizeof(REAL_t))); + if(!st) { + FREEMEM(buf); + ASN__DECODE_FAILED; + } + } else { + FREEMEM(st->buf); + } + + memcpy(buf, ptr, real_body_len); + buf[real_body_len] = '\0'; + + st->buf = buf; + st->size = real_body_len; + + ok.consumed = len_len + real_body_len; + return ok; +} diff --git a/e2sm/lib/REAL_print.c b/e2sm/lib/REAL_print.c new file mode 100644 index 0000000..01daa97 --- /dev/null +++ b/e2sm/lib/REAL_print.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +int +REAL_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const REAL_t *st = (const REAL_t *)sptr; + ssize_t ret; + double d; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(!st || !st->buf) + ret = cb("", 8, app_key); + else if(asn_REAL2double(st, &d)) + ret = cb("", 7, app_key); + else + ret = REAL__dump(d, 0, cb, app_key); + + return (ret < 0) ? -1 : 0; +} diff --git a/e2sm/lib/REAL_rfill.c b/e2sm/lib/REAL_rfill.c new file mode 100644 index 0000000..733aafd --- /dev/null +++ b/e2sm/lib/REAL_rfill.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +asn_random_fill_result_t +REAL_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + 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 const double values[] = { + 0, -0.0, -1, 1, -M_E, M_E, -3.14, 3.14, -M_PI, M_PI, -255, 255, + /* 2^51 */ + -2251799813685248.0, 2251799813685248.0, + /* 2^52 */ + -4503599627370496.0, 4503599627370496.0, + /* 2^100 */ + -1267650600228229401496703205376.0, 1267650600228229401496703205376.0, + -FLT_MIN, FLT_MIN, + -FLT_MAX, FLT_MAX, + -DBL_MIN, DBL_MIN, + -DBL_MAX, DBL_MAX, +#ifdef FLT_TRUE_MIN + -FLT_TRUE_MIN, FLT_TRUE_MIN, +#endif +#ifdef DBL_TRUE_MIN + -DBL_TRUE_MIN, DBL_TRUE_MIN, +#endif + INFINITY, -INFINITY, NAN}; + REAL_t *st; + double d; + + (void)constraints; + + if(max_length == 0) return result_skipped; + + d = values[asn_random_between(0, sizeof(values) / sizeof(values[0]) - 1)]; + + if(*sptr) { + st = *sptr; + } else { + st = (REAL_t*)(*sptr = CALLOC(1, sizeof(REAL_t))); + if(!st) { + return result_failed; + } + } + + if(asn_double2REAL(st, d)) { + if(st == *sptr) { + ASN_STRUCT_RESET(*td, st); + } else { + ASN_STRUCT_FREE(*td, st); + } + return result_failed; + } + + result_ok.length = st->size; + return result_ok; +} diff --git a/e2sm/lib/REAL_uper.c b/e2sm/lib/REAL_uper.c new file mode 100644 index 0000000..d55da9f --- /dev/null +++ b/e2sm/lib/REAL_uper.c @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +asn_dec_rval_t +REAL_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) { + (void)constraints; /* No PER visible constraints */ + return OCTET_STRING_decode_uper(opt_codec_ctx, td, 0, sptr, pd); +} + +asn_enc_rval_t +REAL_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + (void)constraints; /* No PER visible constraints */ + return OCTET_STRING_encode_uper(td, 0, sptr, po); +} diff --git a/e2sm/lib/REAL_xer.c b/e2sm/lib/REAL_xer.c new file mode 100644 index 0000000..8342ec2 --- /dev/null +++ b/e2sm/lib/REAL_xer.c @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +REAL_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 REAL_t *st = (const REAL_t *)sptr; + asn_enc_rval_t er = {0,0,0}; + double d; + + (void)ilevel; + + if(!st || !st->buf || asn_REAL2double(st, &d)) + ASN__ENCODE_FAILED; + + er.encoded = REAL__dump(d, flags & XER_F_CANONICAL, cb, app_key); + if(er.encoded < 0) ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +/* + * Decode the chunk of XML text encoding REAL. + */ +static enum xer_pbd_rval +REAL__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, + const void *chunk_buf, size_t chunk_size) { + REAL_t *st = (REAL_t *)sptr; + double value; + const char *xerdata = (const char *)chunk_buf; + char *endptr = 0; + char *b; + + (void)td; + + if(!chunk_size) return XPBD_BROKEN_ENCODING; + + /* + * Decode an XMLSpecialRealValue: , etc. + */ + if(xerdata[0] == 0x3c /* '<' */) { + size_t i; + for(i = 0; i < sizeof(specialRealValue) / sizeof(specialRealValue[0]); i++) { + struct specialRealValue_s *srv = &specialRealValue[i]; + double dv; + + if(srv->length != chunk_size + || memcmp(srv->string, chunk_buf, chunk_size)) + continue; + + /* + * It could've been done using + * (double)srv->dv / real_zero, + * but it summons fp exception on some platforms. + */ + switch(srv->dv) { + case -1: dv = - INFINITY; break; + case 0: dv = NAN; break; + case 1: dv = INFINITY; break; + default: return XPBD_SYSTEM_FAILURE; + } + + if(asn_double2REAL(st, dv)) + return XPBD_SYSTEM_FAILURE; + + return XPBD_BODY_CONSUMED; + } + ASN_DEBUG("Unknown XMLSpecialRealValue"); + return XPBD_BROKEN_ENCODING; + } + + /* + * Copy chunk into the nul-terminated string, and run strtod. + */ + b = (char *)MALLOC(chunk_size + 1); + if(!b) return XPBD_SYSTEM_FAILURE; + memcpy(b, chunk_buf, chunk_size); + b[chunk_size] = 0; /* nul-terminate */ + + value = strtod(b, &endptr); + FREEMEM(b); + if(endptr == b) return XPBD_BROKEN_ENCODING; + + if(asn_double2REAL(st, value)) + return XPBD_SYSTEM_FAILURE; + + return XPBD_BODY_CONSUMED; +} + +asn_dec_rval_t +REAL_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(REAL_t), opt_mname, + buf_ptr, size, REAL__xer_body_decode); +} diff --git a/e2sm/lib/RELATIVE-OID.c b/e2sm/lib/RELATIVE-OID.c deleted file mode 100644 index 300dc1a..0000000 --- a/e2sm/lib/RELATIVE-OID.c +++ /dev/null @@ -1,336 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . - * All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include -#include -#include /* Encoder and decoder of a primitive type */ -#include /* for CHAR_BIT */ -#include - -/* - * RELATIVE-OID basic type description. - */ -static const ber_tlv_tag_t asn_DEF_RELATIVE_OID_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (13 << 2)) -}; -asn_TYPE_operation_t asn_OP_RELATIVE_OID = { - ASN__PRIMITIVE_TYPE_free, - RELATIVE_OID_print, - OCTET_STRING_compare, /* Implemented in terms of opaque comparison */ - ber_decode_primitive, - der_encode_primitive, - RELATIVE_OID_decode_xer, - RELATIVE_OID_encode_xer, -#ifdef ASN_DISABLE_OER_SUPPORT - 0, - 0, -#else - RELATIVE_OID_decode_oer, - RELATIVE_OID_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 */ - RELATIVE_OID_random_fill, - 0 /* Use generic outmost tag fetcher */ -}; -asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID = { - "RELATIVE-OID", - "RELATIVE_OID", - &asn_OP_RELATIVE_OID, - asn_DEF_RELATIVE_OID_tags, - sizeof(asn_DEF_RELATIVE_OID_tags) - / sizeof(asn_DEF_RELATIVE_OID_tags[0]), - asn_DEF_RELATIVE_OID_tags, /* Same as above */ - sizeof(asn_DEF_RELATIVE_OID_tags) - / sizeof(asn_DEF_RELATIVE_OID_tags[0]), - { 0, 0, asn_generic_no_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - -static ssize_t -RELATIVE_OID__dump_body(const RELATIVE_OID_t *st, asn_app_consume_bytes_f *cb, void *app_key) { - char scratch[32]; - size_t produced = 0; - size_t off = 0; - - for(;;) { - asn_oid_arc_t arc; - ssize_t rd = OBJECT_IDENTIFIER_get_single_arc(st->buf + off, - st->size - off, &arc); - if(rd < 0) { - return -1; - } else if(rd == 0) { - /* No more arcs. */ - break; - } else { - int ret = snprintf(scratch, sizeof(scratch), "%s%" PRIu32, - off ? "." : "", arc); - if(ret >= (ssize_t)sizeof(scratch)) { - return -1; - } - produced += ret; - off += rd; - assert(off <= st->size); - if(cb(scratch, ret, app_key) < 0) return -1; - } - } - - if(off != st->size) { - ASN_DEBUG("Could not scan to the end of Object Identifier"); - return -1; - } - - return produced; -} - -int -RELATIVE_OID_print(const asn_TYPE_descriptor_t *td, const void *sptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const RELATIVE_OID_t *st = (const RELATIVE_OID_t *)sptr; - - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(!st || !st->buf) - return (cb("", 8, app_key) < 0) ? -1 : 0; - - /* Dump preamble */ - if(cb("{ ", 2, app_key) < 0) - return -1; - - if(RELATIVE_OID__dump_body(st, cb, app_key) < 0) - return -1; - - return (cb(" }", 2, app_key) < 0) ? -1 : 0; -} - -static enum xer_pbd_rval -RELATIVE_OID__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, - const void *chunk_buf, size_t chunk_size) { - RELATIVE_OID_t *st = (RELATIVE_OID_t *)sptr; - const char *chunk_end = (const char *)chunk_buf + chunk_size; - const char *endptr; - asn_oid_arc_t s_arcs[6]; - asn_oid_arc_t *arcs = s_arcs; - ssize_t num_arcs; - int ret; - - (void)td; - - num_arcs = OBJECT_IDENTIFIER_parse_arcs( - (const char *)chunk_buf, chunk_size, arcs, - sizeof(s_arcs) / sizeof(s_arcs[0]), &endptr); - if(num_arcs < 0) { - /* Expecting at least one arc arcs */ - return XPBD_BROKEN_ENCODING; - } else if(num_arcs == 0) { - return XPBD_NOT_BODY_IGNORE; - } - assert(endptr == chunk_end); - - if((size_t)num_arcs > sizeof(s_arcs) / sizeof(s_arcs[0])) { - arcs = (asn_oid_arc_t *)MALLOC(num_arcs * sizeof(arcs[0])); - if(!arcs) return XPBD_SYSTEM_FAILURE; - ret = OBJECT_IDENTIFIER_parse_arcs((const char *)chunk_buf, chunk_size, - arcs, num_arcs, &endptr); - if(ret != num_arcs) { - return XPBD_SYSTEM_FAILURE; /* assert?.. */ - } - } - - /* - * Convert arcs into BER representation. - */ - ret = RELATIVE_OID_set_arcs(st, arcs, num_arcs); - if(arcs != s_arcs) FREEMEM(arcs); - - return ret ? XPBD_SYSTEM_FAILURE : XPBD_BODY_CONSUMED; -} - -asn_dec_rval_t -RELATIVE_OID_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(RELATIVE_OID_t), opt_mname, - buf_ptr, size, RELATIVE_OID__xer_body_decode); -} - -asn_enc_rval_t -RELATIVE_OID_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 RELATIVE_OID_t *st = (const RELATIVE_OID_t *)sptr; - asn_enc_rval_t er = {0,0,0}; - - (void)ilevel; /* Unused argument */ - (void)flags; /* Unused argument */ - - if(!st || !st->buf) - ASN__ENCODE_FAILED; - - er.encoded = RELATIVE_OID__dump_body(st, cb, app_key); - if(er.encoded < 0) ASN__ENCODE_FAILED; - - ASN__ENCODED_OK(er); -} - -ssize_t -RELATIVE_OID_get_arcs(const RELATIVE_OID_t *st, asn_oid_arc_t *arcs, - size_t arcs_count) { - size_t num_arcs = 0; - size_t off; - - if(!st || !st->buf) { - errno = EINVAL; - return -1; - } - - for(off = 0;;) { - asn_oid_arc_t arc; - ssize_t rd = OBJECT_IDENTIFIER_get_single_arc(st->buf + off, - st->size - off, &arc); - if(rd < 0) { - return -1; - } else if(rd == 0) { - /* No more arcs. */ - break; - } else { - off += rd; - if(num_arcs < arcs_count) { - arcs[num_arcs] = arc; - } - num_arcs++; - } - } - - if(off != st->size) { - return -1; - } - - return num_arcs; -} - -int -RELATIVE_OID_set_arcs(RELATIVE_OID_t *st, const asn_oid_arc_t *arcs, - size_t arcs_count) { - uint8_t *buf; - uint8_t *bp; - size_t size; - size_t i; - - if(!st || !arcs) { - errno = EINVAL; - return -1; - } - - /* - * Roughly estimate the maximum size necessary to encode these arcs. - */ - size = ((sizeof(asn_oid_arc_t) * CHAR_BIT + 6) / 7) * arcs_count; - bp = buf = (uint8_t *)MALLOC(size + 1); - if(!buf) { - /* ENOMEM */ - return -1; - } - - /* - * Encode the arcs. - */ - for(i = 0; i < arcs_count; i++) { - ssize_t wrote = OBJECT_IDENTIFIER_set_single_arc(bp, size, arcs[i]); - if(wrote <= 0) { - FREEMEM(buf); - return -1; - } - assert((size_t)wrote <= size); - bp += wrote; - size -= wrote; - } - - /* - * Replace buffer. - */ - st->size = bp - buf; - bp = st->buf; - st->buf = buf; - st->buf[st->size] = '\0'; - if(bp) FREEMEM(bp); - - return 0; -} - - -/* - * Generate values from the list of interesting values, or just a random value. - */ -static asn_oid_arc_t -RELATIVE_OID__biased_random_arc() { - static const uint16_t values[] = {0, 1, 127, 128, 129, 254, 255, 256}; - - switch(asn_random_between(0, 2)) { - case 0: - return values[asn_random_between( - 0, sizeof(values) / sizeof(values[0]) - 1)]; - case 1: - return asn_random_between(0, UINT_MAX); - case 2: - default: - return UINT_MAX; - } -} - -asn_random_fill_result_t -RELATIVE_OID_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, - const asn_encoding_constraints_t *constraints, - size_t max_length) { - 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}; - RELATIVE_OID_t *st; - const int min_arcs = 1; /* A minimum of 1 arc is required */ - asn_oid_arc_t arcs[3]; - size_t arcs_len = - asn_random_between(min_arcs, sizeof(arcs) / sizeof(arcs[0])); - size_t i; - - (void)constraints; - - if(max_length < arcs_len) return result_skipped; - - if(*sptr) { - st = *sptr; - } else { - st = CALLOC(1, sizeof(*st)); - } - - for(i = 0; i < arcs_len; i++) { - arcs[i] = RELATIVE_OID__biased_random_arc(); - } - - if(RELATIVE_OID_set_arcs(st, arcs, arcs_len)) { - if(st != *sptr) { - ASN_STRUCT_FREE(*td, st); - } - return result_failed; - } - - *sptr = st; - - result_ok.length = st->size; - return result_ok; -} diff --git a/e2sm/lib/RIC-EventTriggerStyle-Item.c b/e2sm/lib/RIC-EventTriggerStyle-Item.c index a6b258d..adeed3d 100644 --- a/e2sm/lib/RIC-EventTriggerStyle-Item.c +++ b/e2sm/lib/RIC-EventTriggerStyle-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RIC-EventTriggerStyle-Item.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_RIC_EventTriggerStyle_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RIC_Style_Type, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ric-EventTriggerStyle-Type" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_RIC_EventTriggerStyle_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RIC_Style_Name, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ric-EventTriggerStyle-Name" }, @@ -31,7 +47,15 @@ asn_TYPE_member_t asn_MBR_RIC_EventTriggerStyle_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RIC_Format_Type, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ric-EventTriggerFormat-Type" }, @@ -62,7 +86,15 @@ asn_TYPE_descriptor_t asn_DEF_RIC_EventTriggerStyle_Item = { asn_DEF_RIC_EventTriggerStyle_Item_tags_1, /* Same as above */ sizeof(asn_DEF_RIC_EventTriggerStyle_Item_tags_1) /sizeof(asn_DEF_RIC_EventTriggerStyle_Item_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RIC_EventTriggerStyle_Item_1, 3, /* Elements count */ &asn_SPC_RIC_EventTriggerStyle_Item_specs_1 /* Additional specs */ diff --git a/e2sm/lib/RIC-EventTriggerStyle-List.c b/e2sm/lib/RIC-EventTriggerStyle-List.c deleted file mode 100644 index ec73afc..0000000 --- a/e2sm/lib/RIC-EventTriggerStyle-List.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/RIC-Format-Type.c b/e2sm/lib/RIC-Format-Type.c index f34ef41..bfeb4bc 100644 --- a/e2sm/lib/RIC-Format-Type.c +++ b/e2sm/lib/RIC-Format-Type.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RIC-Format-Type.h" @@ -24,7 +24,15 @@ asn_TYPE_descriptor_t asn_DEF_RIC_Format_Type = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeInteger_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/RIC-ReportStyle-Item.c b/e2sm/lib/RIC-ReportStyle-Item.c index c8c63ba..d03c28e 100644 --- a/e2sm/lib/RIC-ReportStyle-Item.c +++ b/e2sm/lib/RIC-ReportStyle-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RIC-ReportStyle-Item.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_RIC_ReportStyle_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RIC_Style_Type, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ric-ReportStyle-Type" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_RIC_ReportStyle_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RIC_Style_Name, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ric-ReportStyle-Name" }, @@ -31,7 +47,15 @@ asn_TYPE_member_t asn_MBR_RIC_ReportStyle_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RIC_Format_Type, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ric-ActionFormat-Type" }, @@ -40,7 +64,15 @@ asn_TYPE_member_t asn_MBR_RIC_ReportStyle_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasurementInfo_Action_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "measInfo-Action-List" }, @@ -49,7 +81,15 @@ asn_TYPE_member_t asn_MBR_RIC_ReportStyle_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RIC_Format_Type, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ric-IndicationHeaderFormat-Type" }, @@ -58,7 +98,15 @@ asn_TYPE_member_t asn_MBR_RIC_ReportStyle_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RIC_Format_Type, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ric-IndicationMessageFormat-Type" }, @@ -92,7 +140,15 @@ asn_TYPE_descriptor_t asn_DEF_RIC_ReportStyle_Item = { asn_DEF_RIC_ReportStyle_Item_tags_1, /* Same as above */ sizeof(asn_DEF_RIC_ReportStyle_Item_tags_1) /sizeof(asn_DEF_RIC_ReportStyle_Item_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RIC_ReportStyle_Item_1, 6, /* Elements count */ &asn_SPC_RIC_ReportStyle_Item_specs_1 /* Additional specs */ diff --git a/e2sm/lib/RIC-ReportStyle-List.c b/e2sm/lib/RIC-ReportStyle-List.c deleted file mode 100644 index 70b7732..0000000 --- a/e2sm/lib/RIC-ReportStyle-List.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/RIC-Style-Name.c b/e2sm/lib/RIC-Style-Name.c index 662ada6..7928a5b 100644 --- a/e2sm/lib/RIC-Style-Name.c +++ b/e2sm/lib/RIC-Style-Name.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RIC-Style-Name.h" @@ -54,7 +54,7 @@ RIC_Style_Name_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size >= 1 && size <= 150) + if((size >= 1UL && size <= 150UL) && !check_permitted_alphabet_1(st)) { /* Constraint check succeeded */ return 0; @@ -80,12 +80,19 @@ static int asn_PER_MAP_RIC_Style_Name_1_c2v(unsigned int code) { * This type is implemented using PrintableString, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_RIC_Style_Name_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) 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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_RIC_Style_Name_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)) }; @@ -99,7 +106,15 @@ asn_TYPE_descriptor_t asn_DEF_RIC_Style_Name = { 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 */ - { 0, &asn_PER_type_RIC_Style_Name_constr_1, RIC_Style_Name_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RIC_Style_Name_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RIC_Style_Name_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + RIC_Style_Name_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/RIC-Style-Type.c b/e2sm/lib/RIC-Style-Type.c index d08e69a..8cc166e 100644 --- a/e2sm/lib/RIC-Style-Type.c +++ b/e2sm/lib/RIC-Style-Type.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RIC-Style-Type.h" @@ -24,7 +24,15 @@ asn_TYPE_descriptor_t asn_DEF_RIC_Style_Type = { 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 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeInteger_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/RRC-MessageID.c b/e2sm/lib/RRC-MessageID.c index 8103669..0dc8171 100644 --- a/e2sm/lib/RRC-MessageID.c +++ b/e2sm/lib/RRC-MessageID.c @@ -1,24 +1,39 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RRC-MessageID.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_rrcType_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_rrcType_constr_2 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_rrcType_2[] = { { ATF_NOFLAGS, 0, offsetof(struct RRC_MessageID__rrcType, choice.lTE), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RRCclass_LTE, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "lTE" }, @@ -27,7 +42,15 @@ static asn_TYPE_member_t asn_MBR_rrcType_2[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RRCclass_NR, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "nR" }, @@ -55,7 +78,15 @@ asn_TYPE_descriptor_t asn_DEF_rrcType_2 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_rrcType_constr_2, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_rrcType_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_rrcType_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_rrcType_2, 2, /* Elements count */ &asn_SPC_rrcType_specs_2 /* Additional specs */ @@ -67,7 +98,15 @@ static asn_TYPE_member_t asn_MBR_RRC_MessageID_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_rrcType_2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "rrcType" }, @@ -76,7 +115,15 @@ static asn_TYPE_member_t asn_MBR_RRC_MessageID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "messageID" }, @@ -106,7 +153,15 @@ asn_TYPE_descriptor_t asn_DEF_RRC_MessageID = { asn_DEF_RRC_MessageID_tags_1, /* Same as above */ sizeof(asn_DEF_RRC_MessageID_tags_1) /sizeof(asn_DEF_RRC_MessageID_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_RRC_MessageID_1, 2, /* Elements count */ &asn_SPC_RRC_MessageID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/RRCclass-LTE.c b/e2sm/lib/RRCclass-LTE.c index 6310742..7bdde95 100644 --- a/e2sm/lib/RRCclass-LTE.c +++ b/e2sm/lib/RRCclass-LTE.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RRCclass-LTE.h" @@ -11,11 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_RRCclass_LTE_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_RRCclass_LTE_constr_1 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 4, 4, 0, 11 } /* (0..11,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_RRCclass_LTE_value2enum_1[] = { { 0, 8, "bCCH-BCH" }, { 1, 13, "bCCH-BCH-MBMS" }, @@ -68,7 +75,15 @@ asn_TYPE_descriptor_t asn_DEF_RRCclass_LTE = { asn_DEF_RRCclass_LTE_tags_1, /* Same as above */ sizeof(asn_DEF_RRCclass_LTE_tags_1) /sizeof(asn_DEF_RRCclass_LTE_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_RRCclass_LTE_constr_1, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RRCclass_LTE_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RRCclass_LTE_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_RRCclass_LTE_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/RRCclass-NR.c b/e2sm/lib/RRCclass-NR.c index e85da53..afd4781 100644 --- a/e2sm/lib/RRCclass-NR.c +++ b/e2sm/lib/RRCclass-NR.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "RRCclass-NR.h" @@ -11,11 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_RRCclass_NR_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_RRCclass_NR_constr_1 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 7 } /* (0..7,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_RRCclass_NR_value2enum_1[] = { { 0, 8, "bCCH-BCH" }, { 1, 11, "bCCH-DL-SCH" }, @@ -60,7 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_RRCclass_NR = { asn_DEF_RRCclass_NR_tags_1, /* Same as above */ sizeof(asn_DEF_RRCclass_NR_tags_1) /sizeof(asn_DEF_RRCclass_NR_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_RRCclass_NR_constr_1, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_RRCclass_NR_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_RRCclass_NR_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_RRCclass_NR_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/RT-Period-IE.c b/e2sm/lib/RT-Period-IE.c deleted file mode 100644 index 82fd5b0..0000000 --- a/e2sm/lib/RT-Period-IE.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/S-NSSAI.c b/e2sm/lib/S-NSSAI.c index f5eadec..d2742b5 100644 --- a/e2sm/lib/S-NSSAI.c +++ b/e2sm/lib/S-NSSAI.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "S-NSSAI.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_S_NSSAI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_SST, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "sST" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_S_NSSAI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_SD, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "sD" }, @@ -54,7 +70,15 @@ asn_TYPE_descriptor_t asn_DEF_S_NSSAI = { asn_DEF_S_NSSAI_tags_1, /* Same as above */ sizeof(asn_DEF_S_NSSAI_tags_1) /sizeof(asn_DEF_S_NSSAI_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_S_NSSAI_1, 2, /* Elements count */ &asn_SPC_S_NSSAI_specs_1 /* Additional specs */ diff --git a/e2sm/lib/SD.c b/e2sm/lib/SD.c index fcbcce8..42a520c 100644 --- a/e2sm/lib/SD.c +++ b/e2sm/lib/SD.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "SD.h" @@ -22,7 +22,7 @@ SD_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size == 3)) { + if((size == 3UL)) { /* Constraint check succeeded */ return 0; } else { @@ -37,11 +37,18 @@ SD_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_SD_constr_1 CC_NOTUSED = { + { 0, 0 }, + 3 /* (SIZE(3..3)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_SD_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_SD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; @@ -55,7 +62,15 @@ asn_TYPE_descriptor_t asn_DEF_SD = { asn_DEF_SD_tags_1, /* Same as above */ sizeof(asn_DEF_SD_tags_1) /sizeof(asn_DEF_SD_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_SD_constr_1, SD_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_SD_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_SD_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SD_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/SNSSAI.c b/e2sm/lib/SNSSAI.c deleted file mode 100644 index 4f63ad9..0000000 --- a/e2sm/lib/SNSSAI.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/SST.c b/e2sm/lib/SST.c index cb7f498..0c895e5 100644 --- a/e2sm/lib/SST.c +++ b/e2sm/lib/SST.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "SST.h" @@ -22,7 +22,7 @@ SST_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size == 1)) { + if((size == 1UL)) { /* Constraint check succeeded */ return 0; } else { @@ -37,11 +37,18 @@ SST_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_SST_constr_1 CC_NOTUSED = { + { 0, 0 }, + 1 /* (SIZE(1..1)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_SST_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 1, 1 } /* (SIZE(1..1)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_SST_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; @@ -55,7 +62,15 @@ asn_TYPE_descriptor_t asn_DEF_SST = { asn_DEF_SST_tags_1, /* Same as above */ sizeof(asn_DEF_SST_tags_1) /sizeof(asn_DEF_SST_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_SST_constr_1, SST_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_SST_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_SST_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SST_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/ServedPlmnPerCellListItem.c b/e2sm/lib/ServedPlmnPerCellListItem.c deleted file mode 100644 index 7ebe3e6..0000000 --- a/e2sm/lib/ServedPlmnPerCellListItem.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/ServingCell-ARFCN.c b/e2sm/lib/ServingCell-ARFCN.c index a4df51f..b5744ce 100644 --- a/e2sm/lib/ServingCell-ARFCN.c +++ b/e2sm/lib/ServingCell-ARFCN.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ServingCell-ARFCN.h" #include "NR-ARFCN.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ServingCell_ARFCN_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_ServingCell_ARFCN_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_ServingCell_ARFCN_1[] = { { ATF_POINTER, 0, offsetof(struct ServingCell_ARFCN, choice.nR), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NR_ARFCN, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "nR" }, @@ -28,7 +43,15 @@ static asn_TYPE_member_t asn_MBR_ServingCell_ARFCN_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_E_UTRA_ARFCN, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "eUTRA" }, @@ -55,7 +78,15 @@ asn_TYPE_descriptor_t asn_DEF_ServingCell_ARFCN = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_ServingCell_ARFCN_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ServingCell_ARFCN_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ServingCell_ARFCN_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_ServingCell_ARFCN_1, 2, /* Elements count */ &asn_SPC_ServingCell_ARFCN_specs_1 /* Additional specs */ diff --git a/e2sm/lib/ServingCell-PCI.c b/e2sm/lib/ServingCell-PCI.c index 349468e..226a2b9 100644 --- a/e2sm/lib/ServingCell-PCI.c +++ b/e2sm/lib/ServingCell-PCI.c @@ -1,24 +1,39 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "ServingCell-PCI.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_ServingCell_PCI_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_ServingCell_PCI_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static asn_TYPE_member_t asn_MBR_ServingCell_PCI_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ServingCell_PCI, choice.nR), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NR_PCI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "nR" }, @@ -27,7 +42,15 @@ static asn_TYPE_member_t asn_MBR_ServingCell_PCI_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_E_UTRA_PCI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "eUTRA" }, @@ -54,7 +77,15 @@ asn_TYPE_descriptor_t asn_DEF_ServingCell_PCI = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_ServingCell_PCI_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_ServingCell_PCI_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_ServingCell_PCI_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_ServingCell_PCI_1, 2, /* Elements count */ &asn_SPC_ServingCell_PCI_specs_1 /* Additional specs */ diff --git a/e2sm/lib/SlicePerPlmnPerCellListItem.c b/e2sm/lib/SlicePerPlmnPerCellListItem.c deleted file mode 100644 index f4e75f8..0000000 --- a/e2sm/lib/SlicePerPlmnPerCellListItem.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/SliceToReportListItem.c b/e2sm/lib/SliceToReportListItem.c deleted file mode 100644 index b02b3da..0000000 --- a/e2sm/lib/SliceToReportListItem.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/SubscriberProfileIDforRFP.c b/e2sm/lib/SubscriberProfileIDforRFP.c index de6ac12..d554c9a 100644 --- a/e2sm/lib/SubscriberProfileIDforRFP.c +++ b/e2sm/lib/SubscriberProfileIDforRFP.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "SubscriberProfileIDforRFP.h" @@ -21,7 +21,7 @@ SubscriberProfileIDforRFP_constraint(const asn_TYPE_descriptor_t *td, const void value = *(const long *)sptr; - if((value >= 1 && value <= 256)) { + if((value >= 1L && value <= 256L)) { /* Constraint check succeeded */ return 0; } else { @@ -36,11 +36,18 @@ SubscriberProfileIDforRFP_constraint(const asn_TYPE_descriptor_t *td, const void * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_SubscriberProfileIDforRFP_constr_1 CC_NOTUSED = { + { 2, 1 } /* (1..256) */, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_SubscriberProfileIDforRFP_constr_1 CC_NOTUSED = { { APC_CONSTRAINED, 8, 8, 1, 256 } /* (1..256) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_SubscriberProfileIDforRFP_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_SubscriberProfileIDforRFP = { asn_DEF_SubscriberProfileIDforRFP_tags_1, /* Same as above */ sizeof(asn_DEF_SubscriberProfileIDforRFP_tags_1) /sizeof(asn_DEF_SubscriberProfileIDforRFP_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_SubscriberProfileIDforRFP_constr_1, SubscriberProfileIDforRFP_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_SubscriberProfileIDforRFP_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_SubscriberProfileIDforRFP_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SubscriberProfileIDforRFP_constraint + }, 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/e2sm/lib/SupportedSULBandList.c b/e2sm/lib/SupportedSULBandList.c deleted file mode 100644 index 94d81c5..0000000 --- a/e2sm/lib/SupportedSULBandList.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#include "SupportedSULBandList.h" - -#include "SupportedSULFreqBandItem.h" -asn_per_constraints_t asn_PER_type_SupportedSULBandList_constr_1 CC_NOTUSED = { - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - { APC_CONSTRAINED, 6, 6, 0, 32 } /* (SIZE(0..32)) */, - 0, 0 /* No PER value map */ -}; -asn_TYPE_member_t asn_MBR_SupportedSULBandList_1[] = { - { ATF_POINTER, 0, 0, - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - 0, - &asn_DEF_SupportedSULFreqBandItem, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "" - }, -}; -static const ber_tlv_tag_t asn_DEF_SupportedSULBandList_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -asn_SET_OF_specifics_t asn_SPC_SupportedSULBandList_specs_1 = { - sizeof(struct SupportedSULBandList), - offsetof(struct SupportedSULBandList, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ -}; -asn_TYPE_descriptor_t asn_DEF_SupportedSULBandList = { - "SupportedSULBandList", - "SupportedSULBandList", - &asn_OP_SEQUENCE_OF, - asn_DEF_SupportedSULBandList_tags_1, - sizeof(asn_DEF_SupportedSULBandList_tags_1) - /sizeof(asn_DEF_SupportedSULBandList_tags_1[0]), /* 1 */ - asn_DEF_SupportedSULBandList_tags_1, /* Same as above */ - sizeof(asn_DEF_SupportedSULBandList_tags_1) - /sizeof(asn_DEF_SupportedSULBandList_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_SupportedSULBandList_constr_1, SEQUENCE_OF_constraint }, - asn_MBR_SupportedSULBandList_1, - 1, /* Single element */ - &asn_SPC_SupportedSULBandList_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/SupportedSULFreqBandItem.c b/e2sm/lib/SupportedSULFreqBandItem.c deleted file mode 100644 index 4e64674..0000000 --- a/e2sm/lib/SupportedSULFreqBandItem.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` - */ - -#include "SupportedSULFreqBandItem.h" - -static int -memb_freqBandIndicatorNr_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 >= 1 && value <= 1024)) { - /* 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_per_constraints_t asn_PER_memb_freqBandIndicatorNr_constr_2 CC_NOTUSED = { - { APC_CONSTRAINED | APC_EXTENSIBLE, 10, 10, 1, 1024 } /* (1..1024,...) */, - { APC_UNCONSTRAINED, -1, -1, 0, 0 }, - 0, 0 /* No PER value map */ -}; -asn_TYPE_member_t asn_MBR_SupportedSULFreqBandItem_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct SupportedSULFreqBandItem, freqBandIndicatorNr), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_NativeInteger, - 0, - { 0, &asn_PER_memb_freqBandIndicatorNr_constr_2, memb_freqBandIndicatorNr_constraint_1 }, - 0, 0, /* No default value */ - "freqBandIndicatorNr" - }, -}; -static const ber_tlv_tag_t asn_DEF_SupportedSULFreqBandItem_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_SupportedSULFreqBandItem_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* freqBandIndicatorNr */ -}; -asn_SEQUENCE_specifics_t asn_SPC_SupportedSULFreqBandItem_specs_1 = { - sizeof(struct SupportedSULFreqBandItem), - offsetof(struct SupportedSULFreqBandItem, _asn_ctx), - asn_MAP_SupportedSULFreqBandItem_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_SupportedSULFreqBandItem = { - "SupportedSULFreqBandItem", - "SupportedSULFreqBandItem", - &asn_OP_SEQUENCE, - asn_DEF_SupportedSULFreqBandItem_tags_1, - sizeof(asn_DEF_SupportedSULFreqBandItem_tags_1) - /sizeof(asn_DEF_SupportedSULFreqBandItem_tags_1[0]), /* 1 */ - asn_DEF_SupportedSULFreqBandItem_tags_1, /* Same as above */ - sizeof(asn_DEF_SupportedSULFreqBandItem_tags_1) - /sizeof(asn_DEF_SupportedSULFreqBandItem_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, - asn_MBR_SupportedSULFreqBandItem_1, - 1, /* Elements count */ - &asn_SPC_SupportedSULFreqBandItem_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/T61String.c b/e2sm/lib/T61String.c deleted file mode 100644 index d3de88b..0000000 --- a/e2sm/lib/T61String.c +++ /dev/null @@ -1,58 +0,0 @@ -/*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include - -/* - * T61String basic type description. - */ -static const ber_tlv_tag_t asn_DEF_T61String_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)), /* [UNIVERSAL 20] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ -}; -asn_TYPE_operation_t asn_OP_T61String = { - OCTET_STRING_free, - OCTET_STRING_print, /* non-ascii string */ - OCTET_STRING_compare, - OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - 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, - 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_T61String = { - "T61String", - "T61String", - &asn_OP_T61String, - asn_DEF_T61String_tags, - sizeof(asn_DEF_T61String_tags) - / sizeof(asn_DEF_T61String_tags[0]) - 1, - asn_DEF_T61String_tags, - sizeof(asn_DEF_T61String_tags) - / sizeof(asn_DEF_T61String_tags[0]), - { 0, 0, asn_generic_unknown_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - diff --git a/e2sm/lib/TeletexString.c b/e2sm/lib/TeletexString.c deleted file mode 100644 index 9756c72..0000000 --- a/e2sm/lib/TeletexString.c +++ /dev/null @@ -1,194 +0,0 @@ -/*- - * Copyright (c) 2003, 2006 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include - -/* - * TeletexString basic type description. - */ -static const ber_tlv_tag_t asn_DEF_TeletexString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)), /* [UNIVERSAL 20] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), /* ... OCTET STRING */ -}; -asn_TYPE_operation_t asn_OP_TeletexString = { - OCTET_STRING_free, - OCTET_STRING_print, /* non-ascii string */ - OCTET_STRING_compare, - OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - 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, - 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_TeletexString = { - "TeletexString", - "TeletexString", - &asn_OP_TeletexString, - asn_DEF_TeletexString_tags, - sizeof(asn_DEF_TeletexString_tags) - / sizeof(asn_DEF_TeletexString_tags[0]) - 1, - asn_DEF_TeletexString_tags, - sizeof(asn_DEF_TeletexString_tags) - / sizeof(asn_DEF_TeletexString_tags[0]), - { 0, 0, asn_generic_unknown_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - -/* - * Here is a formal attempt at creating a mapping from TeletexString - * (T61String) of the latest ASN.1 standard (X.680:2002) into the Unicode - * character set. -- Lev Walkin - * - * The first thing to keep in mind is that TeletexString (T61String) - * is defined in ASN.1, and is not really a T.61 string. - * The T.61 standard is withdrawn by ITU-T and is no longer an authoritative - * reference. See http://www.itu.int/rec/T-REC-T.61 - * - * The X.680 specifies TeletexString (T61String) as a combination of the - * character sets specified by the registration numbers listed in - * ISO International Register of Coded Character Sets to be used with - * Escape Sequences (ISO-2375): - * 6, 87, 102, 103, 106, 107, 126, 144, 150, 153, 156, 164, 165, 168, - * plus SPACE and DELETE characters. - * In addition to that, the X.680 Table 6 NOTE 2 allows using register entries - * 6 and 156 instead of 102 and 103. - * - * The ISO Register itself is available at http://www.itscj.ipsj.or.jp/ISO-IR/ - * - * #6 is ASCII. http://www.itscj.ipsj.or.jp/ISO-IR/006.pdf - * Escapes into: - * G0: ESC 2/8 4/2 ("(B") - * G1: ESC 2/9 4/2 (")B") - * The range is [0x21 .. 0x7e]. Conversion into Unicode - * is simple, because it has one-to-one correspondence. - * #87 is a "Japanese Graphic Character Set for Information Interchange". - * Is a multiple-byte set of 6877 characters. - * The character set is JIS X 0208-1983 (originally JIS C 6226-1983). - * Escapes into: - * G0: ESC 2/4 4/2 ("$B") - * G1: ESC 2/4 2/9 4/2 ("$)B") - * G2: ESC 2/4 2/10 4/2 ("$*B") - * G3: ESC 2/4 2/11 4/2 ("$+B") - * #102 is "Teletex Primary Set of Graphic Characters" and is almost ASCII. - * Escapes into: - * G0: ESC 2/8 7/5 ("(u") - * G1: ESC 2/9 7/5 (")u") - * G2: ESC 2/10 7/5 ("*u") - * G3: ESC 2/11 7/5 ("+u") - * It is almost identical to ASCII, except for ASCII position for '$' - * (DOLLAR SIGN) is filled with '¤' (CURRENCY SIGN), which is U+00A4. - * Also, ASCII positions for '`', '\', '^', '{', '}', '~' are marked - * as "should not be used". - * #103 is a supplementary set of characters used in combination with #102. - * Escapes into: - * G0: ESC 2/8 7/6 ("(v") - * G1: ESC 2/9 7/6 (")v") - * G2: ESC 2/10 7/6 ("*v") - * G3: ESC 2/11 7/6 ("+v") - * Some characters in that character set are combining characters, - * which can only be restrictively used with certain basic Latin letters. - * It can be thought of as a subset of #156 with the exception of 4/12 - * which is UNDERLINE in #103 and absent in #156. - * #106 is a primary set of control functions, used in combination with #107. - * Escapes into: - * C0: ESC 2/1 4/5 ("!E") - * This set is so short I can list it here: - * 0x08 BS BACKSPACE -- same as Unicode - * 0x0a LF LINE FEED -- same as Unicode - * 0x0c FF FORM FEED -- same as Unicode - * 0x0d CR CARRIAGE RETURN -- same as Unicode - * 0x0e LS1 LOCKING SHIFT ONE - * 0x0f LS0 LOCKING SHIFT ZERO - * 0x19 SS2 SINGLE SHIFT TWO - * 0x1a SUB SUBSTITUTE CHARACTER - * 0x1b ESC ESCAPE -- same as Unicode - * 0x1d SS3 SINGLE SHIFT THREE - * The LS1 and LS0 are two magical functions which, respectively, invoke - * the currently designated G1 or G0 set into positions 2/1 to 7/14 - * The SS2 and SS3, respectively, invoke one character of the - * currently designated set G2 and G3. - * The SUB is wholly equivalent to U+001a (SUBSTITUTE) - * #107 is a supplementary set of control functions, used with #106. - * Escapes into: - * C1: ESC 2/2 4/8 ('"H') - * This set contains three special control codes: - * 0x8b PLD PARTIAL LINE DOWN -- similar to - * 0x8c PLU PARTIAL LINE UP -- sumilar to - * 0x9b CSI CONTROL SEQUENCE INTRODUCER - * This set is so out of world we can probably safely ignore it. - * #126 is a "Right-hand Part of the Latin/Greek Alphabet". - * Comprises of 90 characters, including accented letters. - * Escapes into: - * G1: ESC 2/13 4/6 ("-F") - * G2: ESC 2/14 4/6 (".F") - * G3: ESC 2/15 4/6 ("/F") - * Note: This Registration is a subset of ISO-IR 227. - * #144 is a "Cyrillic part of the Latin/Cyrillic Alphabet". - * Comprises of 95 characters. - * Escapes into: - * G1: ESC 2/13 4/12 ("-L") - * G2: ESC 2/14 4/12 (".L") - * G3: ESC 2/15 4/12 ("/L") - * #150 is a "Greek Primary Set of Graphic Characters". - * Comprises of 94 characters. - * Escapes into: - * G0: ESC 2/8 2/1 4/0 ("(!@") - * G1: ESC 2/9 2/1 4/0 (")!@") - * G2: ESC 2/10 2/1 4/0 ("*!@") - * G3: ESC 2/11 2/1 4/0 ("+!@") - * #153 is a "Basic Cyrillic Character Set for 8-bit codes". - * Comprises of 68 characters. - * Escapes into: - * G1: ESC 2/13 4/15 ("-O") - * G2: ESC 2/14 4/15 (".O") - * G3: ESC 2/15 4/15 ("/O") - * #156 is a "Supplementary Set of ISO/IEC 6937:1992" for use with #6 - * Comprises of 87 characters. - * Escapes into: - * G1: ESC 2/13 5/2 ("-R") - * G2: ESC 2/14 5/2 (".R") - * G3: ESC 2/15 5/2 ("/R") - * #164 is a "Hebrew Supplementary Set of Graphic Characters" - * Comprises of 27 characters. - * Escapes into: - * G1: ESC 2/13 5/3 ("-S") - * G2: ESC 2/14 5/3 (".S") - * G3: ESC 2/15 5/3 ("/S") - * #165 is a set of "Codes of the Chinese graphic character set" - * Is a multiple-byte set of 8446 characters. - * Escapes into: - * G0: ESC 2/4 2/8 4/5 ("$(E") - * G1: ESC 2/4 2/9 4/5 ("$)E") - * G2: ESC 2/4 2/10 4/5 ("$*E") - * G3: ESC 2/4 2/11 4/5 ("$+E") - * #168 is a "Japanese Graphic Character Set for Information Interchange" - * A multiple-byte set of 6879 characters updated from #87. - * Escapes into: - * G0: ESC 2/6 4/0 ESC 2/4 4/2 ("&@" "$B") - * G1: ESC 2/6 4/0 ESC 2/4 2/9 4/2 ("&@" "$)B") - * G2: ESC 2/6 4/0 ESC 2/4 2/10 4/2 ("&@" "$*B") - * G3: ESC 2/6 4/0 ESC 2/4 2/11 4/2 ("&@" "$+B") - */ - diff --git a/e2sm/lib/TestCond-Expression.c b/e2sm/lib/TestCond-Expression.c index 808341d..04e45c7 100644 --- a/e2sm/lib/TestCond-Expression.c +++ b/e2sm/lib/TestCond-Expression.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "TestCond-Expression.h" @@ -11,11 +11,18 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_TestCond_Expression_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_TestCond_Expression_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_TestCond_Expression_value2enum_1[] = { { 0, 5, "equal" }, { 1, 11, "greaterthan" }, @@ -54,7 +61,15 @@ asn_TYPE_descriptor_t asn_DEF_TestCond_Expression = { asn_DEF_TestCond_Expression_tags_1, /* Same as above */ sizeof(asn_DEF_TestCond_Expression_tags_1) /sizeof(asn_DEF_TestCond_Expression_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_TestCond_Expression_constr_1, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_TestCond_Expression_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_TestCond_Expression_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_TestCond_Expression_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/TestCond-Type.c b/e2sm/lib/TestCond-Type.c index 103efdf..90062be 100644 --- a/e2sm/lib/TestCond-Type.c +++ b/e2sm/lib/TestCond-Type.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "TestCond-Type.h" @@ -31,41 +31,90 @@ * This type is implemented using NativeEnumerated, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_gBR_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_gBR_constr_2 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_aMBR_constr_5 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_aMBR_constr_5 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_isStat_constr_8 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_isStat_constr_8 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_isCatM_constr_11 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_isCatM_constr_11 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_rSRP_constr_14 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_rSRP_constr_14 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_rSRQ_constr_17 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) static asn_per_constraints_t asn_PER_type_rSRQ_constr_17 CC_NOTUSED = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_TestCond_Type_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_TestCond_Type_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const asn_INTEGER_enum_map_t asn_MAP_gBR_value2enum_2[] = { { 0, 4, "true" } /* This list is extensible */ @@ -98,7 +147,15 @@ asn_TYPE_descriptor_t asn_DEF_gBR_2 = { asn_DEF_gBR_tags_2, /* Same as above */ sizeof(asn_DEF_gBR_tags_2) /sizeof(asn_DEF_gBR_tags_2[0]), /* 2 */ - { 0, &asn_PER_type_gBR_constr_2, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_gBR_constr_2, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_gBR_constr_2, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_gBR_specs_2 /* Additional specs */ }; @@ -135,7 +192,15 @@ asn_TYPE_descriptor_t asn_DEF_aMBR_5 = { asn_DEF_aMBR_tags_5, /* Same as above */ sizeof(asn_DEF_aMBR_tags_5) /sizeof(asn_DEF_aMBR_tags_5[0]), /* 2 */ - { 0, &asn_PER_type_aMBR_constr_5, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_aMBR_constr_5, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_aMBR_constr_5, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_aMBR_specs_5 /* Additional specs */ }; @@ -172,7 +237,15 @@ asn_TYPE_descriptor_t asn_DEF_isStat_8 = { asn_DEF_isStat_tags_8, /* Same as above */ sizeof(asn_DEF_isStat_tags_8) /sizeof(asn_DEF_isStat_tags_8[0]), /* 2 */ - { 0, &asn_PER_type_isStat_constr_8, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_isStat_constr_8, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_isStat_constr_8, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_isStat_specs_8 /* Additional specs */ }; @@ -209,7 +282,15 @@ asn_TYPE_descriptor_t asn_DEF_isCatM_11 = { asn_DEF_isCatM_tags_11, /* Same as above */ sizeof(asn_DEF_isCatM_tags_11) /sizeof(asn_DEF_isCatM_tags_11[0]), /* 2 */ - { 0, &asn_PER_type_isCatM_constr_11, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_isCatM_constr_11, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_isCatM_constr_11, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_isCatM_specs_11 /* Additional specs */ }; @@ -246,7 +327,15 @@ asn_TYPE_descriptor_t asn_DEF_rSRP_14 = { asn_DEF_rSRP_tags_14, /* Same as above */ sizeof(asn_DEF_rSRP_tags_14) /sizeof(asn_DEF_rSRP_tags_14[0]), /* 2 */ - { 0, &asn_PER_type_rSRP_constr_14, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_rSRP_constr_14, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_rSRP_constr_14, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_rSRP_specs_14 /* Additional specs */ }; @@ -283,7 +372,15 @@ asn_TYPE_descriptor_t asn_DEF_rSRQ_17 = { asn_DEF_rSRQ_tags_17, /* Same as above */ sizeof(asn_DEF_rSRQ_tags_17) /sizeof(asn_DEF_rSRQ_tags_17[0]), /* 2 */ - { 0, &asn_PER_type_rSRQ_constr_17, NativeEnumerated_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_rSRQ_constr_17, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_rSRQ_constr_17, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + NativeEnumerated_constraint + }, 0, 0, /* Defined elsewhere */ &asn_SPC_rSRQ_specs_17 /* Additional specs */ }; @@ -294,7 +391,15 @@ asn_TYPE_member_t asn_MBR_TestCond_Type_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_gBR_2, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gBR" }, @@ -303,7 +408,15 @@ asn_TYPE_member_t asn_MBR_TestCond_Type_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_aMBR_5, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "aMBR" }, @@ -312,7 +425,15 @@ asn_TYPE_member_t asn_MBR_TestCond_Type_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_isStat_8, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "isStat" }, @@ -321,7 +442,15 @@ asn_TYPE_member_t asn_MBR_TestCond_Type_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_isCatM_11, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "isCatM" }, @@ -330,7 +459,15 @@ asn_TYPE_member_t asn_MBR_TestCond_Type_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_rSRP_14, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "rSRP" }, @@ -339,7 +476,15 @@ asn_TYPE_member_t asn_MBR_TestCond_Type_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_rSRQ_17, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "rSRQ" }, @@ -370,7 +515,15 @@ asn_TYPE_descriptor_t asn_DEF_TestCond_Type = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_TestCond_Type_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_TestCond_Type_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_TestCond_Type_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_TestCond_Type_1, 6, /* Elements count */ &asn_SPC_TestCond_Type_specs_1 /* Additional specs */ diff --git a/e2sm/lib/TestCond-Value.c b/e2sm/lib/TestCond-Value.c index 0b6a55d..5f73afe 100644 --- a/e2sm/lib/TestCond-Value.c +++ b/e2sm/lib/TestCond-Value.c @@ -1,24 +1,39 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "TestCond-Value.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_TestCond_Value_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_TestCond_Value_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_TestCond_Value_1[] = { { ATF_NOFLAGS, 0, offsetof(struct TestCond_Value, choice.valueInt), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "valueInt" }, @@ -27,7 +42,15 @@ asn_TYPE_member_t asn_MBR_TestCond_Value_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "valueEnum" }, @@ -36,7 +59,15 @@ asn_TYPE_member_t asn_MBR_TestCond_Value_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "valueBool" }, @@ -45,7 +76,15 @@ asn_TYPE_member_t asn_MBR_TestCond_Value_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "valueBitS" }, @@ -54,7 +93,15 @@ asn_TYPE_member_t asn_MBR_TestCond_Value_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "valueOctS" }, @@ -63,7 +110,15 @@ asn_TYPE_member_t asn_MBR_TestCond_Value_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_PrintableString, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "valuePrtS" }, @@ -94,7 +149,15 @@ asn_TYPE_descriptor_t asn_DEF_TestCond_Value = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_TestCond_Value_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_TestCond_Value_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_TestCond_Value_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_TestCond_Value_1, 6, /* Elements count */ &asn_SPC_TestCond_Value_specs_1 /* Additional specs */ diff --git a/e2sm/lib/TestCondInfo.c b/e2sm/lib/TestCondInfo.c index 6b5be85..5f28d6c 100644 --- a/e2sm/lib/TestCondInfo.c +++ b/e2sm/lib/TestCondInfo.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "TestCondInfo.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_TestCondInfo_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_TestCond_Type, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "testType" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_TestCondInfo_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_TestCond_Expression, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "testExpr" }, @@ -31,7 +47,15 @@ asn_TYPE_member_t asn_MBR_TestCondInfo_1[] = { +1, /* EXPLICIT tag at current level */ &asn_DEF_TestCond_Value, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "testValue" }, @@ -62,7 +86,15 @@ asn_TYPE_descriptor_t asn_DEF_TestCondInfo = { asn_DEF_TestCondInfo_tags_1, /* Same as above */ sizeof(asn_DEF_TestCondInfo_tags_1) /sizeof(asn_DEF_TestCondInfo_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_TestCondInfo_1, 3, /* Elements count */ &asn_SPC_TestCondInfo_specs_1 /* Additional specs */ diff --git a/e2sm/lib/TimeStamp.c b/e2sm/lib/TimeStamp.c index 36a5f47..3c7f7c0 100644 --- a/e2sm/lib/TimeStamp.c +++ b/e2sm/lib/TimeStamp.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-KPM-IEs" - * found in "kpmv2.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "kpm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "TimeStamp.h" @@ -22,7 +22,7 @@ TimeStamp_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; - if((size == 4)) { + if((size == 4UL)) { /* Constraint check succeeded */ return 0; } else { @@ -37,11 +37,18 @@ TimeStamp_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_TimeStamp_constr_1 CC_NOTUSED = { + { 0, 0 }, + 4 /* (SIZE(4..4)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_TimeStamp_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 4, 4 } /* (SIZE(4..4)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ static const ber_tlv_tag_t asn_DEF_TimeStamp_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; @@ -55,7 +62,15 @@ asn_TYPE_descriptor_t asn_DEF_TimeStamp = { asn_DEF_TimeStamp_tags_1, /* Same as above */ sizeof(asn_DEF_TimeStamp_tags_1) /sizeof(asn_DEF_TimeStamp_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_TimeStamp_constr_1, TimeStamp_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_TimeStamp_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_TimeStamp_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + TimeStamp_constraint + }, 0, 0, /* No members */ &asn_SPC_OCTET_STRING_specs /* Additional specs */ }; diff --git a/e2sm/lib/Timestamp.c b/e2sm/lib/Timestamp.c deleted file mode 100644 index 41a862f..0000000 --- a/e2sm/lib/Timestamp.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "Timestamp.h" - -/* - * This type is implemented using OCTET_STRING, - * so here we adjust the DEF accordingly. - */ -static const ber_tlv_tag_t asn_DEF_Timestamp_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) -}; -asn_TYPE_descriptor_t asn_DEF_Timestamp = { - "Timestamp", - "Timestamp", - &asn_OP_OCTET_STRING, - asn_DEF_Timestamp_tags_1, - sizeof(asn_DEF_Timestamp_tags_1) - /sizeof(asn_DEF_Timestamp_tags_1[0]), /* 1 */ - asn_DEF_Timestamp_tags_1, /* Same as above */ - sizeof(asn_DEF_Timestamp_tags_1) - /sizeof(asn_DEF_Timestamp_tags_1[0]), /* 1 */ - { 0, 0, OCTET_STRING_constraint }, - 0, 0, /* No members */ - &asn_SPC_OCTET_STRING_specs /* Additional specs */ -}; - diff --git a/e2sm/lib/Trigger-ConditionIE-Item.c b/e2sm/lib/Trigger-ConditionIE-Item.c deleted file mode 100644 index c434c1b..0000000 --- a/e2sm/lib/Trigger-ConditionIE-Item.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -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/e2sm/lib/UE-Report-Type.c b/e2sm/lib/UE-Report-Type.c deleted file mode 100644 index 34f7512..0000000 --- a/e2sm/lib/UE-Report-Type.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) - * From ASN.1 module "E2SM-KPM-IEs" - * found in "e2sm-kpm-v01.02.asn" - * `asn1c -pdu=auto -fno-include-deps -fcompound-names -findirect-choice -gen-PER -gen-OER -no-gen-example` - */ - -#include "UE-Report-Type.h" - -/* - * This type is implemented using NativeEnumerated, - * so here we adjust the DEF accordingly. - */ -static asn_oer_constraints_t asn_OER_type_UE_Report_Type_constr_1 CC_NOTUSED = { - { 0, 0 }, - -1}; -asn_per_constraints_t asn_PER_type_UE_Report_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_UE_Report_Type_value2enum_1[] = { - { 0, 17, "oDU-Report-Per-UE" }, - { 1, 20, "oCU-CP-Report-Per-UE" }, - { 2, 20, "oCU-UP-Report-Per-UE" } - /* This list is extensible */ -}; -static const unsigned int asn_MAP_UE_Report_Type_enum2value_1[] = { - 1, /* oCU-CP-Report-Per-UE(1) */ - 2, /* oCU-UP-Report-Per-UE(2) */ - 0 /* oDU-Report-Per-UE(0) */ - /* This list is extensible */ -}; -const asn_INTEGER_specifics_t asn_SPC_UE_Report_Type_specs_1 = { - asn_MAP_UE_Report_Type_value2enum_1, /* "tag" => N; sorted by tag */ - asn_MAP_UE_Report_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_UE_Report_Type_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) -}; -asn_TYPE_descriptor_t asn_DEF_UE_Report_Type = { - "UE-Report-Type", - "UE-Report-Type", - &asn_OP_NativeEnumerated, - asn_DEF_UE_Report_Type_tags_1, - sizeof(asn_DEF_UE_Report_Type_tags_1) - /sizeof(asn_DEF_UE_Report_Type_tags_1[0]), /* 1 */ - asn_DEF_UE_Report_Type_tags_1, /* Same as above */ - sizeof(asn_DEF_UE_Report_Type_tags_1) - /sizeof(asn_DEF_UE_Report_Type_tags_1[0]), /* 1 */ - { &asn_OER_type_UE_Report_Type_constr_1, &asn_PER_type_UE_Report_Type_constr_1, NativeEnumerated_constraint }, - 0, 0, /* Defined elsewhere */ - &asn_SPC_UE_Report_Type_specs_1 /* Additional specs */ -}; - diff --git a/e2sm/lib/UEID-EN-GNB.c b/e2sm/lib/UEID-EN-GNB.c index 16c48e6..d24f428 100644 --- a/e2sm/lib/UEID-EN-GNB.c +++ b/e2sm/lib/UEID-EN-GNB.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID-EN-GNB.h" @@ -14,7 +14,15 @@ asn_TYPE_member_t asn_MBR_UEID_EN_GNB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_ENB_UE_X2AP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "m-eNB-UE-X2AP-ID" }, @@ -23,7 +31,15 @@ asn_TYPE_member_t asn_MBR_UEID_EN_GNB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_ENB_UE_X2AP_ID_Extension, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "m-eNB-UE-X2AP-ID-Extension" }, @@ -32,7 +48,15 @@ asn_TYPE_member_t asn_MBR_UEID_EN_GNB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalENB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "globalENB-ID" }, @@ -41,7 +65,15 @@ asn_TYPE_member_t asn_MBR_UEID_EN_GNB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GNB_CU_UE_F1AP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-CU-UE-F1AP-ID" }, @@ -50,7 +82,15 @@ asn_TYPE_member_t asn_MBR_UEID_EN_GNB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_UEID_GNB_CU_CP_E1AP_ID_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-CU-CP-UE-E1AP-ID-List" }, @@ -59,7 +99,15 @@ asn_TYPE_member_t asn_MBR_UEID_EN_GNB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RANUEID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ran-UEID" }, @@ -95,7 +143,15 @@ asn_TYPE_descriptor_t asn_DEF_UEID_EN_GNB = { asn_DEF_UEID_EN_GNB_tags_1, /* Same as above */ sizeof(asn_DEF_UEID_EN_GNB_tags_1) /sizeof(asn_DEF_UEID_EN_GNB_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_UEID_EN_GNB_1, 6, /* Elements count */ &asn_SPC_UEID_EN_GNB_specs_1 /* Additional specs */ diff --git a/e2sm/lib/UEID-ENB.c b/e2sm/lib/UEID-ENB.c index 4897f16..edd9f0d 100644 --- a/e2sm/lib/UEID-ENB.c +++ b/e2sm/lib/UEID-ENB.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID-ENB.h" @@ -14,7 +14,15 @@ asn_TYPE_member_t asn_MBR_UEID_ENB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_MME_UE_S1AP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "mME-UE-S1AP-ID" }, @@ -23,7 +31,15 @@ asn_TYPE_member_t asn_MBR_UEID_ENB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GUMMEI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gUMMEI" }, @@ -32,7 +48,15 @@ asn_TYPE_member_t asn_MBR_UEID_ENB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_ENB_UE_X2AP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "m-eNB-UE-X2AP-ID" }, @@ -41,7 +65,15 @@ asn_TYPE_member_t asn_MBR_UEID_ENB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_ENB_UE_X2AP_ID_Extension, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "m-eNB-UE-X2AP-ID-Extension" }, @@ -50,7 +82,15 @@ asn_TYPE_member_t asn_MBR_UEID_ENB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalENB_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "globalENB-ID" }, @@ -85,7 +125,15 @@ asn_TYPE_descriptor_t asn_DEF_UEID_ENB = { asn_DEF_UEID_ENB_tags_1, /* Same as above */ sizeof(asn_DEF_UEID_ENB_tags_1) /sizeof(asn_DEF_UEID_ENB_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_UEID_ENB_1, 5, /* Elements count */ &asn_SPC_UEID_ENB_specs_1 /* Additional specs */ diff --git a/e2sm/lib/UEID-GNB-CU-CP-E1AP-ID-Item.c b/e2sm/lib/UEID-GNB-CU-CP-E1AP-ID-Item.c index 05cfbc3..135cfcc 100644 --- a/e2sm/lib/UEID-GNB-CU-CP-E1AP-ID-Item.c +++ b/e2sm/lib/UEID-GNB-CU-CP-E1AP-ID-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID-GNB-CU-CP-E1AP-ID-Item.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_UEID_GNB_CU_CP_E1AP_ID_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GNB_CU_CP_UE_E1AP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-CU-CP-UE-E1AP-ID" }, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_UEID_GNB_CU_CP_E1AP_ID_Item = { asn_DEF_UEID_GNB_CU_CP_E1AP_ID_Item_tags_1, /* Same as above */ sizeof(asn_DEF_UEID_GNB_CU_CP_E1AP_ID_Item_tags_1) /sizeof(asn_DEF_UEID_GNB_CU_CP_E1AP_ID_Item_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_UEID_GNB_CU_CP_E1AP_ID_Item_1, 1, /* Elements count */ &asn_SPC_UEID_GNB_CU_CP_E1AP_ID_Item_specs_1 /* Additional specs */ diff --git a/e2sm/lib/UEID-GNB-CU-CP-E1AP-ID-List.c b/e2sm/lib/UEID-GNB-CU-CP-E1AP-ID-List.c index 427847d..2142d6f 100644 --- a/e2sm/lib/UEID-GNB-CU-CP-E1AP-ID-List.c +++ b/e2sm/lib/UEID-GNB-CU-CP-E1AP-ID-List.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID-GNB-CU-CP-E1AP-ID-List.h" #include "UEID-GNB-CU-CP-E1AP-ID-Item.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_UEID_GNB_CU_CP_E1AP_ID_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..65535)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_UEID_GNB_CU_CP_E1AP_ID_List_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 1, 65535 } /* (SIZE(1..65535)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_UEID_GNB_CU_CP_E1AP_ID_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_UEID_GNB_CU_CP_E1AP_ID_Item, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -42,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_UEID_GNB_CU_CP_E1AP_ID_List = { asn_DEF_UEID_GNB_CU_CP_E1AP_ID_List_tags_1, /* Same as above */ sizeof(asn_DEF_UEID_GNB_CU_CP_E1AP_ID_List_tags_1) /sizeof(asn_DEF_UEID_GNB_CU_CP_E1AP_ID_List_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_UEID_GNB_CU_CP_E1AP_ID_List_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_UEID_GNB_CU_CP_E1AP_ID_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_UEID_GNB_CU_CP_E1AP_ID_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_UEID_GNB_CU_CP_E1AP_ID_List_1, 1, /* Single element */ &asn_SPC_UEID_GNB_CU_CP_E1AP_ID_List_specs_1 /* Additional specs */ diff --git a/e2sm/lib/UEID-GNB-CU-CP-F1AP-ID-Item.c b/e2sm/lib/UEID-GNB-CU-CP-F1AP-ID-Item.c index 4c1cedd..d8c9810 100644 --- a/e2sm/lib/UEID-GNB-CU-CP-F1AP-ID-Item.c +++ b/e2sm/lib/UEID-GNB-CU-CP-F1AP-ID-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID-GNB-CU-CP-F1AP-ID-Item.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_UEID_GNB_CU_CP_F1AP_ID_Item_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GNB_CU_UE_F1AP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-CU-UE-F1AP-ID" }, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_UEID_GNB_CU_CP_F1AP_ID_Item = { asn_DEF_UEID_GNB_CU_CP_F1AP_ID_Item_tags_1, /* Same as above */ sizeof(asn_DEF_UEID_GNB_CU_CP_F1AP_ID_Item_tags_1) /sizeof(asn_DEF_UEID_GNB_CU_CP_F1AP_ID_Item_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_UEID_GNB_CU_CP_F1AP_ID_Item_1, 1, /* Elements count */ &asn_SPC_UEID_GNB_CU_CP_F1AP_ID_Item_specs_1 /* Additional specs */ diff --git a/e2sm/lib/UEID-GNB-CU-F1AP-ID-List.c b/e2sm/lib/UEID-GNB-CU-F1AP-ID-List.c index 578eedc..12e5c4c 100644 --- a/e2sm/lib/UEID-GNB-CU-F1AP-ID-List.c +++ b/e2sm/lib/UEID-GNB-CU-F1AP-ID-List.c @@ -1,25 +1,40 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID-GNB-CU-F1AP-ID-List.h" #include "UEID-GNB-CU-CP-F1AP-ID-Item.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_UEID_GNB_CU_F1AP_ID_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..4)) */}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_UEID_GNB_CU_F1AP_ID_List_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 2, 2, 1, 4 } /* (SIZE(1..4)) */, 0, 0 /* No PER value map */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_UEID_GNB_CU_F1AP_ID_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_UEID_GNB_CU_CP_F1AP_ID_Item, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "" }, @@ -42,7 +57,15 @@ asn_TYPE_descriptor_t asn_DEF_UEID_GNB_CU_F1AP_ID_List = { asn_DEF_UEID_GNB_CU_F1AP_ID_List_tags_1, /* Same as above */ sizeof(asn_DEF_UEID_GNB_CU_F1AP_ID_List_tags_1) /sizeof(asn_DEF_UEID_GNB_CU_F1AP_ID_List_tags_1[0]), /* 1 */ - { 0, &asn_PER_type_UEID_GNB_CU_F1AP_ID_List_constr_1, SEQUENCE_OF_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_UEID_GNB_CU_F1AP_ID_List_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_UEID_GNB_CU_F1AP_ID_List_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_OF_constraint + }, asn_MBR_UEID_GNB_CU_F1AP_ID_List_1, 1, /* Single element */ &asn_SPC_UEID_GNB_CU_F1AP_ID_List_specs_1 /* Additional specs */ diff --git a/e2sm/lib/UEID-GNB-CU-UP.c b/e2sm/lib/UEID-GNB-CU-UP.c index d8f4b1c..0865b6e 100644 --- a/e2sm/lib/UEID-GNB-CU-UP.c +++ b/e2sm/lib/UEID-GNB-CU-UP.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID-GNB-CU-UP.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_UEID_GNB_CU_UP_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GNB_CU_CP_UE_E1AP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-CU-CP-UE-E1AP-ID" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_UEID_GNB_CU_UP_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RANUEID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ran-UEID" }, @@ -54,7 +70,15 @@ asn_TYPE_descriptor_t asn_DEF_UEID_GNB_CU_UP = { asn_DEF_UEID_GNB_CU_UP_tags_1, /* Same as above */ sizeof(asn_DEF_UEID_GNB_CU_UP_tags_1) /sizeof(asn_DEF_UEID_GNB_CU_UP_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_UEID_GNB_CU_UP_1, 2, /* Elements count */ &asn_SPC_UEID_GNB_CU_UP_specs_1 /* Additional specs */ diff --git a/e2sm/lib/UEID-GNB-DU.c b/e2sm/lib/UEID-GNB-DU.c index 3b2eae6..7b4eed0 100644 --- a/e2sm/lib/UEID-GNB-DU.c +++ b/e2sm/lib/UEID-GNB-DU.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID-GNB-DU.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_UEID_GNB_DU_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GNB_CU_UE_F1AP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-CU-UE-F1AP-ID" }, @@ -22,7 +30,15 @@ asn_TYPE_member_t asn_MBR_UEID_GNB_DU_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_RANUEID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ran-UEID" }, @@ -54,7 +70,15 @@ asn_TYPE_descriptor_t asn_DEF_UEID_GNB_DU = { asn_DEF_UEID_GNB_DU_tags_1, /* Same as above */ sizeof(asn_DEF_UEID_GNB_DU_tags_1) /sizeof(asn_DEF_UEID_GNB_DU_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_UEID_GNB_DU_1, 2, /* Elements count */ &asn_SPC_UEID_GNB_DU_specs_1 /* Additional specs */ diff --git a/e2sm/lib/UEID-GNB.c b/e2sm/lib/UEID-GNB.c index 812dbf0..3f7a17f 100644 --- a/e2sm/lib/UEID-GNB.c +++ b/e2sm/lib/UEID-GNB.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID-GNB.h" @@ -10,14 +10,21 @@ #include "UEID-GNB-CU-F1AP-ID-List.h" #include "UEID-GNB-CU-CP-E1AP-ID-List.h" #include "GlobalGNB-ID.h" -#include "GlobalNGRANNodeID.h" asn_TYPE_member_t asn_MBR_UEID_GNB_1[] = { { ATF_NOFLAGS, 0, offsetof(struct UEID_GNB, amf_UE_NGAP_ID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AMF_UE_NGAP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "amf-UE-NGAP-ID" }, @@ -26,66 +33,105 @@ asn_TYPE_member_t asn_MBR_UEID_GNB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GUAMI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "guami" }, - { ATF_POINTER, 6, offsetof(struct UEID_GNB, gNB_CU_UE_F1AP_ID_List), + { ATF_POINTER, 5, offsetof(struct UEID_GNB, gNB_CU_UE_F1AP_ID_List), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UEID_GNB_CU_F1AP_ID_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-CU-UE-F1AP-ID-List" }, - { ATF_POINTER, 5, offsetof(struct UEID_GNB, gNB_CU_CP_UE_E1AP_ID_List), + { ATF_POINTER, 4, offsetof(struct UEID_GNB, gNB_CU_CP_UE_E1AP_ID_List), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UEID_GNB_CU_CP_E1AP_ID_List, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-CU-CP-UE-E1AP-ID-List" }, - { ATF_POINTER, 4, offsetof(struct UEID_GNB, ran_UEID), + { ATF_POINTER, 3, offsetof(struct UEID_GNB, ran_UEID), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RANUEID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ran-UEID" }, - { ATF_POINTER, 3, offsetof(struct UEID_GNB, m_NG_RAN_UE_XnAP_ID), + { ATF_POINTER, 2, offsetof(struct UEID_GNB, m_NG_RAN_UE_XnAP_ID), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NG_RANnodeUEXnAPID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "m-NG-RAN-UE-XnAP-ID" }, - { ATF_POINTER, 2, offsetof(struct UEID_GNB, globalGNB_ID), + { ATF_POINTER, 1, offsetof(struct UEID_GNB, globalGNB_ID), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalGNB_ID, 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "globalGNB-ID" + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 }, - { ATF_POINTER, 1, offsetof(struct UEID_GNB, globalNG_RANNode_ID), - (ASN_TAG_CLASS_CONTEXT | (7 << 2)), - +1, /* EXPLICIT tag at current level */ - &asn_DEF_GlobalNGRANNodeID, - 0, - { 0, 0, 0 }, 0, 0, /* No default value */ - "globalNG-RANNode-ID" + "globalGNB-ID" }, }; -static const int asn_MAP_UEID_GNB_oms_1[] = { 2, 3, 4, 5, 6, 7 }; +static const int asn_MAP_UEID_GNB_oms_1[] = { 2, 3, 4, 5, 6 }; static const ber_tlv_tag_t asn_DEF_UEID_GNB_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; @@ -96,16 +142,15 @@ static const asn_TYPE_tag2member_t asn_MAP_UEID_GNB_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* gNB-CU-CP-UE-E1AP-ID-List */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* ran-UEID */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* m-NG-RAN-UE-XnAP-ID */ - { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* globalGNB-ID */ - { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 } /* globalNG-RANNode-ID */ + { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* globalGNB-ID */ }; asn_SEQUENCE_specifics_t asn_SPC_UEID_GNB_specs_1 = { sizeof(struct UEID_GNB), offsetof(struct UEID_GNB, _asn_ctx), asn_MAP_UEID_GNB_tag2el_1, - 8, /* Count of tags in the map */ + 7, /* Count of tags in the map */ asn_MAP_UEID_GNB_oms_1, /* Optional members */ - 5, 1, /* Root/Additions */ + 5, 0, /* Root/Additions */ 7, /* First extension addition */ }; asn_TYPE_descriptor_t asn_DEF_UEID_GNB = { @@ -118,9 +163,17 @@ asn_TYPE_descriptor_t asn_DEF_UEID_GNB = { asn_DEF_UEID_GNB_tags_1, /* Same as above */ sizeof(asn_DEF_UEID_GNB_tags_1) /sizeof(asn_DEF_UEID_GNB_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_UEID_GNB_1, - 8, /* Elements count */ + 7, /* Elements count */ &asn_SPC_UEID_GNB_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/UEID-NG-ENB-DU.c b/e2sm/lib/UEID-NG-ENB-DU.c index 36a652d..ca03684 100644 --- a/e2sm/lib/UEID-NG-ENB-DU.c +++ b/e2sm/lib/UEID-NG-ENB-DU.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID-NG-ENB-DU.h" @@ -13,7 +13,15 @@ asn_TYPE_member_t asn_MBR_UEID_NG_ENB_DU_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_NGENB_CU_UE_W1AP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ng-eNB-CU-UE-W1AP-ID" }, @@ -42,7 +50,15 @@ asn_TYPE_descriptor_t asn_DEF_UEID_NG_ENB_DU = { asn_DEF_UEID_NG_ENB_DU_tags_1, /* Same as above */ sizeof(asn_DEF_UEID_NG_ENB_DU_tags_1) /sizeof(asn_DEF_UEID_NG_ENB_DU_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_UEID_NG_ENB_DU_1, 1, /* Elements count */ &asn_SPC_UEID_NG_ENB_DU_specs_1 /* Additional specs */ diff --git a/e2sm/lib/UEID-NG-ENB.c b/e2sm/lib/UEID-NG-ENB.c index cf9fd1e..4986931 100644 --- a/e2sm/lib/UEID-NG-ENB.c +++ b/e2sm/lib/UEID-NG-ENB.c @@ -1,21 +1,28 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID-NG-ENB.h" #include "GlobalNgENB-ID.h" -#include "GlobalNGRANNodeID.h" asn_TYPE_member_t asn_MBR_UEID_NG_ENB_1[] = { { ATF_NOFLAGS, 0, offsetof(struct UEID_NG_ENB, amf_UE_NGAP_ID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AMF_UE_NGAP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "amf-UE-NGAP-ID" }, @@ -24,48 +31,71 @@ asn_TYPE_member_t asn_MBR_UEID_NG_ENB_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_GUAMI, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "guami" }, - { ATF_POINTER, 4, offsetof(struct UEID_NG_ENB, ng_eNB_CU_UE_W1AP_ID), + { ATF_POINTER, 3, offsetof(struct UEID_NG_ENB, ng_eNB_CU_UE_W1AP_ID), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NGENB_CU_UE_W1AP_ID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ng-eNB-CU-UE-W1AP-ID" }, - { ATF_POINTER, 3, offsetof(struct UEID_NG_ENB, m_NG_RAN_UE_XnAP_ID), + { ATF_POINTER, 2, offsetof(struct UEID_NG_ENB, m_NG_RAN_UE_XnAP_ID), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NG_RANnodeUEXnAPID, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "m-NG-RAN-UE-XnAP-ID" }, - { ATF_POINTER, 2, offsetof(struct UEID_NG_ENB, globalNgENB_ID), + { ATF_POINTER, 1, offsetof(struct UEID_NG_ENB, globalNgENB_ID), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GlobalNgENB_ID, 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "globalNgENB-ID" + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 }, - { ATF_POINTER, 1, offsetof(struct UEID_NG_ENB, globalNG_RANNode_ID), - (ASN_TAG_CLASS_CONTEXT | (5 << 2)), - +1, /* EXPLICIT tag at current level */ - &asn_DEF_GlobalNGRANNodeID, - 0, - { 0, 0, 0 }, 0, 0, /* No default value */ - "globalNG-RANNode-ID" + "globalNgENB-ID" }, }; -static const int asn_MAP_UEID_NG_ENB_oms_1[] = { 2, 3, 4, 5 }; +static const int asn_MAP_UEID_NG_ENB_oms_1[] = { 2, 3, 4 }; static const ber_tlv_tag_t asn_DEF_UEID_NG_ENB_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; @@ -74,16 +104,15 @@ static const asn_TYPE_tag2member_t asn_MAP_UEID_NG_ENB_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* guami */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ng-eNB-CU-UE-W1AP-ID */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* m-NG-RAN-UE-XnAP-ID */ - { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* globalNgENB-ID */ - { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* globalNG-RANNode-ID */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* globalNgENB-ID */ }; asn_SEQUENCE_specifics_t asn_SPC_UEID_NG_ENB_specs_1 = { sizeof(struct UEID_NG_ENB), offsetof(struct UEID_NG_ENB, _asn_ctx), asn_MAP_UEID_NG_ENB_tag2el_1, - 6, /* Count of tags in the map */ + 5, /* Count of tags in the map */ asn_MAP_UEID_NG_ENB_oms_1, /* Optional members */ - 3, 1, /* Root/Additions */ + 3, 0, /* Root/Additions */ 5, /* First extension addition */ }; asn_TYPE_descriptor_t asn_DEF_UEID_NG_ENB = { @@ -96,9 +125,17 @@ asn_TYPE_descriptor_t asn_DEF_UEID_NG_ENB = { asn_DEF_UEID_NG_ENB_tags_1, /* Same as above */ sizeof(asn_DEF_UEID_NG_ENB_tags_1) /sizeof(asn_DEF_UEID_NG_ENB_tags_1[0]), /* 1 */ - { 0, 0, SEQUENCE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + SEQUENCE_constraint + }, asn_MBR_UEID_NG_ENB_1, - 6, /* Elements count */ + 5, /* Elements count */ &asn_SPC_UEID_NG_ENB_specs_1 /* Additional specs */ }; diff --git a/e2sm/lib/UEID.c b/e2sm/lib/UEID.c index fcce55c..ba6dac6 100644 --- a/e2sm/lib/UEID.c +++ b/e2sm/lib/UEID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2SM-COMMON-IEs" - * found in "E2SM-COMMON-IEs.asn" - * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -gen-PER -no-gen-OER -no-gen-example` + * found in "e2sm2_0.asn" + * `asn1c -pdu=auto -fincludes-quoted -fcompound-names -findirect-choice -fno-include-deps -no-gen-example -gen-APER` */ #include "UEID.h" @@ -14,18 +14,33 @@ #include "UEID-NG-ENB-DU.h" #include "UEID-EN-GNB.h" #include "UEID-ENB.h" +#if !defined(ASN_DISABLE_OER_SUPPORT) +static asn_oer_constraints_t asn_OER_type_UEID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) asn_per_constraints_t asn_PER_type_UEID_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 */ }; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ asn_TYPE_member_t asn_MBR_UEID_1[] = { { ATF_POINTER, 0, offsetof(struct UEID, choice.gNB_UEID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UEID_GNB, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-UEID" }, @@ -34,7 +49,15 @@ asn_TYPE_member_t asn_MBR_UEID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_UEID_GNB_DU, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-DU-UEID" }, @@ -43,7 +66,15 @@ asn_TYPE_member_t asn_MBR_UEID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_UEID_GNB_CU_UP, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "gNB-CU-UP-UEID" }, @@ -52,7 +83,15 @@ asn_TYPE_member_t asn_MBR_UEID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_UEID_NG_ENB, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ng-eNB-UEID" }, @@ -61,7 +100,15 @@ asn_TYPE_member_t asn_MBR_UEID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_UEID_NG_ENB_DU, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "ng-eNB-DU-UEID" }, @@ -70,7 +117,15 @@ asn_TYPE_member_t asn_MBR_UEID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_UEID_EN_GNB, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "en-gNB-UEID" }, @@ -79,7 +134,15 @@ asn_TYPE_member_t asn_MBR_UEID_1[] = { -1, /* IMPLICIT tag at current level */ &asn_DEF_UEID_ENB, 0, - { 0, 0, 0 }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + 0 + }, 0, 0, /* No default value */ "eNB-UEID" }, @@ -111,7 +174,15 @@ asn_TYPE_descriptor_t asn_DEF_UEID = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - { 0, &asn_PER_type_UEID_constr_1, CHOICE_constraint }, + { +#if !defined(ASN_DISABLE_OER_SUPPORT) + &asn_OER_type_UEID_constr_1, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + &asn_PER_type_UEID_constr_1, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + CHOICE_constraint + }, asn_MBR_UEID_1, 7, /* Elements count */ &asn_SPC_UEID_specs_1 /* Additional specs */ diff --git a/e2sm/lib/UTCTime.c b/e2sm/lib/UTCTime.c deleted file mode 100644 index 07891ac..0000000 --- a/e2sm/lib/UTCTime.c +++ /dev/null @@ -1,277 +0,0 @@ -/*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include -#include -#include - -#ifdef __CYGWIN__ -#include "/usr/include/time.h" -#else -#include -#endif /* __CYGWIN__ */ - -#ifndef ASN___INTERNAL_TEST_MODE - -/* - * UTCTime basic type description. - */ -static const ber_tlv_tag_t asn_DEF_UTCTime_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (23 << 2)), /* [UNIVERSAL 23] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ -}; -static asn_per_constraints_t asn_DEF_UTCTime_constraints = { - { APC_CONSTRAINED, 7, 7, 0x20, 0x7e }, /* Value */ - { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ - 0, 0 -}; -asn_TYPE_operation_t asn_OP_UTCTime = { - OCTET_STRING_free, - UTCTime_print, - UTCTime_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_utf8, - UTCTime_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, - OCTET_STRING_encode_uper, - OCTET_STRING_decode_aper, - OCTET_STRING_encode_aper, -#endif /* ASN_DISABLE_PER_SUPPORT */ - UTCTime_random_fill, - 0 /* Use generic outmost tag fetcher */ -}; -asn_TYPE_descriptor_t asn_DEF_UTCTime = { - "UTCTime", - "UTCTime", - &asn_OP_UTCTime, - asn_DEF_UTCTime_tags, - sizeof(asn_DEF_UTCTime_tags) - / sizeof(asn_DEF_UTCTime_tags[0]) - 2, - asn_DEF_UTCTime_tags, - sizeof(asn_DEF_UTCTime_tags) - / sizeof(asn_DEF_UTCTime_tags[0]), - { 0, &asn_DEF_UTCTime_constraints, UTCTime_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - -#endif /* ASN___INTERNAL_TEST_MODE */ - -/* - * Check that the time looks like the time. - */ -int -UTCTime_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, - asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const UTCTime_t *st = (const UTCTime_t *)sptr; - time_t tloc; - - errno = EPERM; /* Just an unlikely error code */ - tloc = asn_UT2time(st, 0, 0); - if(tloc == -1 && errno != EPERM) { - ASN__CTFAIL(app_key, td, sptr, "%s: Invalid time format: %s (%s:%d)", - td->name, strerror(errno), __FILE__, __LINE__); - return -1; - } - - return 0; -} - -#ifndef ASN___INTERNAL_TEST_MODE - -asn_enc_rval_t -UTCTime_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) { - if(flags & XER_F_CANONICAL) { - asn_enc_rval_t rv; - UTCTime_t *ut; - struct tm tm; - - errno = EPERM; - if(asn_UT2time((const UTCTime_t *)sptr, &tm, 1) == -1 - && errno != EPERM) - ASN__ENCODE_FAILED; - - /* Fractions are not allowed in UTCTime */ - ut = asn_time2UT(0, &tm, 1); - if(!ut) ASN__ENCODE_FAILED; - - rv = OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, - cb, app_key); - OCTET_STRING_free(&asn_DEF_UTCTime, ut, 0); - return rv; - } else { - return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, - cb, app_key); - } -} - -#endif /* ASN___INTERNAL_TEST_MODE */ - -int -UTCTime_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, - asn_app_consume_bytes_f *cb, void *app_key) { - const UTCTime_t *st = (const UTCTime_t *)sptr; - - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(st && st->buf) { - char buf[32]; - struct tm tm; - int ret; - - errno = EPERM; - if(asn_UT2time(st, &tm, 1) == -1 && errno != EPERM) - return (cb("", 11, app_key) < 0) ? -1 : 0; - - ret = snprintf(buf, sizeof(buf), - "%04d-%02d-%02d %02d:%02d:%02d (GMT)", - tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec); - assert(ret > 0 && ret < (int)sizeof(buf)); - return (cb(buf, ret, app_key) < 0) ? -1 : 0; - } else { - return (cb("", 8, app_key) < 0) ? -1 : 0; - } -} - -time_t -asn_UT2time(const UTCTime_t *st, struct tm *_tm, int as_gmt) { - char buf[24]; /* "AAMMJJhhmmss+hhmm" + cushion */ - GeneralizedTime_t gt; - - if(!st || !st->buf - || st->size < 11 || st->size >= ((int)sizeof(buf) - 2)) { - errno = EINVAL; - return -1; - } - - gt.buf = (unsigned char *)buf; - gt.size = st->size + 2; - memcpy(gt.buf + 2, st->buf, st->size); - if(st->buf[0] > 0x35) { - /* 19xx */ - gt.buf[0] = 0x31; - gt.buf[1] = 0x39; - } else { - /* 20xx */ - gt.buf[0] = 0x32; - gt.buf[1] = 0x30; - } - - return asn_GT2time(>, _tm, as_gmt); -} - -UTCTime_t * -asn_time2UT(UTCTime_t *opt_ut, const struct tm *tm, int force_gmt) { - GeneralizedTime_t *gt = (GeneralizedTime_t *)opt_ut; - - gt = asn_time2GT(gt, tm, force_gmt); - if(gt == 0) return 0; - - assert(gt->size >= 2); - gt->size -= 2; - memmove(gt->buf, gt->buf + 2, gt->size + 1); - - return (UTCTime_t *)gt; -} - - -asn_random_fill_result_t -UTCTime_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, - const asn_encoding_constraints_t *constraints, - size_t max_length) { - 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 const char *values[] = { - "700101000000", "700101000000-0000", "700101000000+0000", - "700101000000Z", "821106210623", "691106210827-0500", - "821106210629Z", - }; - size_t rnd = asn_random_between(0, sizeof(values)/sizeof(values[0])-1); - - (void)constraints; - - if(max_length < sizeof("yymmddhhmmss") && !*sptr) { - return result_skipped; - } - - if(*sptr) { - if(OCTET_STRING_fromBuf(*sptr, values[rnd], -1) != 0) { - if(!sptr) return result_failed; - } - } else { - *sptr = OCTET_STRING_new_fromBuf(td, values[rnd], -1); - if(!sptr) return result_failed; - } - - return result_ok; -} - -int -UTCTime_compare(const asn_TYPE_descriptor_t *td, const void *aptr, - const void *bptr) { - const GeneralizedTime_t *a = aptr; - const GeneralizedTime_t *b = bptr; - - (void)td; - - if(a && b) { - time_t at, bt; - int aerr, berr; - - errno = EPERM; - at = asn_UT2time(a, 0, 0); - aerr = errno; - errno = EPERM; - bt = asn_UT2time(b, 0, 0); - berr = errno; - - if(at == -1 && aerr != EPERM) { - if(bt == -1 && berr != EPERM) { - return OCTET_STRING_compare(td, aptr, bptr); - } else { - return -1; - } - } else if(bt == -1 && berr != EPERM) { - return 1; - } else { - /* Both values are valid. */ - } - - if(at < bt) { - return -1; - } else if(at > bt) { - return 1; - } else { - return 0; - } - } else if(!a && !b) { - return 0; - } else if(!a) { - return -1; - } else { - return 1; - } -} - diff --git a/e2sm/lib/UTF8String.c b/e2sm/lib/UTF8String.c deleted file mode 100644 index c023ca1..0000000 --- a/e2sm/lib/UTF8String.c +++ /dev/null @@ -1,294 +0,0 @@ -/*- - * Copyright (c) 2003, 2004, 2006 Lev Walkin . - * All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include - -/* - * UTF8String basic type description. - */ -static const ber_tlv_tag_t asn_DEF_UTF8String_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), /* [UNIVERSAL 12] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), /* ... OCTET STRING */ -}; -asn_TYPE_operation_t asn_OP_UTF8String = { - OCTET_STRING_free, - UTF8String_print, - 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 */ - UTF8String_random_fill, - 0 /* Use generic outmost tag fetcher */ -}; -asn_TYPE_descriptor_t asn_DEF_UTF8String = { - "UTF8String", - "UTF8String", - &asn_OP_UTF8String, - asn_DEF_UTF8String_tags, - sizeof(asn_DEF_UTF8String_tags) - / sizeof(asn_DEF_UTF8String_tags[0]) - 1, - asn_DEF_UTF8String_tags, - sizeof(asn_DEF_UTF8String_tags) - / sizeof(asn_DEF_UTF8String_tags[0]), - { 0, 0, UTF8String_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - -/* - * This is the table of length expectations. - * The second half of this table is only applicable to the long sequences. - */ -static const int UTF8String_ht[2][16] = { - { /* 0x0 ... 0x7 */ - /* 0000..0111 */ - 1, 1, 1, 1, 1, 1, 1, 1, - /* 1000..1011(0), 1100..1101(2), 1110(3), 1111(-1) */ - 0, 0, 0, 0, 2, 2, 3, -1 }, - { /* 0xF0 .. 0xF7 */ - /* 11110000..11110111 */ - 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 6, 6, -1, -1 } -}; -static const int32_t UTF8String_mv[7] = { 0, 0, - 0x00000080, - 0x00000800, - 0x00010000, - 0x00200000, - 0x04000000 -}; - -/* Internal aliases for return codes */ -#define U8E_TRUNC -1 /* UTF-8 sequence truncated */ -#define U8E_ILLSTART -2 /* Illegal UTF-8 sequence start */ -#define U8E_NOTCONT -3 /* Continuation expectation failed */ -#define U8E_NOTMIN -4 /* Not minimal length encoding */ -#define U8E_EINVAL -5 /* Invalid arguments */ - -int -UTF8String_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, - asn_app_constraint_failed_f *ctfailcb, void *app_key) { - ssize_t len = UTF8String_length((const UTF8String_t *)sptr); - switch(len) { - case U8E_EINVAL: - ASN__CTFAIL(app_key, td, sptr, - "%s: value not given", td->name); - break; - case U8E_TRUNC: - ASN__CTFAIL(app_key, td, sptr, - "%s: truncated UTF-8 sequence (%s:%d)", - td->name, __FILE__, __LINE__); - break; - case U8E_ILLSTART: - ASN__CTFAIL(app_key, td, sptr, - "%s: UTF-8 illegal start of encoding (%s:%d)", - td->name, __FILE__, __LINE__); - break; - case U8E_NOTCONT: - ASN__CTFAIL(app_key, td, sptr, - "%s: UTF-8 not continuation (%s:%d)", - td->name, __FILE__, __LINE__); - break; - case U8E_NOTMIN: - ASN__CTFAIL(app_key, td, sptr, - "%s: UTF-8 not minimal sequence (%s:%d)", - td->name, __FILE__, __LINE__); - break; - } - return (len < 0) ? -1 : 0; -} - -static ssize_t -UTF8String__process(const UTF8String_t *st, uint32_t *dst, size_t dstlen) { - size_t length; - uint8_t *buf = st->buf; - uint8_t *end = buf + st->size; - uint32_t *dstend = dst + dstlen; - - for(length = 0; buf < end; length++) { - int ch = *buf; - uint8_t *cend; - int32_t value; - int want; - - /* Compute the sequence length */ - want = UTF8String_ht[0][ch >> 4]; - switch(want) { - case -1: - /* Second half of the table, long sequence */ - want = UTF8String_ht[1][ch & 0x0F]; - if(want != -1) break; - /* Fall through */ - case 0: - return U8E_ILLSTART; - } - - /* assert(want >= 1 && want <= 6) */ - - /* Check character sequence length */ - if(buf + want > end) return U8E_TRUNC; - - value = ch & (0xff >> want); - cend = buf + want; - for(buf++; buf < cend; buf++) { - ch = *buf; - if(ch < 0x80 || ch > 0xbf) return U8E_NOTCONT; - value = (value << 6) | (ch & 0x3F); - } - if(value < UTF8String_mv[want]) - return U8E_NOTMIN; - if(dst < dstend) - *dst++ = value; /* Record value */ - } - - if(dst < dstend) *dst = 0; /* zero-terminate */ - - return length; -} - - -ssize_t -UTF8String_length(const UTF8String_t *st) { - if(st && st->buf) { - return UTF8String__process(st, 0, 0); - } else { - return U8E_EINVAL; - } -} - -size_t -UTF8String_to_wcs(const UTF8String_t *st, uint32_t *dst, size_t dstlen) { - if(st && st->buf) { - ssize_t ret = UTF8String__process(st, dst, dstlen); - return (ret < 0) ? 0 : ret; - } else { - return 0; - } -} - -int -UTF8String_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, - asn_app_consume_bytes_f *cb, void *app_key) { - const UTF8String_t *st = (const UTF8String_t *)sptr; - - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(st && st->buf) { - return (cb(st->buf, st->size, app_key) < 0) ? -1 : 0; - } else { - return (cb("", 8, app_key) < 0) ? -1 : 0; - } -} - - -/* - * Biased function for randomizing UTF-8 sequences. - */ -static size_t -UTF8String__random_char(uint8_t *b, size_t size) { - static const struct rnd_value { - const char *value; - size_t size; - } values[] = {{"\0", 1}, - {"\x01", 1}, - {"\x7f", 1}, - {"\xc2\xa2", 2}, - {"\xe2\x82\xac", 3}, - {"\xf0\x90\x8d\x88", 4}, - {"\xf4\x8f\xbf\xbf", 4}}; - - const struct rnd_value *v; - size_t max_idx = 0; - - switch(size) { - case 0: - assert(size != 0); - return 0; - case 1: - max_idx = 2; - break; - case 2: - max_idx = 3; - break; - default: - case 4: - max_idx = sizeof(values) / sizeof(values[0]) - 1; - break; - } - - v = &values[asn_random_between(0, max_idx)]; - memcpy(b, v->value, v->size); - return v->size; -} - -asn_random_fill_result_t -UTF8String_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, - const asn_encoding_constraints_t *constraints, - size_t max_length) { - 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}; - uint8_t *buf; - uint8_t *bend; - uint8_t *b; - size_t rnd_len; - size_t idx; - UTF8String_t *st; - - if(max_length == 0 && !*sptr) return result_skipped; - - /* Figure out how far we should go */ - rnd_len = OCTET_STRING_random_length_constrained(td, constraints, - max_length / 4); - - buf = CALLOC(4, rnd_len + 1); - if(!buf) return result_failed; - - bend = &buf[4 * rnd_len]; - - for(b = buf, idx = 0; idx < rnd_len; idx++) { - b += UTF8String__random_char(b, (bend - b)); - } - *(uint8_t *)b = 0; - - if(*sptr) { - st = *sptr; - FREEMEM(st->buf); - } else { - st = (OCTET_STRING_t *)(*sptr = CALLOC(1, sizeof(UTF8String_t))); - if(!st) { - FREEMEM(buf); - return result_failed; - } - } - - st->buf = buf; - st->size = b - buf; - - assert(UTF8String_length(st) == (ssize_t)rnd_len); - - return result_ok; -} diff --git a/e2sm/lib/UniversalString.c b/e2sm/lib/UniversalString.c deleted file mode 100644 index 0f6d796..0000000 --- a/e2sm/lib/UniversalString.c +++ /dev/null @@ -1,243 +0,0 @@ -/*- - * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include -#include - -/* - * UniversalString basic type description. - */ -static const ber_tlv_tag_t asn_DEF_UniversalString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (28 << 2)), /* [UNIVERSAL 28] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ -}; -asn_OCTET_STRING_specifics_t asn_SPC_UniversalString_specs = { - sizeof(UniversalString_t), - offsetof(UniversalString_t, _asn_ctx), - ASN_OSUBV_U32 /* 32-bits character */ -}; -static asn_per_constraints_t asn_DEF_UniversalString_per_constraints = { - { APC_CONSTRAINED, 32, 32, 0, 2147483647 }, - { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, - 0, 0 -}; -asn_TYPE_operation_t asn_OP_UniversalString = { - OCTET_STRING_free, - UniversalString_print, /* Convert into UTF8 and print */ - OCTET_STRING_compare, - OCTET_STRING_decode_ber, - OCTET_STRING_encode_der, - UniversalString_decode_xer, /* Convert from UTF-8 */ - UniversalString_encode_xer, /* Convert into UTF-8 */ -#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_UniversalString = { - "UniversalString", - "UniversalString", - &asn_OP_UniversalString, - asn_DEF_UniversalString_tags, - sizeof(asn_DEF_UniversalString_tags) - / sizeof(asn_DEF_UniversalString_tags[0]) - 1, - asn_DEF_UniversalString_tags, - sizeof(asn_DEF_UniversalString_tags) - / sizeof(asn_DEF_UniversalString_tags[0]), - { 0, &asn_DEF_UniversalString_per_constraints, UniversalString_constraint }, - 0, 0, /* No members */ - &asn_SPC_UniversalString_specs -}; - -int -UniversalString_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, - asn_app_constraint_failed_f *ctfailcb, - void *app_key) { - const UniversalString_t *st = (const UniversalString_t *)sptr; - - if(st && st->buf) { - if(st->size % 4) { - ASN__CTFAIL(app_key, td, sptr, - "%s: invalid size %" ASN_PRI_SIZE " not divisible by 4 (%s:%d)", - td->name, st->size, __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 ssize_t -UniversalString__dump(const UniversalString_t *st, - asn_app_consume_bytes_f *cb, void *app_key) { - char scratch[128]; /* Scratchpad buffer */ - char *p = scratch; - ssize_t wrote = 0; - uint8_t *ch; - uint8_t *end; - - ch = st->buf; - end = (st->buf + st->size); - for(end -= 3; ch < end; ch += 4) { - uint32_t wc = (ch[0] << 24) - | (ch[1] << 16) - | (ch[2] << 8) - | ch[3]; /* 4 bytes */ - if(sizeof(scratch) - (p - scratch) < 6) { - wrote += p - scratch; - if(cb(scratch, p - scratch, app_key) < 0) - return -1; - p = scratch; - } - if(wc < 0x80) { - *p++ = (char)wc; - } else if(wc < 0x800) { - *p++ = 0xc0 | ((wc >> 6)); - *p++ = 0x80 | ((wc & 0x3f)); - } else if(wc < 0x10000) { - *p++ = 0xe0 | ((wc >> 12)); - *p++ = 0x80 | ((wc >> 6) & 0x3f); - *p++ = 0x80 | ((wc & 0x3f)); - } else if(wc < 0x200000) { - *p++ = 0xf0 | ((wc >> 18)); - *p++ = 0x80 | ((wc >> 12) & 0x3f); - *p++ = 0x80 | ((wc >> 6) & 0x3f); - *p++ = 0x80 | ((wc & 0x3f)); - } else if(wc < 0x4000000) { - *p++ = 0xf8 | ((wc >> 24)); - *p++ = 0x80 | ((wc >> 18) & 0x3f); - *p++ = 0x80 | ((wc >> 12) & 0x3f); - *p++ = 0x80 | ((wc >> 6) & 0x3f); - *p++ = 0x80 | ((wc & 0x3f)); - } else { - *p++ = 0xfc | ((wc >> 30) & 0x1); - *p++ = 0x80 | ((wc >> 24) & 0x3f); - *p++ = 0x80 | ((wc >> 18) & 0x3f); - *p++ = 0x80 | ((wc >> 12) & 0x3f); - *p++ = 0x80 | ((wc >> 6) & 0x3f); - *p++ = 0x80 | ((wc & 0x3f)); - } - } - - wrote += p - scratch; - if(cb(scratch, p - scratch, app_key) < 0) - return -1; - - return wrote; -} - -asn_dec_rval_t -UniversalString_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) { - asn_dec_rval_t rc; - - rc = OCTET_STRING_decode_xer_utf8(opt_codec_ctx, td, sptr, opt_mname, - buf_ptr, size); - if(rc.code == RC_OK) { - /* - * Now we have a whole string in UTF-8 format. - * Convert it into UCS-4. - */ - uint32_t *wcs; - size_t wcs_len; - UTF8String_t *st; -#ifndef WORDS_BIGENDIAN - int little_endian = 1; -#endif - - assert(*sptr); - st = (UTF8String_t *)*sptr; - assert(st->buf); - wcs_len = UTF8String_to_wcs(st, 0, 0); - - wcs = (uint32_t *)MALLOC(4 * (wcs_len + 1)); - if(wcs == 0 || UTF8String_to_wcs(st, wcs, wcs_len) != wcs_len) { - rc.code = RC_FAIL; - rc.consumed = 0; - return rc; - } else { - wcs[wcs_len] = 0; /* nul-terminate */ - } - -#ifndef WORDS_BIGENDIAN - if(*(char *)&little_endian) { - /* Swap byte order in encoding */ - uint32_t *wc = wcs; - uint32_t *wc_end = wcs + wcs_len; - for(; wc < wc_end; wc++) { - /* *wc = htonl(*wc); */ - uint32_t wch = *wc; - *((uint8_t *)wc + 0) = wch >> 24; - *((uint8_t *)wc + 1) = wch >> 16; - *((uint8_t *)wc + 2) = wch >> 8; - *((uint8_t *)wc + 3) = wch; - } - } -#endif /* WORDS_BIGENDIAN */ - - FREEMEM(st->buf); - st->buf = (uint8_t *)wcs; - st->size = 4 * wcs_len; - } - return rc; -} - -asn_enc_rval_t -UniversalString_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 UniversalString_t *st = (const UniversalString_t *)sptr; - asn_enc_rval_t er = {0,0,0}; - - (void)ilevel; - (void)flags; - - if(!st || !st->buf) - ASN__ENCODE_FAILED; - - er.encoded = UniversalString__dump(st, cb, app_key); - if(er.encoded < 0) ASN__ENCODE_FAILED; - - ASN__ENCODED_OK(er); -} - -int -UniversalString_print(const asn_TYPE_descriptor_t *td, const void *sptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const UniversalString_t *st = (const UniversalString_t *)sptr; - - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(!st || !st->buf) return (cb("", 8, app_key) < 0) ? -1 : 0; - - if(UniversalString__dump(st, cb, app_key) < 0) - return -1; - - return 0; -} - diff --git a/e2sm/lib/VideotexString.c b/e2sm/lib/VideotexString.c deleted file mode 100644 index 69417bd..0000000 --- a/e2sm/lib/VideotexString.c +++ /dev/null @@ -1,58 +0,0 @@ -/*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include - -/* - * VideotexString basic type description. - */ -static const ber_tlv_tag_t asn_DEF_VideotexString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (21 << 2)), /* [UNIVERSAL 21] IMPLICIT */ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ -}; -asn_TYPE_operation_t asn_OP_VideotexString = { - OCTET_STRING_free, - OCTET_STRING_print, /* non-ascii string */ - OCTET_STRING_compare, - OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - 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, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_uper, - OCTET_STRING_decode_aper, /* Implemented in terms of OCTET STRING */ - 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_VideotexString = { - "VideotexString", - "VideotexString", - &asn_OP_VideotexString, - asn_DEF_VideotexString_tags, - sizeof(asn_DEF_VideotexString_tags) - / sizeof(asn_DEF_VideotexString_tags[0]) - 1, - asn_DEF_VideotexString_tags, - sizeof(asn_DEF_VideotexString_tags) - / sizeof(asn_DEF_VideotexString_tags[0]), - { 0, 0, asn_generic_unknown_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - diff --git a/e2sm/lib/VisibleString.c b/e2sm/lib/VisibleString.c deleted file mode 100644 index 03fef8b..0000000 --- a/e2sm/lib/VisibleString.c +++ /dev/null @@ -1,99 +0,0 @@ -/*- - * Copyright (c) 2003, 2006 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include - -/* - * VisibleString basic type description. - */ -static const ber_tlv_tag_t asn_DEF_VisibleString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ -}; -static asn_per_constraints_t asn_DEF_VisibleString_constraints = { - { APC_CONSTRAINED, 7, 7, 0x20, 0x7e }, /* Value */ - { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ - 0, 0 -}; -asn_TYPE_operation_t asn_OP_VisibleString = { - 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_VisibleString = { - "VisibleString", - "VisibleString", - &asn_OP_VisibleString, - asn_DEF_VisibleString_tags, - sizeof(asn_DEF_VisibleString_tags) - / sizeof(asn_DEF_VisibleString_tags[0]) - 1, - asn_DEF_VisibleString_tags, - sizeof(asn_DEF_VisibleString_tags) - / sizeof(asn_DEF_VisibleString_tags[0]), - { 0, &asn_DEF_VisibleString_constraints, VisibleString_constraint }, - 0, 0, /* No members */ - 0 /* No specifics */ -}; - -int -VisibleString_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, - asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const VisibleString_t *st = (const VisibleString_t *)sptr; - - if(st && st->buf) { - uint8_t *buf = st->buf; - uint8_t *end = buf + st->size; - - /* - * Check the alphabet of the VisibleString. - * ISO646, ISOReg#6 - * The alphabet is a subset of ASCII between the space - * and "~" (tilde). - */ - for(; buf < end; buf++) { - if(*buf < 0x20 || *buf > 0x7e) { - ASN__CTFAIL(app_key, td, sptr, - "%s: value byte %ld (%d) " - "not in VisibleString 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/e2sm/lib/aper_decoder.c b/e2sm/lib/aper_decoder.c new file mode 100644 index 0000000..0637b6a --- /dev/null +++ b/e2sm/lib/aper_decoder.c @@ -0,0 +1,91 @@ +#include +#include +#include + +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/e2sm/lib/aper_encoder.c b/e2sm/lib/aper_encoder.c new file mode 100644 index 0000000..d9b1c1d --- /dev/null +++ b/e2sm/lib/aper_encoder.c @@ -0,0 +1,129 @@ +#include +#include +#include + +/* + * Argument type and callback necessary for aper_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 +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); + } +} + +/* + * Internally useful functions. + */ + +/* Flush partially filled buffer */ +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 ? cb : ignore_output; + 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/e2sm/lib/aper_opentype.c b/e2sm/lib/aper_opentype.c new file mode 100644 index 0000000..cdd5999 --- /dev/null +++ b/e2sm/lib/aper_opentype.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +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, -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;) { + int need_eom = 0; + ssize_t maySave = aper_put_length(po, -1, -1, toGo, &need_eom); + if(maySave < 0) break; + if(per_put_many_bits(po, bptr, maySave * 8)) break; + bptr = (char *)bptr + maySave; + toGo -= maySave; + if(need_eom && (aper_put_length(po, -1, -1, 0, NULL) < 0)) { + FREEMEM(buf); + return -1; + } + } + + FREEMEM(buf); + if(toGo) return -1; + + ASN_DEBUG("Open type put %s of length %zd + 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/e2sm/lib/aper_support.c b/e2sm/lib/aper_support.c new file mode 100644 index 0000000..1f34c60 --- /dev/null +++ b/e2sm/lib/aper_support.c @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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, ssize_t lb, ssize_t ub, + int ebits, int *repeat) { + int constrained = (lb >= 0) && (ub >= 0); + ssize_t value; + + *repeat = 0; + + if (constrained && ub < 65536) { + int range = ub - lb + 1; + 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) /* #11.9.3.6 */ + return (value & 0x7F); + if((value & 64) == 0) { /* #11.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, #11.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=%zd", length); + return length; + } else { + int repeat; + length = aper_get_length(pd, -1, -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; + int length; + + /* handle indefinite range */ + length = per_get_few_bits(pd, 1); + if (length == 0) + return per_get_few_bits(pd, 6); + + if (aper_get_align(pd) < 0) + return -1; + + length = per_get_few_bits(pd, 8); + /* the length is not likely to be that big */ + if (length > 4) + return -1; + value = 0; + if (per_get_many_bits(pd, (uint8_t *)&value, 0, length * 8) < 0) + return -1; + return value; + } + 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, ssize_t lb, ssize_t ub, size_t n, int *need_eom) { + int constrained = (lb >= 0) && (ub >= 0); + int dummy = 0; + if(!need_eom) need_eom = &dummy; + + *need_eom = 0; + + + ASN_DEBUG("APER put length %zu with range (%zd..%zd)", n, lb, ub); + + /* 11.9 X.691 Note 2 */ + if (constrained && ub < 65536) { + int range = ub - lb + 1; + return aper_put_nsnnwn(po, range, n) ? -1 : (ssize_t)n; + } + + if (aper_put_align(po) < 0) + return -1; + + if(n <= 127) { /* #11.9.3.6 */ + return per_put_few_bits(po, n, 8) + ? -1 : (ssize_t)n; + } + else if(n < 16384) /* #11.9.3.7 */ + return per_put_few_bits(po, n|0x8000, 16) + ? -1 : (ssize_t)n; + + *need_eom = 0 == (n & 16383); + n >>= 14; + if(n > 4) { + *need_eom = 0; + n = 4; + } + + return per_put_few_bits(po, 0xC0 | n, 8) + ? -1 : (ssize_t)(n << 14); +} + + +int +aper_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 { + if(aper_put_length(po, -1, -1, length, NULL) != (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) { + if (number >= range) + return -1; + bytes = 1; + } else if(range <= 65536) { + if (number >= range) + return -1; + 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/e2sm/lib/asn_application.c b/e2sm/lib/asn_application.c index 2bff460..7992185 100644 --- a/e2sm/lib/asn_application.c +++ b/e2sm/lib/asn_application.c @@ -226,7 +226,9 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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}; +#if !defined(ASN_DISABLE_XER_SUPPORT) enum xer_encoder_flags_e xer_flags = XER_F_CANONICAL; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ (void)opt_codec_ctx; /* Parameters are not checked on encode yet. */ @@ -265,6 +267,7 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, errno = ENOENT; /* Randomization doesn't make sense on output. */ ASN__ENCODE_FAILED; +#if !defined(ASN_DISABLE_BER_SUPPORT) case ATS_BER: /* BER is a superset of DER. */ /* Fall through. */ @@ -273,27 +276,29 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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. */ + errno = EBADF; /* Structure has incorrect form. */ } else { - errno = ENOENT; /* DER is not defined for this type. */ + errno = ENOENT; /* DER is not defined for this type. */ } } } else { - errno = ENOENT; /* Transfer syntax is not defined for this type. */ + 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. */ + 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. */ +#else + case ATS_BER: + case ATS_DER: + case ATS_CER: + errno = ENOENT; /* BER is not defined. */ ASN__ENCODE_FAILED; - break; -#else /* ASN_DISABLE_OER_SUPPORT */ + +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ + +#if !defined(ASN_DISABLE_OER_SUPPORT) case ATS_BASIC_OER: /* CANONICAL-OER is a superset of BASIC-OER. */ /* Fall through. */ @@ -302,27 +307,25 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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. */ + errno = EBADF; /* Structure has incorrect form. */ } else { - errno = ENOENT; /* OER is not defined for this type. */ + errno = ENOENT; /* OER is not defined for this type. */ } } } else { - errno = ENOENT; /* Transfer syntax is not defined for this type. */ + 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. */ +#else + case ATS_BASIC_OER: + case ATS_CANONICAL_OER: + errno = ENOENT; /* OER is not defined. */ ASN__ENCODE_FAILED; break; -#else /* ASN_DISABLE_PER_SUPPORT */ +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ + +#if !defined(ASN_DISABLE_UPER_SUPPORT) case ATS_UNALIGNED_BASIC_PER: /* CANONICAL-UPER is a superset of BASIC-UPER. */ /* Fall through. */ @@ -331,9 +334,9 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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. */ + errno = EBADF; /* Structure has incorrect form. */ } else { - errno = ENOENT; /* UPER is not defined for this type. */ + errno = ENOENT; /* UPER is not defined for this type. */ } } else { ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded); @@ -343,16 +346,24 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, errno = EBADF; ASN__ENCODE_FAILED; } - er.encoded = 8; /* Exactly 8 zero bits is added. */ + 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. */ + errno = ENOENT; /* Transfer syntax is not defined for this type. */ ASN__ENCODE_FAILED; } break; +#else + case ATS_UNALIGNED_BASIC_PER: + case ATS_UNALIGNED_CANONICAL_PER: + errno = ENOENT; /* UPER is not defined. */ + ASN__ENCODE_FAILED; + break; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) case ATS_ALIGNED_BASIC_PER: /* CANONICAL-APER is a superset of BASIC-APER. */ /* Fall through. */ @@ -361,9 +372,9 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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. */ + errno = EBADF; /* Structure has incorrect form. */ } else { - errno = ENOENT; /* APER is not defined for this type. */ + errno = ENOENT; /* APER is not defined for this type. */ } } else { ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded); @@ -373,18 +384,25 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, errno = EBADF; ASN__ENCODE_FAILED; } - er.encoded = 8; /* Exactly 8 zero bits is added. */ + 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. */ + errno = ENOENT; /* Transfer syntax is not defined for this type. */ ASN__ENCODE_FAILED; } break; -#endif /* ASN_DISABLE_PER_SUPPORT */ +#else + case ATS_ALIGNED_BASIC_PER: + case ATS_ALIGNED_CANONICAL_PER: + errno = ENOENT; /* APER is not defined. */ + ASN__ENCODE_FAILED; + break; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) case ATS_BASIC_XER: /* CANONICAL-XER is a superset of BASIC-XER. */ xer_flags &= ~XER_F_CANONICAL; @@ -395,17 +413,41 @@ asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, 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. */ + errno = EBADF; /* Structure has incorrect form. */ } else { - errno = ENOENT; /* XER is not defined for this type. */ + errno = ENOENT; /* XER is not defined for this type. */ } } } else { - errno = ENOENT; /* Transfer syntax is not defined for this type. */ + errno = ENOENT; /* Transfer syntax is not defined for this type. */ ASN__ENCODE_FAILED; } break; +#else + case ATS_BASIC_XER: + case ATS_CANONICAL_XER: + errno = ENOENT; /* XER is not defined. */ + ASN__ENCODE_FAILED; + break; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + case ATS_JER: + if(td->op->jer_encoder) { + er = jer_encode(td, sptr, callback, callback_key); + if(er.encoded == -1) { + if(er.failed_type && er.failed_type->op->jer_encoder) { + errno = EBADF; /* Structure has incorrect form. */ + } else { + errno = ENOENT; /* JER is not defined for this type. */ + } + } + } else { + errno = ENOENT; /* Transfer syntax is not defined for this type. */ + ASN__ENCODE_FAILED; + } + break; +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ default: errno = ENOENT; ASN__ENCODE_FAILED; @@ -430,6 +472,7 @@ asn_decode(const asn_codec_ctx_t *opt_codec_ctx, ASN__DECODE_FAILED; case ATS_RANDOM: +#if !defined(ASN_DISABLE_RFILL_SUPPORT) if(!td->op->random_fill) { ASN__DECODE_FAILED; } else { @@ -441,41 +484,55 @@ asn_decode(const asn_codec_ctx_t *opt_codec_ctx, } } break; +#else + errno = ENOENT; + ASN__DECODE_FAILED; +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ case ATS_DER: case ATS_BER: +#if !defined(ASN_DISABLE_BER_SUPPORT) return ber_decode(opt_codec_ctx, td, sptr, buffer, size); +#else + errno = ENOENT; + ASN__DECODE_FAILED; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ case ATS_BASIC_OER: case ATS_CANONICAL_OER: -#ifdef ASN_DISABLE_OER_SUPPORT +#if !defined(ASN_DISABLE_OER_SUPPORT) + return oer_decode(opt_codec_ctx, td, sptr, buffer, size); +#else errno = ENOENT; ASN__DECODE_FAILED; -#else - return oer_decode(opt_codec_ctx, td, sptr, buffer, size); -#endif +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ case ATS_UNALIGNED_BASIC_PER: case ATS_UNALIGNED_CANONICAL_PER: -#ifdef ASN_DISABLE_PER_SUPPORT +#if !defined(ASN_DISABLE_UPER_SUPPORT) + return uper_decode_complete(opt_codec_ctx, td, sptr, buffer, size); +#else errno = ENOENT; ASN__DECODE_FAILED; -#else - return uper_decode_complete(opt_codec_ctx, td, sptr, buffer, size); -#endif +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ case ATS_ALIGNED_BASIC_PER: case ATS_ALIGNED_CANONICAL_PER: -#ifdef ASN_DISABLE_PER_SUPPORT +#if !defined(ASN_DISABLE_APER_SUPPORT) + return aper_decode_complete(opt_codec_ctx, td, sptr, buffer, size); +#else errno = ENOENT; ASN__DECODE_FAILED; -#else - return aper_decode_complete(opt_codec_ctx, td, sptr, buffer, size); -#endif +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ case ATS_BASIC_XER: case ATS_CANONICAL_XER: +#if !defined(ASN_DISABLE_XER_SUPPORT) return xer_decode(opt_codec_ctx, td, sptr, buffer, size); +#else + errno = ENOENT; + ASN__DECODE_FAILED; +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ } } diff --git a/e2sm/lib/asn_codecs_prim.c b/e2sm/lib/asn_codecs_prim.c index fc24247..f3fdbfd 100644 --- a/e2sm/lib/asn_codecs_prim.c +++ b/e2sm/lib/asn_codecs_prim.c @@ -4,115 +4,6 @@ */ #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, @@ -138,180 +29,3 @@ ASN__PRIMITIVE_TYPE_free(const asn_TYPE_descriptor_t *td, void *sptr, 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/e2sm/lib/asn_codecs_prim_ber.c b/e2sm/lib/asn_codecs_prim_ber.c new file mode 100644 index 0000000..c5c2cef --- /dev/null +++ b/e2sm/lib/asn_codecs_prim_ber.c @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#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); +} diff --git a/e2sm/lib/asn_codecs_prim_xer.c b/e2sm/lib/asn_codecs_prim_xer.c new file mode 100644 index 0000000..70c91bc --- /dev/null +++ b/e2sm/lib/asn_codecs_prim_xer.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * 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 = (chunk_buf == NULL)? NULL : ((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/e2sm/lib/asn_internal.c b/e2sm/lib/asn_internal.c index 004660b..c2a8108 100644 --- a/e2sm/lib/asn_internal.c +++ b/e2sm/lib/asn_internal.c @@ -14,10 +14,10 @@ asn__format_to_callback(int (*cb)(const void *, size_t, void *key), void *key, va_start(args, fmt); wrote = vsnprintf(buf, buf_size, fmt, args); + va_end(args); if(wrote < (ssize_t)buf_size) { if(wrote < 0) { if(buf != scratch) FREEMEM(buf); - va_end(args); return -1; } break; @@ -26,12 +26,11 @@ asn__format_to_callback(int (*cb)(const void *, size_t, void *key), void *key, buf_size <<= 1; if(buf == scratch) { buf = MALLOC(buf_size); - if(!buf) { va_end(args); return -1; } + if(!buf) return -1; } else { void *p = REALLOC(buf, buf_size); if(!p) { FREEMEM(buf); - va_end(args); return -1; } buf = p; diff --git a/e2sm/lib/asn_random_fill.c b/e2sm/lib/asn_random_fill.c index 819cf70..15771b6 100644 --- a/e2sm/lib/asn_random_fill.c +++ b/e2sm/lib/asn_random_fill.c @@ -42,13 +42,23 @@ asn_random_between(intmax_t lb, intmax_t rb) { uintmax_t range = asn__intmax_range(lb, rb); uintmax_t value = 0; uintmax_t got_entropy = 0; + (void)intmax_max; + int max = 0xffffff; - assert(RAND_MAX > 0xffffff); /* Seen 7ffffffd! */ +#ifdef __WIN32__ + max = RAND_MAX-1; +#endif + + assert(RAND_MAX > max); /* Seen 7ffffffd! */ assert(range < intmax_max); for(; got_entropy < range;) { - got_entropy = (got_entropy << 24) | 0xffffff; - value = (value << 24) | (random() % 0xffffff); + got_entropy = (got_entropy << 24) | max; +#ifdef HAVE_RANDOM + value = (value << 24) | (random() % max); +#else + value = (value << 24) | (rand() % max); +#endif } return lb + (intmax_t)(value % (range + 1)); diff --git a/e2sm/lib/ber_tlv_tag.c b/e2sm/lib/ber_tlv_tag.c index 4a7d732..64ec14f 100644 --- a/e2sm/lib/ber_tlv_tag.c +++ b/e2sm/lib/ber_tlv_tag.c @@ -42,7 +42,7 @@ ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { */ if(val >> ((8 * sizeof(val)) - 9)) { /* - * We would not be able to accomodate + * We would not be able to accommodate * any more tag bits. */ return -1; diff --git a/e2sm/lib/constr_CHOICE.c b/e2sm/lib/constr_CHOICE.c index 86dcbb0..5f52e3d 100644 --- a/e2sm/lib/constr_CHOICE.c +++ b/e2sm/lib/constr_CHOICE.c @@ -4,485 +4,102 @@ */ #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) +asn_TYPE_operation_t asn_OP_CHOICE = { + CHOICE_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + CHOICE_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + CHOICE_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + CHOICE_decode_ber, + CHOICE_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + CHOICE_decode_xer, + CHOICE_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + CHOICE_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + CHOICE_decode_oer, + CHOICE_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + CHOICE_decode_uper, + CHOICE_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + CHOICE_decode_aper, + CHOICE_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + CHOICE_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + CHOICE_outmost_tag +}; -/* - * 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) +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; -/* - * 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) + assert(tag_mode == 0); (void)tag_mode; + assert(tag == 0); (void)tag; -/* - * Switch to the next phase of parsing. - */ -#undef NEXT_PHASE -#define NEXT_PHASE(ctx) do { \ - ctx->phase++; \ - ctx->step = 0; \ - } while(0) + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); -/* - * Return a standardized complex structure. - */ -#undef RETURN -#define RETURN(_code) do { \ - rval.code = _code; \ - rval.consumed = consumed_myself;\ - return rval; \ - } while(0) + 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; + } +} /* * 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) { @@ -534,713 +151,6 @@ CHOICE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, } } -#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) { @@ -1297,7 +207,7 @@ CHOICE_free(const asn_TYPE_descriptor_t *td, void *ptr, * is guaranteed to be aligned properly. ASN.1 compiler itself does not * produce packed code. */ -static unsigned +unsigned _fetch_present_idx(const void *struct_ptr, unsigned pres_offset, unsigned pres_size) { const void *present_ptr; @@ -1318,7 +228,7 @@ _fetch_present_idx(const void *struct_ptr, unsigned pres_offset, return present; } -static void +void _set_present_idx(void *struct_ptr, unsigned pres_offset, unsigned pres_size, unsigned present) { void *present_ptr; @@ -1446,88 +356,3 @@ CHOICE_variant_set_presence(const asn_TYPE_descriptor_t *td, void *sptr, 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/e2sm/lib/constr_CHOICE_aper.c b/e2sm/lib/constr_CHOICE_aper.c new file mode 100644 index 0000000..41040aa --- /dev/null +++ b/e2sm/lib/constr_CHOICE_aper.c @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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 = NULL; + asn_TYPE_member_t *elm = NULL; /* CHOICE's element */ + void *memb_ptr = NULL; + void **memb_ptr2 = NULL; + void *st = *sptr; + int value = 0; + + 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; + + if(specs && specs->tag2el_count > specs->ext_start) { + value = aper_get_nsnnwn(pd, specs->tag2el_count - specs->ext_start); /* extension elements range */ + 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; + const void *memb_ptr; + int present; + + 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 = 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 || (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 = specs->to_canonical_order[present]; + + ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); + + if(ct && ct->range_bits >= 0) { + if(present < ct->lower_bound + || present > ct->upper_bound) { + if(ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, 1, 1)) + ASN__ENCODE_FAILED; + } else { + ASN__ENCODE_FAILED; + } + ct = 0; + } + } + if(ct && ct->flags & APC_EXTENSIBLE) { + 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) { + if(per_put_few_bits(po, present, 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; + int n = present - specs->ext_start; + if(n <= 63) { + if(n < 0) ASN__ENCODE_FAILED; + if(per_put_few_bits(po, n, 7)) ASN__ENCODE_FAILED; + } else + 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); + } +} diff --git a/e2sm/lib/constr_CHOICE_ber.c b/e2sm/lib/constr_CHOICE_ber.c new file mode 100644 index 0000000..7ad42c7 --- /dev/null +++ b/e2sm/lib/constr_CHOICE_ber.c @@ -0,0 +1,447 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#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) + +/* + * 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) { + /* ?Subtracted 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; +} diff --git a/e2sm/lib/constr_CHOICE_jer.c b/e2sm/lib/constr_CHOICE_jer.c new file mode 100644 index 0000000..22d5090 --- /dev/null +++ b/e2sm/lib/constr_CHOICE_jer.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +#undef JER_ADVANCE +#define JER_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) + +asn_enc_rval_t +CHOICE_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum jer_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; + + ASN__CALLBACK3("{\n\"", 3, mname, mlen, "\": ", 2); + + tmper = elm->type->op->jer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + + ASN__CALLBACK("}", 1); + // ASN__CALLBACK3("", 1); + } + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} diff --git a/e2sm/lib/constr_CHOICE_oer.c b/e2sm/lib/constr_CHOICE_oer.c index a4c591c..bc71a01 100644 --- a/e2sm/lib/constr_CHOICE_oer.c +++ b/e2sm/lib/constr_CHOICE_oer.c @@ -3,11 +3,8 @@ * 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. @@ -109,7 +106,7 @@ oer_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { */ if(val >> ((8 * sizeof(val)) - 9)) { /* - * We would not be able to accomodate + * We would not be able to accommodate * any more tag bits. */ return -1; @@ -376,5 +373,3 @@ CHOICE_encode_oer(const asn_TYPE_descriptor_t *td, return er; } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2sm/lib/constr_CHOICE_print.c b/e2sm/lib/constr_CHOICE_print.c new file mode 100644 index 0000000..a97202f --- /dev/null +++ b/e2sm/lib/constr_CHOICE_print.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; + } +} diff --git a/e2sm/lib/constr_CHOICE_rfill.c b/e2sm/lib/constr_CHOICE_rfill.c new file mode 100644 index 0000000..fd0a101 --- /dev/null +++ b/e2sm/lib/constr_CHOICE_rfill.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2sm/lib/constr_CHOICE_uper.c b/e2sm/lib/constr_CHOICE_uper.c new file mode 100644 index 0000000..77aab6d --- /dev/null +++ b/e2sm/lib/constr_CHOICE_uper.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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); + } +} diff --git a/e2sm/lib/constr_CHOICE_xer.c b/e2sm/lib/constr_CHOICE_xer.c new file mode 100644 index 0000000..45b4290 --- /dev/null +++ b/e2sm/lib/constr_CHOICE_xer.c @@ -0,0 +1,316 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +#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; +} diff --git a/e2sm/lib/constr_SEQUENCE.c b/e2sm/lib/constr_SEQUENCE.c index 43dcac7..8397d0c 100644 --- a/e2sm/lib/constr_SEQUENCE.c +++ b/e2sm/lib/constr_SEQUENCE.c @@ -5,980 +5,62 @@ */ #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; -} +asn_TYPE_operation_t asn_OP_SEQUENCE = { + SEQUENCE_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + SEQUENCE_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + SEQUENCE_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + SEQUENCE_decode_ber, + SEQUENCE_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + SEQUENCE_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + SEQUENCE_decode_oer, + SEQUENCE_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + SEQUENCE_decode_uper, + SEQUENCE_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + SEQUENCE_decode_aper, + SEQUENCE_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + SEQUENCE_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ +}; void SEQUENCE_free(const asn_TYPE_descriptor_t *td, void *sptr, @@ -1042,6 +124,8 @@ SEQUENCE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; + asn_constr_check_f *constr; + int ret; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); @@ -1057,864 +141,17 @@ SEQUENCE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, 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; + constr = elm->encoding_constraints.general_constraints; + if(!constr) + constr = elm->type->encoding_constraints.general_constraints; - 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; + ret = constr(elm->type, memb_ptr, ctfailcb, app_key); + if(ret) return ret; } - /* 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); + return 0; } -#endif /* ASN_DISABLE_PER_SUPPORT */ - int SEQUENCE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bptr) { @@ -1958,102 +195,3 @@ SEQUENCE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, 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/e2sm/lib/constr_SEQUENCE_OF.c b/e2sm/lib/constr_SEQUENCE_OF.c index 10f18cf..9c5d6cd 100644 --- a/e2sm/lib/constr_SEQUENCE_OF.c +++ b/e2sm/lib/constr_SEQUENCE_OF.c @@ -7,295 +7,61 @@ #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 */ +asn_TYPE_operation_t asn_OP_SEQUENCE_OF = { + SEQUENCE_OF_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + SEQUENCE_OF_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + SEQUENCE_OF_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + SEQUENCE_OF_decode_xer, + SEQUENCE_OF_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + SEQUENCE_OF_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + SEQUENCE_OF_decode_oer, /* Same as SET OF decoder. */ + SEQUENCE_OF_encode_oer, /* Same as SET OF encoder */ +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + SEQUENCE_OF_decode_uper, /* Same as SET OF decoder */ + SEQUENCE_OF_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + SEQUENCE_OF_decode_aper, + SEQUENCE_OF_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + SEQUENCE_OF_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ +}; int SEQUENCE_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, @@ -324,35 +90,3 @@ SEQUENCE_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, 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/e2sm/lib/constr_SEQUENCE_OF_aper.c b/e2sm/lib/constr_SEQUENCE_OF_aper.c new file mode 100644 index 0000000..ff3ae8b --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_OF_aper.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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 %lld ub %lld %s", + (long long int)ct->lower_bound, + (long long int)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 (ct->lower_bound == ct->upper_bound && ct->upper_bound < 65536) { + /* No length determinant */ + } else if (aper_put_length(po, ct->lower_bound, ct->upper_bound, list->count - ct->lower_bound, 0) < 0) + ASN__ENCODE_FAILED; + } + + for(seq = -1; seq < list->count;) { + ssize_t mayEncode; + int need_eom = 0; + if(seq < 0) seq = 0; + if(ct && ct->effective_bits >= 0) { + mayEncode = list->count; + } else { + mayEncode = aper_put_length(po, -1, -1, list->count - seq, &need_eom); + 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; + } + + if(need_eom && (aper_put_length(po, -1, -1, 0, NULL) < 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + } + + ASN__ENCODED_OK(er); +} diff --git a/e2sm/lib/constr_SEQUENCE_OF_ber.c b/e2sm/lib/constr_SEQUENCE_OF_ber.c new file mode 100644 index 0000000..178f865 --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_OF_ber.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2017 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; +} diff --git a/e2sm/lib/constr_SEQUENCE_OF_jer.c b/e2sm/lib/constr_SEQUENCE_OF_jer.c new file mode 100644 index 0000000..4c366a6 --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_OF_jer.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +asn_enc_rval_t +SEQUENCE_OF_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_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 = 0; + int i; + + if(!sptr) ASN__ENCODE_FAILED; + + er.encoded = 0; + ASN__CALLBACK("[", 1); + + 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("{\"", 2, mname, mlen, "\":", 2); + } + + tmper = elm->type->op->jer_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, "\"", 1); + } + + if(mname) { + ASN__CALLBACK("}", 1); + } + if (i != list->count - 1) { + ASN__CALLBACK(",", 1); + } + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + ASN__CALLBACK("]", 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} diff --git a/e2sm/lib/constr_SEQUENCE_OF_uper.c b/e2sm/lib/constr_SEQUENCE_OF_uper.c new file mode 100644 index 0000000..eb20a07 --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_OF_uper.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 + +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); +} diff --git a/e2sm/lib/constr_SEQUENCE_OF_xer.c b/e2sm/lib/constr_SEQUENCE_OF_xer.c new file mode 100644 index 0000000..7bd3236 --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_OF_xer.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +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; +} diff --git a/e2sm/lib/constr_SEQUENCE_aper.c b/e2sm/lib/constr_SEQUENCE_aper.c new file mode 100644 index 0000000..895b6da --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_aper.c @@ -0,0 +1,457 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +/* + * 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)) + +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) { + if (OPEN_TYPE_aper_is_unknown_type(td, st, elm)) { + rv = OPEN_TYPE_aper_unknown_type_discard_bytes(pd); + FREEMEM(opres); + return rv; + } + 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 %zd bits (%x..)", + td->name, bmlength, *epres); + + /* Deal with padding */ + if (aper_get_align(pd) < 0) + ASN__DECODE_STARVED; + + /* 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("%zu 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 (@%zu) 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 (@%zu) 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) == 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 */ + + 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 %zu 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", 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); +} diff --git a/e2sm/lib/constr_SEQUENCE_ber.c b/e2sm/lib/constr_SEQUENCE_ber.c new file mode 100644 index 0000000..e982172 --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_ber.c @@ -0,0 +1,612 @@ +/* + * Copyright (c) 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) +#undef PHASE_OUT +#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; /* ?Subtracted 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); +} diff --git a/e2sm/lib/constr_SEQUENCE_jer.c b/e2sm/lib/constr_SEQUENCE_jer.c new file mode 100644 index 0000000..6451f0c --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_jer.c @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +asn_enc_rval_t SEQUENCE_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum jer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = {0,0,0}; + int xcan = 0; + 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; + + int bAddComma = 0; + ASN__CALLBACK("{\n", 2); + 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 (bAddComma == 1) { + ASN__CALLBACK(",", 1); + bAddComma = 0; + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("\"", 1, mname, mlen, "\": ", 3); + + /* Print the member itself */ + tmper = elm->type->op->jer_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; + if (edx != td->elements_count - 1) { + bAddComma = 1; + } + } + ASN__CALLBACK("}", 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; +} diff --git a/e2sm/lib/constr_SEQUENCE_oer.c b/e2sm/lib/constr_SEQUENCE_oer.c index ecb589c..a3bdb7b 100644 --- a/e2sm/lib/constr_SEQUENCE_oer.c +++ b/e2sm/lib/constr_SEQUENCE_oer.c @@ -3,12 +3,10 @@ * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ -#ifndef ASN_DISABLE_OER_SUPPORT - #include #include +#include #include -#include /* * This macro "eats" the part of the buffer which is definitely "consumed", @@ -486,7 +484,7 @@ SEQUENCE_encode_oer(const asn_TYPE_descriptor_t *td, } /* - * Before encode extensions, encode extensions additions presense bitmap + * Before encode extensions, encode extensions additions presence bitmap # X.696 (08/2015) #16.4. */ if(has_extensions) { @@ -557,5 +555,3 @@ SEQUENCE_encode_oer(const asn_TYPE_descriptor_t *td, ASN__ENCODED_OK(er); } } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2sm/lib/constr_SEQUENCE_print.c b/e2sm/lib/constr_SEQUENCE_print.c new file mode 100644 index 0000000..7f9e231 --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_print.c @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2sm/lib/constr_SEQUENCE_rfill.c b/e2sm/lib/constr_SEQUENCE_rfill.c new file mode 100644 index 0000000..b464f57 --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_rfill.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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/e2sm/lib/constr_SEQUENCE_uper.c b/e2sm/lib/constr_SEQUENCE_uper.c new file mode 100644 index 0000000..b235f4d --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_uper.c @@ -0,0 +1,429 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +/* + * 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)) + +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); +} diff --git a/e2sm/lib/constr_SEQUENCE_xer.c b/e2sm/lib/constr_SEQUENCE_xer.c new file mode 100644 index 0000000..c6475f7 --- /dev/null +++ b/e2sm/lib/constr_SEQUENCE_xer.c @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * 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)) + +#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; +} diff --git a/e2sm/lib/constr_SET.c b/e2sm/lib/constr_SET.c deleted file mode 100644 index 554a7dd..0000000 --- a/e2sm/lib/constr_SET.c +++ /dev/null @@ -1,1149 +0,0 @@ -/* - * Copyright (c) 2003-2017 Lev Walkin . - * All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include - -/* Check that all the mandatory members are present */ -static int _SET_is_populated(const asn_TYPE_descriptor_t *td, const void *st); - -/* - * 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) - -/* - * 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) - 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 SET type. - */ -asn_dec_rval_t -SET_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_specifics_t *specs = (const asn_SET_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; /* SET element's index */ - - ASN_DEBUG("Decoding %s as SET", td->name); - - 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: - /* - * 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 advertised %ld bytes, " - "buffer contains %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. - * Note that elements in BER may arrive out of - * order, yet DER mandates that they shall arive in the - * canonical order of their tags. So, there is a room - * for optimization. - */ - for(;; ctx->step = 0) { - const asn_TYPE_tag2member_t *t2m; - asn_TYPE_tag2member_t key; - void *memb_ptr; /* Pointer to the member */ - void **memb_ptr2; /* Pointer to that pointer */ - ssize_t tag_len; /* Length of TLV's T */ - - if(ctx->step & 1) { - edx = ctx->step >> 1; - goto microphase2; - } - - /* - * MICROPHASE 1: Synchronize decoding. - */ - - if(ctx->left == 0) - /* - * No more things to decode. - * Exit out of here and check whether all mandatory - * elements have been received (in the next phase). - */ - break; - - /* - * 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. - * Invoke the generic finalization function. - */ - goto phase3; - } - } - - key.el_tag = tlv_tag; - t2m = (const asn_TYPE_tag2member_t *)bsearch(&key, - specs->tag2el, specs->tag2el_count, - sizeof(specs->tag2el[0]), _t2e_cmp); - if(t2m) { - /* - * Found the element corresponding to the tag. - */ - edx = t2m->el_no; - ctx->step = (edx << 1) + 1; - ASN_DEBUG("Got tag %s (%s), edx %" ASN_PRI_SSIZE "", - ber_tlv_tag_string(tlv_tag), td->name, edx); - } else if(specs->extensible == 0) { - ASN_DEBUG("Unexpected tag %s " - "in non-extensible SET %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); - continue; /* Try again with the next tag */ - } - - /* - * MICROPHASE 2: Invoke the member-specific decoder. - */ - microphase2: - - /* - * Check for duplications: must not overwrite - * already decoded elements. - */ - if(ASN_SET_ISPRESENT2((char *)st + specs->pres_offset, edx)) { - ASN_DEBUG("SET %s: Duplicate element %s (%" ASN_PRI_SSIZE ")", - td->name, elements[edx].name, edx); - RETURN(RC_FAIL); - } - - /* - * 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 - */ - rval = elements[edx].type->op->ber_decoder(opt_codec_ctx, - elements[edx].type, - memb_ptr2, ptr, LEFT, - elements[edx].tag_mode); - switch(rval.code) { - case RC_OK: - ASN_SET_MKPRESENT((char *)st + specs->pres_offset, edx); - break; - case RC_WMORE: /* More data expected */ - if(!SIZE_VIOLATION) { - ADVANCE(rval.consumed); - RETURN(RC_WMORE); - } - /* 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: - case 4: /* Only 00 is expected */ - ASN_DEBUG("SET %s Leftover: %ld, size = %ld", - td->name, (long)ctx->left, (long)size); - - /* - * Skip everything until the end of the SET. - */ - 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(specs->extensible == 0 || ctx->phase == 4) { - ASN_DEBUG("Unexpected continuation " - "of a non-extensible type %s " - "(ptr=%02x)", - td->name, *(const uint8_t *)ptr); - 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); - } - - ctx->phase = 5; - /* Fall through */ - case 5: - /* Check that all mandatory elements are present. */ - if(!_SET_is_populated(td, st)) - RETURN(RC_FAIL); - - NEXT_PHASE(ctx); - } - - RETURN(RC_OK); -} - -static int -_SET_is_populated(const asn_TYPE_descriptor_t *td, const void *st) { - const asn_SET_specifics_t *specs = (const asn_SET_specifics_t *)td->specifics; - size_t edx; - - /* - * Check that all mandatory elements are present. - */ - for(edx = 0; edx < td->elements_count; - edx += (8 * sizeof(specs->_mandatory_elements[0]))) { - unsigned int midx, pres, must; - - midx = edx/(8 * sizeof(specs->_mandatory_elements[0])); - pres = ((const unsigned int *)((const char *)st - + specs->pres_offset))[midx]; - must = sys_ntohl(specs->_mandatory_elements[midx]); - - if((pres & must) == must) { - /* - * Yes, everything seems to be in place. - */ - } else { - ASN_DEBUG("One or more mandatory elements " - "of a SET %s %d (%08x.%08x)=%08x " - "are not present", - td->name, - midx, - pres, - must, - (~(pres & must) & must) - ); - return 0; - } - } - - return 1; -} - -/* - * The DER encoder of the SET type. - */ -asn_enc_rval_t -SET_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_SET_specifics_t *specs = (const asn_SET_specifics_t *)td->specifics; - size_t computed_size = 0; - asn_enc_rval_t er; - int t2m_build_own = (specs->tag2el_count != td->elements_count); - const asn_TYPE_tag2member_t *t2m; - asn_TYPE_tag2member_t *t2m_build; - size_t t2m_count; - ssize_t ret; - size_t edx; - - /* - * Use existing, or build our own tags map. - */ - if(t2m_build_own) { - t2m_build = (asn_TYPE_tag2member_t *)CALLOC(td->elements_count, - sizeof(t2m_build[0])); - if(!t2m_build) ASN__ENCODE_FAILED; - t2m_count = 0; - } else { - t2m_build = NULL; - /* - * There is no untagged CHOICE in this SET. - * Employ existing table. - */ - } - - /* - * Gather the length of the underlying members sequence. - */ - for(edx = 0; edx < td->elements_count; edx++) { - asn_TYPE_member_t *elm = &td->elements[edx]; - asn_enc_rval_t tmper; - const void *memb_ptr_dontuse; /* Pointer to the member */ - const void *const *memb_ptr2; /* Pointer to that pointer */ - - /* - * Compute the length of the encoding of this member. - */ - if(elm->flags & ATF_POINTER) { - memb_ptr2 = - (const void *const *)((const char *)sptr + elm->memb_offset); - if(!*memb_ptr2) { - if(!elm->optional) { - /* Mandatory elements missing */ - FREEMEM(t2m_build); - ASN__ENCODE_FAILED; - } - if(t2m_build) { - t2m_build[t2m_count].el_no = edx; - t2m_build[t2m_count].el_tag = 0; - t2m_count++; - } - continue; - } - } else { - memb_ptr_dontuse = - (const void *)((const char *)sptr + elm->memb_offset); - memb_ptr2 = &memb_ptr_dontuse; /* Only use of memb_ptr_dontuse */ - } - - /* Eliminate default values */ - if(elm->default_value_cmp && elm->default_value_cmp(*memb_ptr2) == 0) { - if(t2m_build) { - t2m_build[t2m_count].el_no = edx; - t2m_build[t2m_count].el_tag = 0; - t2m_count++; - } - continue; - } - - tmper = elm->type->op->der_encoder(elm->type, *memb_ptr2, - elm->tag_mode, elm->tag, - 0, 0); - if(tmper.encoded == -1) - return tmper; - computed_size += tmper.encoded; - - /* - * Remember the outmost tag of this member. - */ - if(t2m_build) { - t2m_build[t2m_count].el_no = edx; - t2m_build[t2m_count].el_tag = asn_TYPE_outmost_tag( - elm->type, *memb_ptr2, elm->tag_mode, elm->tag); - t2m_count++; - } else { - /* - * No dynamic sorting is necessary. - */ - } - } - - /* - * Finalize order of the components. - */ - if(t2m_build) { - /* - * Sort the underlying members according to their - * canonical tags order. DER encoding mandates it. - */ - qsort(t2m_build, t2m_count, sizeof(specs->tag2el[0]), _t2e_cmp); - t2m = t2m_build; - } else { - /* - * Tags are already sorted by the compiler. - */ - t2m = specs->tag2el; - t2m_count = specs->tag2el_count; - } - assert(t2m_count == td->elements_count); - - /* - * Encode the TLV for the sequence itself. - */ - ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); - if(ret == -1) { - FREEMEM(t2m_build); - ASN__ENCODE_FAILED; - } - er.encoded = computed_size + ret; - - if(!cb) { - FREEMEM(t2m_build); - ASN__ENCODED_OK(er); - } - - /* - * Encode all members. - */ - for(edx = 0; edx < td->elements_count; edx++) { - asn_TYPE_member_t *elm; - asn_enc_rval_t tmper; - - const void *memb_ptr_dontuse; /* Pointer to the member */ - const void *const *memb_ptr2; /* Pointer to that pointer */ - - /* Encode according to the tag order */ - elm = &td->elements[t2m[edx].el_no]; - - if(elm->flags & ATF_POINTER) { - memb_ptr2 = - (const void *const *)((const char *)sptr + elm->memb_offset); - if(!*memb_ptr2) continue; - } else { - memb_ptr_dontuse = - (const void *)((const char *)sptr + elm->memb_offset); - memb_ptr2 = &memb_ptr_dontuse; /* Only use of memb_ptr_dontuse */ - } - - /* Eliminate default values */ - if(elm->default_value_cmp && elm->default_value_cmp(*memb_ptr2) == 0) - continue; - - tmper = elm->type->op->der_encoder(elm->type, *memb_ptr2, - elm->tag_mode, elm->tag, cb, app_key); - if(tmper.encoded == -1) - return tmper; - computed_size -= tmper.encoded; - } - - if(computed_size != 0) { - /* - * Encoded size is not equal to the computed size. - */ - FREEMEM(t2m_build); - ASN__ENCODE_FAILED; - } - - FREEMEM(t2m_build); - ASN__ENCODED_OK(er); -} - -#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_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_specifics_t *specs = (const asn_SET_specifics_t *)td->specifics; - const 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 */ - const asn_TYPE_member_t *elm; - - /* - * Go inside the inner member of a set. - */ - if(ctx->phase == 2) { - asn_dec_rval_t tmprval; - void *memb_ptr_dontuse; /* Pointer to the member */ - void **memb_ptr2; /* Pointer to that pointer */ - - if(ASN_SET_ISPRESENT2((char *)st + specs->pres_offset, - edx)) { - ASN_DEBUG("SET %s: Duplicate element %s (%" ASN_PRI_SSIZE ")", - td->name, elements[edx].name, edx); - RETURN(RC_FAIL); - } - - elm = &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 */ - } - - /* Invoke the inner type decoder, m.b. multiple times */ - tmprval = elm->type->op->xer_decoder(opt_codec_ctx, - elm->type, memb_ptr2, elm->name, - buf_ptr, size); - XER_ADVANCE(tmprval.consumed); - if(tmprval.code != RC_OK) - RETURN(tmprval.code); - ctx->phase = 1; /* Back to body processing */ - ASN_SET_MKPRESENT((char *)st + specs->pres_offset, edx); - ASN_DEBUG("XER/SET 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: tcv = %d, ph=%d", tcv, ctx->phase); - - /* Skip the extensions section */ - if(ctx->phase == 3) { - switch(xer_skip_unknown(tcv, &ctx->left)) { - case -1: - ctx->phase = 4; - RETURN(RC_FAIL); - case 1: - ctx->phase = 1; - /* Fall through */ - case 0: - XER_ADVANCE(ch_size); - 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(_SET_is_populated(td, st)) { - XER_ADVANCE(ch_size); - ctx->phase = 4; /* Phase out */ - RETURN(RC_OK); - } else { - ASN_DEBUG("Premature end of XER SET"); - 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/SET: tcv=%d, ph=%d", tcv, ctx->phase); - if(ctx->phase != 1) - break; /* Really unexpected */ - - /* - * Search which member corresponds to this tag. - */ - for(edx = 0; edx < td->elements_count; edx++) { - switch(xer_check_tag(buf_ptr, ch_size, - elements[edx].name)) { - 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->extensible) { - 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 */ - } else { - ctx->left = 1; - ctx->phase = 3; /* Skip ...'s */ - } - XER_ADVANCE(ch_size); - continue; - } - - /* Fall through */ - default: - break; - } - - ASN_DEBUG("Unexpected XML tag in SET, expected \"%s\"", - xml_tag); - break; - } - - ctx->phase = 4; /* "Phase out" on hard failure */ - RETURN(RC_FAIL); -} - -asn_enc_rval_t -SET_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_SET_specifics_t *specs = (const asn_SET_specifics_t *)td->specifics; - asn_enc_rval_t er; - int xcan = (flags & XER_F_CANONICAL); - const asn_TYPE_tag2member_t *t2m = specs->tag2el_cxer; - size_t t2m_count = specs->tag2el_cxer_count; - size_t edx; - - if(!sptr) - ASN__ENCODE_FAILED; - - assert(t2m_count == td->elements_count); - - er.encoded = 0; - - for(edx = 0; edx < t2m_count; edx++) { - asn_enc_rval_t tmper; - asn_TYPE_member_t *elm; - const void *memb_ptr; - const char *mname; - size_t mlen; - - elm = &td->elements[t2m[edx].el_no]; - mname = elm->name; - mlen = strlen(elm->name); - - if(elm->flags & ATF_POINTER) { - memb_ptr = - *(const void *const *)((const char *)sptr + elm->memb_offset); - if(!memb_ptr) { - if(elm->optional) - continue; - /* Mandatory element 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(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: - ASN__ENCODE_FAILED; -} - -int -SET_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); - } - - _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 -SET_free(const asn_TYPE_descriptor_t *td, void *ptr, - enum asn_struct_free_method method) { - size_t edx; - - if(!td || !ptr) - return; - - ASN_DEBUG("Freeing %s as SET", 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 *)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, - ((const asn_SET_specifics_t *)(td->specifics))->struct_size); - break; - } -} - -int -SET_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) { - 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); - } - } - - return 0; -} - -int -SET_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; - return -1; - } else if(!bmemb) { - 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_SET = { - SET_free, - SET_print, - SET_compare, - SET_decode_ber, - SET_encode_der, - SET_decode_xer, - SET_encode_xer, - 0, /* SET_decode_oer */ - 0, /* SET_encode_oer */ - 0, /* SET_decode_uper */ - 0, /* SET_encode_uper */ - 0, /* SET_decode_aper */ - 0, /* SET_encode_aper */ - SET_random_fill, - 0 /* Use generic outmost tag fetcher */ -}; - - -asn_random_fill_result_t -SET_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, - const asn_encoding_constraints_t *constr, - size_t max_length) { - const asn_SET_specifics_t *specs = - (const asn_SET_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/e2sm/lib/constr_SET_OF.c b/e2sm/lib/constr_SET_OF.c index bf1dc27..97a7cac 100644 --- a/e2sm/lib/constr_SET_OF.c +++ b/e2sm/lib/constr_SET_OF.c @@ -5,275 +5,63 @@ */ #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; +asn_TYPE_operation_t asn_OP_SET_OF = { + SET_OF_free, +#if !defined(ASN_DISABLE_PRINT_SUPPORT) + SET_OF_print, +#else + 0, +#endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */ + SET_OF_compare, +#if !defined(ASN_DISABLE_BER_SUPPORT) + SET_OF_decode_ber, + SET_OF_encode_der, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_XER_SUPPORT) + SET_OF_decode_xer, + SET_OF_encode_xer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_XER_SUPPORT) */ +#if !defined(ASN_DISABLE_JER_SUPPORT) + SET_OF_encode_jer, +#else + 0, +#endif /* !defined(ASN_DISABLE_JER_SUPPORT) */ +#if !defined(ASN_DISABLE_OER_SUPPORT) + SET_OF_decode_oer, + SET_OF_encode_oer, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_OER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) + SET_OF_decode_uper, + SET_OF_encode_uper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + SET_OF_decode_aper, + SET_OF_encode_aper, +#else + 0, + 0, +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ +#if !defined(ASN_DISABLE_RFILL_SUPPORT) + SET_OF_random_fill, +#else + 0, +#endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */ + 0 /* Use generic outmost tag fetcher */ }; + /* 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; @@ -336,7 +124,7 @@ static int _el_buf_cmp(const void *ap, const void *bp) { return ret; } -static void +void SET_OF__encode_sorted_free(struct _el_buffer *el_buf, size_t count) { size_t i; @@ -347,12 +135,7 @@ SET_OF__encode_sorted_free(struct _el_buffer *el_buf, size_t count) { FREEMEM(el_buf); } -enum SET_OF__encode_method { - SOES_DER, /* Distinguished Encoding Rules */ - SOES_CUPER /* Canonical Unaligned Packed Encoding Rules */ -}; - -static struct _el_buffer * +struct _el_buffer * SET_OF__encode_sorted(const asn_TYPE_member_t *elm, const asn_anonymous_set_ *list, enum SET_OF__encode_method method) { @@ -379,10 +162,13 @@ SET_OF__encode_sorted(const asn_TYPE_member_t *elm, * Encode the member into the prepared space. */ switch(method) { +#if !defined(ASN_DISABLE_BER_SUPPORT) case SOES_DER: erval = elm->type->op->der_encoder(elm->type, memb_ptr, 0, elm->tag, _el_addbytes, encoding_el); break; +#endif /* !defined(ASN_DISABLE_BER_SUPPORT) */ +#if !defined(ASN_DISABLE_UPER_SUPPORT) case SOES_CUPER: erval = uper_encode(elm->type, elm->encoding_constraints.per_constraints, @@ -393,6 +179,20 @@ SET_OF__encode_sorted(const asn_TYPE_member_t *elm, encoding_el->bits_unused = (8 - extra_bits) & 0x7; } break; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */ +#if !defined(ASN_DISABLE_APER_SUPPORT) + case SOES_CAPER: + erval = aper_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; +#endif /* !defined(ASN_DISABLE_APER_SUPPORT) */ + default: assert(!"Unreachable"); break; @@ -413,417 +213,6 @@ SET_OF__encode_sorted(const asn_TYPE_member_t *elm, } } - -/* - * 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) { @@ -902,293 +291,6 @@ SET_OF_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, 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; @@ -1267,175 +369,3 @@ SET_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, 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/e2sm/lib/constr_SET_OF_aper.c b/e2sm/lib/constr_SET_OF_aper.c new file mode 100644 index 0000000..87c341e --- /dev/null +++ b/e2sm/lib/constr_SET_OF_aper.c @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t +SET_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_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}; + int seq; + + if(!sptr) ASN__ENCODE_FAILED; + + list = _A_CSET_FROM_VOID(sptr); + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SET 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 %lld ub %lld %s", + (long long int)ct->lower_bound, + (long long int)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->lower_bound, ct->upper_bound, list->count - ct->lower_bound, 0) < 0) { + ASN__ENCODE_FAILED; + } + } + + /* + * Canonical PER #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_CAPER); + + for(seq = 0; seq < list->count;) { + ssize_t may_encode; + int need_eom = 0; + if(ct && ct->effective_bits >= 0) { + may_encode = list->count; + } else { + may_encode = + aper_put_length(po, -1, -1, list->count - seq, &need_eom); + if(may_encode < 0) ASN__ENCODE_FAILED; + } + + while(may_encode--) { + const struct _el_buffer *el = &encoded_els[seq++]; + if(asn_put_many_bits(po, el->buf, + (8 * el->length) - el->bits_unused) < 0) { + break; + } + } + if(need_eom && (aper_put_length(po, -1, -1, 0, NULL) < 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + } + + SET_OF__encode_sorted_free(encoded_els, list->count); + + ASN__ENCODED_OK(er); +} + +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+%lld elements from %s", + (long)nelems, (long long int)ct->lower_bound, td->name); + if(nelems < 0) ASN__DECODE_STARVED; + nelems += ct->lower_bound; + } else { + nelems = -1; + } + + do { + int i; + if(nelems < 0) { + if (ct) + nelems = aper_get_length(pd, ct->lower_bound, ct->upper_bound, + ct->effective_bits, &repeat); + else + nelems = aper_get_length(pd, -1, -1, -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; +} diff --git a/e2sm/lib/constr_SET_OF_ber.c b/e2sm/lib/constr_SET_OF_ber.c new file mode 100644 index 0000000..4187e29 --- /dev/null +++ b/e2sm/lib/constr_SET_OF_ber.c @@ -0,0 +1,355 @@ +/* + * Copyright (c) 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) +#undef PHASE_OUT +#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; /* ?Subtracted 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); +} + +/* + * 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; + } +} diff --git a/e2sm/lib/constr_SET_OF_jer.c b/e2sm/lib/constr_SET_OF_jer.c new file mode 100644 index 0000000..a0c2adc --- /dev/null +++ b/e2sm/lib/constr_SET_OF_jer.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +typedef struct jer_tmp_enc_s { + void *buffer; + size_t offset; + size_t size; +} jer_tmp_enc_t; + +static int +SET_OF_encode_jer_callback(const void *buffer, size_t size, void *key) { + jer_tmp_enc_t *t = (jer_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_jer_order(const void *aptr, const void *bptr) { + const jer_tmp_enc_t *a = (const jer_tmp_enc_t *)aptr; + const jer_tmp_enc_t *b = (const jer_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_jer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum jer_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 = 0; + jer_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 = (jer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0])); + if(!encs) ASN__ENCODE_FAILED; + cb = SET_OF_encode_jer_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, "\": ", 3); + } + + if(!xcan && specs->as_XMLValueList == 1) + ASN__TEXT_INDENT(1, ilevel + 1); + tmper = elm->type->op->jer_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) { + jer_tmp_enc_t *enc = encs; + jer_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_jer_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); +} diff --git a/e2sm/lib/constr_SET_OF_oer.c b/e2sm/lib/constr_SET_OF_oer.c index 5200518..a0f0140 100644 --- a/e2sm/lib/constr_SET_OF_oer.c +++ b/e2sm/lib/constr_SET_OF_oer.c @@ -3,8 +3,6 @@ * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ -#ifndef ASN_DISABLE_OER_SUPPORT - #include #include #include @@ -43,12 +41,12 @@ * 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; \ +#define RETURN(_code) \ + do { \ + asn_dec_rval_t _rval; \ + _rval.code = _code; \ + _rval.consumed = consumed_myself; \ + return _rval; \ } while(0) /* @@ -281,5 +279,3 @@ SET_OF_encode_oer(const asn_TYPE_descriptor_t *td, ASN__ENCODED_OK(erval); } } - -#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/e2sm/lib/constr_SET_OF_print.c b/e2sm/lib/constr_SET_OF_print.c new file mode 100644 index 0000000..748dba7 --- /dev/null +++ b/e2sm/lib/constr_SET_OF_print.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; +} diff --git a/e2sm/lib/constr_SET_OF_rfill.c b/e2sm/lib/constr_SET_OF_rfill.c new file mode 100644 index 0000000..9b2ac5e --- /dev/null +++ b/e2sm/lib/constr_SET_OF_rfill.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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 !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + 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; + } + } +#else + if(!constraints) constraints = &td->encoding_constraints; +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + + /* Bias towards edges of allowed space */ + switch(asn_random_between(-1, 4)) { + default: + case -1: +#if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) + /* 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; + } +#endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */ + /* 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/e2sm/lib/constr_SET_OF_uper.c b/e2sm/lib/constr_SET_OF_uper.c new file mode 100644 index 0000000..b99a244 --- /dev/null +++ b/e2sm/lib/constr_SET_OF_uper.c @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +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; + } +} diff --git a/e2sm/lib/constr_SET_OF_xer.c b/e2sm/lib/constr_SET_OF_xer.c new file mode 100644 index 0000000..1d97e5b --- /dev/null +++ b/e2sm/lib/constr_SET_OF_xer.c @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +#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); +} diff --git a/e2sm/lib/constr_TYPE.c b/e2sm/lib/constr_TYPE.c index aefaefd..e634e75 100644 --- a/e2sm/lib/constr_TYPE.c +++ b/e2sm/lib/constr_TYPE.c @@ -70,7 +70,7 @@ _print2fp(const void *buffer, size_t size, void *app_key) { * 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 CC_PRINTFLIKE(1, 2) ASN_DEBUG_f(const char *fmt, ...); void ASN_DEBUG_f(const char *fmt, ...) { va_list ap; va_start(ap, fmt); diff --git a/e2sm/lib/constraints.c b/e2sm/lib/constraints.c index df3c6c1..72137cc 100644 --- a/e2sm/lib/constraints.c +++ b/e2sm/lib/constraints.c @@ -35,6 +35,7 @@ struct errbufDesc { }; static void +CC_PRINTFLIKE(4, 5) _asn_i_ctfailcb(void *key, const asn_TYPE_descriptor_t *td, const void *sptr, const char *fmt, ...) { struct errbufDesc *arg = key; diff --git a/e2sm/lib/cscope.out b/e2sm/lib/cscope.out deleted file mode 100644 index 9b3ad35..0000000 --- a/e2sm/lib/cscope.out +++ /dev/null @@ -1,116022 +0,0 @@ -cscope 15 $HOME/Desktop/kpimon/e2sm/lib 0000709974 - @AMF-UE-NGAP-ID.c - -8  - ~"AMF-UE-NGAP-ID.h -" - -11 - $AMF_UE_NGAP_ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -INTEGER_t - * -¡ - = (cÚ¡ INTEGER_ˆ*) -¥Œ -; - -14  -v®ue -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( - `a¢_INTEGER2lÚg -( -¡ -, & -v®ue -)) { - -24 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -26 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -30 if(( -v®ue - >= 0 && value <= 1099511627775)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -45 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_AMF_UE_NGAP_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -46 { -APC_CONSTRAINED -, 40, -1, 0, 1099511627775 } , - -47 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -50 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_AMF_UE_NGAP_ID_gs_1 -[] = { - -51 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -53 -a¢_TYPE_desütÜ_t - - ga¢_DEF_AMF_UE_NGAP_ID - = { - -56 & -a¢_OP_INTEGER -, - -57 -a¢_DEF_AMF_UE_NGAP_ID_gs_1 -, - -58 ( -a¢_DEF_AMF_UE_NGAP_ID_gs_1 -) - -59 /( -a¢_DEF_AMF_UE_NGAP_ID_gs_1 -[0]), - -60 -a¢_DEF_AMF_UE_NGAP_ID_gs_1 -, - -61 ( -a¢_DEF_AMF_UE_NGAP_ID_gs_1 -) - -62 /( -a¢_DEF_AMF_UE_NGAP_ID_gs_1 -[0]), - -63 { 0, & -a¢_PER_ty³_AMF_UE_NGAP_ID_cÚ¡r_1 -, -AMF_UE_NGAP_ID_cÚ¡¿št - }, - - @AMFPointer.c - -8  - ~"AMFPoš‹r.h -" - -11 - $AMFPoš‹r_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( -¡ --> -size - > 0) { - -25 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -27 -size - = 0; - -30 if(( -size - == 6)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -45 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_AMFPoš‹r_cÚ¡r_1 - - gCC_NOTUSED - = { - -46 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -47 { -APC_CONSTRAINED -, 0, 0, 6, 6 } , - -50 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_AMFPoš‹r_gs_1 -[] = { - -51 ( -ASN_TAG_CLASS_UNIVERSAL - | (3 << 2)) - -53 -a¢_TYPE_desütÜ_t - - ga¢_DEF_AMFPoš‹r - = { - -56 & -a¢_OP_BIT_STRING -, - -57 -a¢_DEF_AMFPoš‹r_gs_1 -, - -58 ( -a¢_DEF_AMFPoš‹r_gs_1 -) - -59 /( -a¢_DEF_AMFPoš‹r_gs_1 -[0]), - -60 -a¢_DEF_AMFPoš‹r_gs_1 -, - -61 ( -a¢_DEF_AMFPoš‹r_gs_1 -) - -62 /( -a¢_DEF_AMFPoš‹r_gs_1 -[0]), - -63 { 0, & -a¢_PER_ty³_AMFPoš‹r_cÚ¡r_1 -, -AMFPoš‹r_cÚ¡¿št - }, - -65 & -a¢_SPC_BIT_STRING_¥ecs - - - @AMFRegionID.c - -8  - ~"AMFRegiÚID.h -" - -11 - $AMFRegiÚID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( -¡ --> -size - > 0) { - -25 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -27 -size - = 0; - -30 if(( -size - == 8)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -45 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_AMFRegiÚID_cÚ¡r_1 - - gCC_NOTUSED - = { - -46 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -47 { -APC_CONSTRAINED -, 0, 0, 8, 8 } , - -50 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_AMFRegiÚID_gs_1 -[] = { - -51 ( -ASN_TAG_CLASS_UNIVERSAL - | (3 << 2)) - -53 -a¢_TYPE_desütÜ_t - - ga¢_DEF_AMFRegiÚID - = { - -56 & -a¢_OP_BIT_STRING -, - -57 -a¢_DEF_AMFRegiÚID_gs_1 -, - -58 ( -a¢_DEF_AMFRegiÚID_gs_1 -) - -59 /( -a¢_DEF_AMFRegiÚID_gs_1 -[0]), - -60 -a¢_DEF_AMFRegiÚID_gs_1 -, - -61 ( -a¢_DEF_AMFRegiÚID_gs_1 -) - -62 /( -a¢_DEF_AMFRegiÚID_gs_1 -[0]), - -63 { 0, & -a¢_PER_ty³_AMFRegiÚID_cÚ¡r_1 -, -AMFRegiÚID_cÚ¡¿št - }, - -65 & -a¢_SPC_BIT_STRING_¥ecs - - - @AMFSetID.c - -8  - ~"AMFS‘ID.h -" - -11 - $AMFS‘ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( -¡ --> -size - > 0) { - -25 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -27 -size - = 0; - -30 if(( -size - == 10)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -45 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_AMFS‘ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -46 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -47 { -APC_CONSTRAINED -, 0, 0, 10, 10 } , - -50 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_AMFS‘ID_gs_1 -[] = { - -51 ( -ASN_TAG_CLASS_UNIVERSAL - | (3 << 2)) - -53 -a¢_TYPE_desütÜ_t - - ga¢_DEF_AMFS‘ID - = { - -56 & -a¢_OP_BIT_STRING -, - -57 -a¢_DEF_AMFS‘ID_gs_1 -, - -58 ( -a¢_DEF_AMFS‘ID_gs_1 -) - -59 /( -a¢_DEF_AMFS‘ID_gs_1 -[0]), - -60 -a¢_DEF_AMFS‘ID_gs_1 -, - -61 ( -a¢_DEF_AMFS‘ID_gs_1 -) - -62 /( -a¢_DEF_AMFS‘ID_gs_1 -[0]), - -63 { 0, & -a¢_PER_ty³_AMFS‘ID_cÚ¡r_1 -, -AMFS‘ID_cÚ¡¿št - }, - -65 & -a¢_SPC_BIT_STRING_¥ecs - - - @BIT_STRING.c - -5  - ~ - -6  - ~ - -7  - ~ - -12 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_BIT_STRING_gs -[] = { - -13 ( -ASN_TAG_CLASS_UNIVERSAL - | (3 << 2)) - -15 -a¢_OCTET_STRING_¥ecifics_t - - ga¢_SPC_BIT_STRING_¥ecs - = { - -16 ( -BIT_STRING_t -), - -17 -off£tof -( -BIT_STRING_t -, -_a¢_ùx -), - -18 -ASN_OSUBV_BIT - - -20 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_BIT_STRING - = { - -21 -OCTET_STRING_ä“ -, - -22 -BIT_STRING_´št -, - -23 -BIT_STRING_com·» -, - -24 -OCTET_STRING_decode_b” -, - -25 -OCTET_STRING_’code_d” -, - -26 -OCTET_STRING_decode_x”_bš¬y -, - -27 -BIT_STRING_’code_x” -, - -28 #ifdef -ASN_DISABLE_OER_SUPPORT - - -32 -BIT_STRING_decode_Ûr -, - -33 -BIT_STRING_’code_Ûr -, - -35 #ifdef -ASN_DISABLE_PER_SUPPORT - - -41 -BIT_STRING_decode_u³r -, - -42 -BIT_STRING_’code_u³r -, - -43 -OCTET_STRING_decode_­” -, - -44 -OCTET_STRING_’code_­” -, - -46 -BIT_STRING_¿ndom_fžl -, - -49 -a¢_TYPE_desütÜ_t - - ga¢_DEF_BIT_STRING - = { - -52 & -a¢_OP_BIT_STRING -, - -53 -a¢_DEF_BIT_STRING_gs -, - -54 ( -a¢_DEF_BIT_STRING_gs -) - -55 / ( -a¢_DEF_BIT_STRING_gs -[0]), - -56 -a¢_DEF_BIT_STRING_gs -, - -57 ( -a¢_DEF_BIT_STRING_gs -) - -58 / ( -a¢_DEF_BIT_STRING_gs -[0]), - -59 { 0, 0, -BIT_STRING_cÚ¡¿št - }, - -61 & -a¢_SPC_BIT_STRING_¥ecs - - -68 - $BIT_STRING_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -69 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -70 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -72 if( -¡ - && st-> -buf -) { - -73 if(( -¡ --> -size - =ð0 && st-> -b™s_unu£d -) - -74 || -¡ --> -b™s_unu£d - < 0 || st->bits_unused > 7) { - -75 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -77 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -81 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -83 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -88 - } -} - -90 cÚ¡ * - g_b™_·‰”n -[16] = { - -95 -a¢_’c_rv®_t - - -96 - $BIT_STRING_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -97  -žev– -, -x”_’cod”_æags_e - -æags -, - -98 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -99 -a¢_’c_rv®_t - -” - = {0, 0, 0}; - -100  -sü©ch -[128]; - -101 * -p - = -sü©ch -; - -102 * -sûnd - = -sü©ch - + ((scratch) - 10); - -103 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -104  -xÿn - = ( -æags - & -XER_F_CANONICAL -); - -105 -ušt8_t - * -buf -; - -106 -ušt8_t - * -’d -; - -108 if(! -¡ - || !¡-> -buf -) - -109 -ASN__ENCODE_FAILED -; - -111 -” -. -’coded - = 0; - -113 -buf - = -¡ -->buf; - -114 -’d - = -buf - + -¡ --> -size - - 1; - -119 ; -buf - < -’d -; buf++) { - -120  -v - = * -buf -; - -121  -ƚe - = -xÿn -?0:((( -buf - - -¡ -->buf) % 8) == 0); - -122 if( -p - >ð -sûnd - || -ƚe -) { - -123 - `ASN__CALLBACK -( -sü©ch -, -p - - scratch); - -124 -p - = -sü©ch -; - -125 if( -ƚe -è - `ASN__TEXT_INDENT -(1, -žev– -); - -127 - `memýy -( -p - + 0, -_b™_·‰”n -[ -v - >> 4], 4); - -128 - `memýy -( -p - + 4, -_b™_·‰”n -[ -v - & 0x0f], 4); - -129 -p - += 8; - -132 if(! -xÿn - && (( -buf - - -¡ -->buf) % 8) == 0) - -133 - `ASN__TEXT_INDENT -(1, -žev– -); - -134 - `ASN__CALLBACK -( -sü©ch -, -p - - scratch); - -135 -p - = -sü©ch -; - -137 if( -buf - =ð -’d -) { - -138  -v - = * -buf -; - -139  -ub™s - = -¡ --> -b™s_unu£d -; - -140  -i -; - -141  -i - = 7; i >ð -ub™s -; i--) - -142 * -p -++ = ( -v - & (1 << -i -)) ? 0x31 : 0x30; - -143 - `ASN__CALLBACK -( -sü©ch -, -p - - scratch); - -146 if(! -xÿn -è - `ASN__TEXT_INDENT -(1, -žev– - - 1); - -148 - `ASN__ENCODED_OK -( -” -); - -149 -cb_çžed -: - -150 -ASN__ENCODE_FAILED -; - -151 - } -} - -158 - $BIT_STRING_´št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -159 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -160 cÚ¡ * cÚ¡ -h2c - = "0123456789ABCDEF"; - -161  -sü©ch -[64]; - -162 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -163 -ušt8_t - * -buf -; - -164 -ušt8_t - * -’d -; - -165 * -p - = -sü©ch -; - -167 () -td -; - -169 if(! -¡ - || !¡-> -buf -) - -170  ( - `cb -("", 8, -­p_key -) < 0) ? -1 : 0; - -172 -žev– -++; - -173 -buf - = -¡ -->buf; - -174 -’d - = -buf - + -¡ --> -size -; - -179 ; -buf - < -’d -; buf++) { - -180 if(( -buf - - -¡ -->bufè% 16 =ð0 && (¡-> -size - > 16) - -181 && -buf - !ð -¡ -->buf) { - -182 - `_i_INDENT -(1); - -184 if( - `cb -( -sü©ch -, -p - - sü©ch, -­p_key -) < 0)  -1; - -185 -p - = -sü©ch -; - -187 * -p -++ = -h2c -[* -buf - >> 4]; - -188 * -p -++ = -h2c -[* -buf - & 0x0F]; - -189 * -p -++ = 0x20; - -192 if( -p - > -sü©ch -) { - -193 -p ---; - -195 if(( -¡ --> -size - > 16)) { - -196 - `_i_INDENT -(1); - -200 if( - `cb -( -sü©ch -, -p - - sü©ch, -­p_key -) < 0) - -204 if( -¡ --> -b™s_unu£d -) { - -205  -»t - = - `¢´štf -( -sü©ch -, (scratch), " (%d bit%s unused)", - -206 -¡ --> -b™s_unu£d -, st->bits_unused == 1 ? "" : "s"); - -207 - `as£¹ -( -»t - > 0 &&„‘ < ( -ssize_t -)( -sü©ch -)); - -208 if( -»t - > 0 &&„‘ < ( -ssize_t -)( -sü©ch -) - -209 && - `cb -( -sü©ch -, -»t -, -­p_key -) < 0) - -214 - } -} - -219 cÚ¡ -BIT_STRING_t - * - -220 - $BIT_STRING__com·ùify -(cÚ¡ -BIT_STRING_t - * -¡ -, BIT_STRING_ˆ* -tmp -) { - -221 cÚ¡ -ušt8_t - * -b -; - -223 cÚ¡ -ušt8_t - * -c_buf -; - -224 -ušt8_t - * -nc_buf -; - -225 } -uncÚ¡ -; - -227 if( -¡ --> -size - == 0) { - -228 - `as£¹ -( -¡ --> -b™s_unu£d - == 0); - -229  -¡ -; - -231  -b - = & -¡ --> -buf -[¡-> -size - - 1]; b > st->buf && *b == 0; b--) { - -235 if(* -b -) { - -236  -unu£d - = 7; - -237 -ušt8_t - -v - = * -b -; - -238 -v - &ð-( -št8_t -)v; - -239 if( -v - & 0x0Fè -unu£d - -= 4; - -240 if( -v - & 0x33è -unu£d - -= 2; - -241 if( -v - & 0x55è -unu£d - -= 1; - -242 -tmp --> -size - = -b -- -¡ --> -buf - + 1; - -243 -tmp --> -b™s_unu£d - = -unu£d -; - -245 -tmp --> -size - = -b -- -¡ --> -buf -; - -246 -tmp --> -b™s_unu£d - = 0; - -249 - `as£¹ -( -b - >ð -¡ --> -buf -); - -252 -uncÚ¡ -. -c_buf - = -¡ --> -buf -; - -253 -tmp --> -buf - = -uncÚ¡ -. -nc_buf -; - -254  -tmp -; - -255 - } -} - -262 - $BIT_STRING_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -­Œ -, - -263 cÚ¡ * -b±r -) { - -269 -BIT_STRING_t - -com·ù_a -, -com·ù_b -; - -270 cÚ¡ -BIT_STRING_t - * -a - = - `BIT_STRING__com·ùify -( -­Œ -, & -com·ù_a -); - -271 cÚ¡ -BIT_STRING_t - * -b - = - `BIT_STRING__com·ùify -( -b±r -, & -com·ù_b -); - -272 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics -; - -274 - `as£¹ -( -¥ecs - && s³cs-> -subv¬ŸÁ - =ð -ASN_OSUBV_BIT -); - -276 if( -a - && -b -) { - -277 -size_t - -commÚ_´efix_size - = -a --> -size - <ð -b -->size ?‡->size : b->size; - -278  -»t - = - `memcmp -( -a --> -buf -, -b -->buf, -commÚ_´efix_size -); - -279 if( -»t - == 0) { - -281 if( -a --> -size - < -b -->size) { - -283 } if( -a --> -size - > -b -->size) { - -287 if( -a --> -b™s_unu£d - > -b -->bits_unused) { - -289 } if( -a --> -b™s_unu£d - < -b -->bits_unused) { - -296  -»t -; - -298 } if(! -a - && ! -b -) { - -300 } if(! -a -) { - -305 - } -} - -307 #iâdeà -ASN_DISABLE_PER_SUPPORT - - -309 #undeà -RETURN - - -310  - #RETURN -( -_code -) \ - -312 -a¢_dec_rv®_t - -tm´v® -; \ - -313 -tm´v® -. -code - = -_code -; \ - -314 -tm´v® -. -cÚsumed - = -cÚsumed_my£lf -; \ - -315  -tm´v® -; \ - -316 } 0) - - ) - -318  -a¢_³r_cÚ¡¿št_t - - ga¢_DEF_BIT_STRING_cÚ¡¿št_size - = { - -319 -APC_SEMI_CONSTRAINED -, -1, -1, 0, 0}; - -321 -a¢_dec_rv®_t - - -322 - $BIT_STRING_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -323 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -324 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -325 -a¢_³r_d©a_t - * -pd -) { - -326 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics - - -327 ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *) -td --> -¥ecifics - - -328 : & -a¢_SPC_BIT_STRING_¥ecs -; - -329 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -pc - = - -330 -cÚ¡¿šts - ? cÚ¡¿št : -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -; - -331 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -csiz -; - -332 -a¢_dec_rv®_t - -rv® - = { -RC_OK -, 0 }; - -333 -BIT_STRING_t - * -¡ - = (BIT_STRING_ˆ*)* -¥Œ -; - -334 -ssize_t - -cÚsumed_my£lf - = 0; - -335  -»³© -; - -337 () -Ýt_codec_ùx -; - -339 if( -pc -) { - -340 -csiz - = & -pc --> -size -; - -342 -csiz - = & -a¢_DEF_BIT_STRING_cÚ¡¿št_size -; - -345 if( -¥ecs --> -subv¬ŸÁ - !ð -ASN_OSUBV_BIT -) { - -346 - `ASN_DEBUG -("Subv¬ŸÁ %d i nÙ BIT OSUBV_BIT", -¥ecs --> -subv¬ŸÁ -); - -347 - `RETURN -( -RC_FAIL -); - -353 if(! -¡ -) { - -354 -¡ - = ( -BIT_STRING_t - *)(* -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -)); - -355 if(! -¡ -è - `RETURN -( -RC_FAIL -); - -358 - `ASN_DEBUG -("PER Decoding %s size %ld .. %ld bits %d", - -359 -csiz --> -æags - & -APC_EXTENSIBLE - ? "extensible" : "non-extensible", - -360 -csiz --> -low”_bound -, csiz-> -uµ”_bound -, csiz-> -efãùive_b™s -); - -362 if( -csiz --> -æags - & -APC_EXTENSIBLE -) { - -363  -šext - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -364 if( -šext - < 0è - `RETURN -( -RC_WMORE -); - -365 if( -šext -) { - -366 -csiz - = & -a¢_DEF_BIT_STRING_cÚ¡¿št_size -; - -370 if( -csiz --> -efãùive_b™s - >= 0) { - -371 - `FREEMEM -( -¡ --> -buf -); - -372 -¡ --> -size - = ( -csiz --> -uµ”_bound - + 7) >> 3; - -373 -¡ --> -buf - = ( -ušt8_t - *) - `MALLOC -(¡-> -size - + 1); - -374 if(! -¡ --> -buf -è{ st-> -size - = 0; - `RETURN -( -RC_FAIL -); } - -380 if( -csiz --> -efãùive_b™s - == 0) { - -381  -»t -; - -382 - `ASN_DEBUG -("Encodšg BIT STRING siz%ld", -csiz --> -uµ”_bound -); - -383 -»t - = - `³r_g‘_mªy_b™s -( -pd -, -¡ --> -buf -, 0, -csiz --> -uµ”_bound -); - -384 if( -»t - < 0è - `RETURN -( -RC_WMORE -); - -385 -cÚsumed_my£lf - +ð -csiz --> -uµ”_bound -; - -386 -¡ --> -buf -[¡-> -size -] = 0; - -387 -¡ --> -b™s_unu£d - = (8 - ( -csiz --> -uµ”_bound - & 0x7)) & 0x7; - -388 - `RETURN -( -RC_OK -); - -391 -¡ --> -size - = 0; - -393 -ssize_t - -¿w_Ën -; - -394 -ssize_t - -Ën_by‹s -; - -395 -ssize_t - -Ën_b™s -; - -396 * -p -; - -397  -»t -; - -400 -¿w_Ën - = - `u³r_g‘_Ëngth -( -pd -, -csiz --> -efãùive_b™s -, csiz-> -low”_bound -, - -401 & -»³© -); - -402 if( -¿w_Ën - < 0è - `RETURN -( -RC_WMORE -); - -403 if( -¿w_Ën - =ð0 && -¡ --> -buf -) ; - -405 - `ASN_DEBUG -("Got PER†engthƒb %ld,†en %ld, %s (%s)", - -406 () -csiz --> -efãùive_b™s -, () -¿w_Ën -, - -407 -»³© - ? "»³©" : "Úû", -td --> -Çme -); - -408 -Ën_b™s - = -¿w_Ën -; - -409 -Ën_by‹s - = ( -Ën_b™s - + 7) >> 3; - -410 if( -Ën_b™s - & 0x7è -¡ --> -b™s_unu£d - = 8 - (len_bits & 0x7); - -412 -p - = - `REALLOC -( -¡ --> -buf -, st-> -size - + -Ën_by‹s - + 1); - -413 if(! -p -è - `RETURN -( -RC_FAIL -); - -414 -¡ --> -buf - = ( -ušt8_t - *) -p -; - -416 -»t - = - `³r_g‘_mªy_b™s -( -pd -, & -¡ --> -buf -[¡-> -size -], 0, -Ën_b™s -); - -417 if( -»t - < 0è - `RETURN -( -RC_WMORE -); - -418 -¡ --> -size - +ð -Ën_by‹s -; - -419 }  -»³© -); - -420 -¡ --> -buf -[¡-> -size -] = 0; - -422  -rv® -; - -423 - } -} - -425 -a¢_’c_rv®_t - - -426 - $BIT_STRING_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -427 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -428 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -429 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = - -430 -td --> -¥ecifics - ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *)td->specifics - -431 : & -a¢_SPC_BIT_STRING_¥ecs -; - -432 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -pc - = - -433 -cÚ¡¿šts - ? cÚ¡¿št : -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -; - -434 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -csiz -; - -435 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -436 -BIT_STRING_t - -com·ù_b¡r -; - -437 -a¢_’c_rv®_t - -” - = { 0, 0, 0 }; - -438  -šext - = 0; - -439 -size_t - -size_š_b™s -; - -440 cÚ¡ -ušt8_t - * -buf -; - -441  -»t -; - -442  -ù_ex‹nsibË -; - -444 if(! -¡ - || (!¡-> -buf - && st-> -size -)) - -445 -ASN__ENCODE_FAILED -; - -447 if( -¥ecs --> -subv¬ŸÁ - =ð -ASN_OSUBV_BIT -) { - -448 if(( -¡ --> -size - =ð0 && st-> -b™s_unu£d -) || (st->bits_unused & ~7)) - -449 -ASN__ENCODE_FAILED -; - -451 -ASN__ENCODE_FAILED -; - -454 if( -pc -) { - -455 -csiz - = & -pc --> -size -; - -457 -csiz - = & -a¢_DEF_BIT_STRING_cÚ¡¿št_size -; - -459 -ù_ex‹nsibË - = -csiz --> -æags - & -APC_EXTENSIBLE -; - -462 -¡ - = - `BIT_STRING__com·ùify -(¡, & -com·ù_b¡r -); - -463 -size_š_b™s - = 8 * -¡ --> -size - - st-> -b™s_unu£d -; - -465 - `ASN_DEBUG -( - -466 "Encodšg % štØ%" -ASN_PRI_SIZE - " bits" - -468 -td --> -Çme -, -size_š_b™s -, -csiz --> -low”_bound -, csiz-> -uµ”_bound -, - -469 -csiz --> -efãùive_b™s -, -ù_ex‹nsibË - ? " EXT" : ""); - -473 if( -csiz --> -efãùive_b™s - >= 0) { - -474 if(( -ssize_t -) -size_š_b™s - > -csiz --> -uµ”_bound -) { - -475 if( -ù_ex‹nsibË -) { - -476 -csiz - = & -a¢_DEF_BIT_STRING_cÚ¡¿št_size -; - -477 -šext - = 1; - -479 -ASN__ENCODE_FAILED -; - -483 -šext - = 0; - -486 if( -ù_ex‹nsibË -) { - -488 if( - `³r_put_ãw_b™s -( -po -, -šext -, 1)) - -489 -ASN__ENCODE_FAILED -; - -492 if( -csiz --> -efãùive_b™s - >ð0 && ! -šext -) { - -493  -add_Œaž” - = ( -ssize_t -) -size_š_b™s - < -csiz --> -low”_bound -; - -494 - `ASN_DEBUG -( - -495 "Encodšg %" -ASN_PRI_SIZE - " bytes (%ld),†ength (in %d bits)railer %d;‡ctual " - -496 "v®u%" -ASN_PRI_SSIZE - "", - -497 -¡ --> -size -, -size_š_b™s - - -csiz --> -low”_bound -, csiz-> -efãùive_b™s -, - -498 -add_Œaž” -, - -499 -add_Œaž” - ? 0 : ( -ssize_t -) -size_š_b™s - - -csiz --> -low”_bound -); - -500 -»t - = - `³r_put_ãw_b™s -( - -501 -po -, -add_Œaž” - ? 0 : ( -ssize_t -) -size_š_b™s - - -csiz --> -low”_bound -, - -502 -csiz --> -efãùive_b™s -); - -503 if( -»t -è -ASN__ENCODE_FAILED -; - -504 -»t - = - `³r_put_mªy_b™s -( -po -, -¡ --> -buf -, -size_š_b™s -); - -505 if( -»t -è -ASN__ENCODE_FAILED -; - -506 if( -add_Œaž” -) { - -507 cÚ¡ -ušt8_t - -z”os -[16]; - -508 -size_t - -Œažšg_z”o_b™s - = -csiz --> -low”_bound - - -size_š_b™s -; - -509  -Œažšg_z”o_b™s - > 0) { - -510 if( -Œažšg_z”o_b™s - > 8 * ( -z”os -)) { - -511 -»t - = - `³r_put_mªy_b™s -( -po -, -z”os -, 8 * (zeros)); - -512 -Œažšg_z”o_b™s - -ð8 * ( -z”os -); - -514 -»t - = - `³r_put_mªy_b™s -( -po -, -z”os -, -Œažšg_z”o_b™s -); - -515 -Œažšg_z”o_b™s - = 0; - -517 if( -»t -è -ASN__ENCODE_FAILED -; - -520 - `ASN__ENCODED_OK -( -” -); - -523 - `ASN_DEBUG -("Encodšg %" -ASN_PRI_SIZE - " by‹s", -¡ --> -size -); - -525 -buf - = -¡ -->buf; - -527  -Ãed_eom - = 0; - -528 -ssize_t - -maySave - = - `u³r_put_Ëngth -( -po -, -size_š_b™s -, & -Ãed_eom -); - -529 if( -maySave - < 0è -ASN__ENCODE_FAILED -; - -531 - `ASN_DEBUG -("Encodšg %" -ASN_PRI_SSIZE - " oà%" -ASN_PRI_SIZE - "", -maySave -, -size_š_b™s -); - -533 -»t - = - `³r_put_mªy_b™s -( -po -, -buf -, -maySave -); - -534 if( -»t -è -ASN__ENCODE_FAILED -; - -536 -buf - +ð -maySave - >> 3; - -537 -size_š_b™s - -ð -maySave -; - -538 - `as£¹ -(!( -maySave - & 0x07è|| ! -size_š_b™s -); - -539 if( -Ãed_eom - && - `u³r_put_Ëngth -( -po -, 0, 0)) - -540 -ASN__ENCODE_FAILED -; - -541 }  -size_š_b™s -); - -543 - `ASN__ENCODED_OK -( -” -); - -544 - } -} - -548 -a¢_¿ndom_fžl_»suÉ_t - - -549 - $BIT_STRING_¿ndom_fžl -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -550 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -551 -size_t - -max_Ëngth -) { - -552 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = - -553 -td --> -¥ecifics - ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *)td->specifics - -554 : & -a¢_SPC_BIT_STRING_¥ecs -; - -555 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_ok - = { -ARFILL_OK -, 1}; - -556 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_çžed - = { -ARFILL_FAILED -, 0}; - -557 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_sk³d - = { -ARFILL_SKIPPED -, 0}; - -558  -Ëngths -[] = {0, 1, 2, 3, 4, 8, - -561 -ušt8_t - * -buf -; - -562 -ušt8_t - * -b’d -; - -563 -ušt8_t - * -b -; - -564 -size_t - -ºd_b™s -, -ºd_Ën -; - -565 -BIT_STRING_t - * -¡ -; - -567 if( -max_Ëngth - =ð0è -»suÉ_sk³d -; - -569  -¥ecs --> -subv¬ŸÁ -) { - -570  -ASN_OSUBV_ANY -: - -571  -»suÉ_çžed -; - -572  -ASN_OSUBV_BIT -: - -579 -ºd_b™s - = -Ëngths -[ - `a¢_¿ndom_b‘w“n -( - -580 0, ( -Ëngths -) / (lengths[0]) - 1)]; - -581 if(! -cÚ¡¿šts - || !cÚ¡¿šts-> -³r_cÚ¡¿šts -) - -582 -cÚ¡¿šts - = & -td --> -’codšg_cÚ¡¿šts -; - -583 if( -cÚ¡¿šts --> -³r_cÚ¡¿šts -) { - -584 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -pc - = & -cÚ¡¿šts --> -³r_cÚ¡¿šts --> -size -; - -585 if( -pc --> -æags - & -APC_CONSTRAINED -) { - -586  -sugge¡ed_uµ”_bound - = -pc --> -uµ”_bound - < ( -ssize_t -) -max_Ëngth - - -587 ? -pc --> -uµ”_bound - - -588 : ( -ssize_t -) -max_Ëngth -; - -589 if( -max_Ëngth - < ( -size_t -) -pc --> -low”_bound -) { - -590  -»suÉ_sk³d -; - -592 if( -pc --> -æags - & -APC_EXTENSIBLE -) { - -593  - `a¢_¿ndom_b‘w“n -(0, 5)) { - -595 if( -pc --> -low”_bound - > 0) { - -596 -ºd_b™s - = -pc --> -low”_bound - - 1; - -601 -ºd_b™s - = -pc --> -uµ”_bound - + 1; - -605 if( -ºd_b™s - < -max_Ëngth -) { - -610 -ºd_b™s - = - `a¢_¿ndom_b‘w“n -( -pc --> -low”_bound -, - -611 -sugge¡ed_uµ”_bound -); - -614 -ºd_b™s - = - -615 - `a¢_¿ndom_b‘w“n -( -pc --> -low”_bound -, -sugge¡ed_uµ”_bound -); - -618 -ºd_b™s - = - `a¢_¿ndom_b‘w“n -(0, -max_Ëngth - - 1); - -620 } if( -ºd_b™s - >ð -max_Ëngth -) { - -621 -ºd_b™s - = - `a¢_¿ndom_b‘w“n -(0, -max_Ëngth - - 1); - -624 -ºd_Ën - = ( -ºd_b™s - + 7) / 8; - -625 -buf - = - `CALLOC -(1, -ºd_Ën - + 1); - -626 if(! -buf -è -»suÉ_çžed -; - -628 -b’d - = & -buf -[ -ºd_Ën -]; - -630  -b - = -buf -; b < -b’d -; b++) { - -631 *( -ušt8_t - *) -b - = - `a¢_¿ndom_b‘w“n -(0, 255); - -633 * -b - = 0; - -635 if(* -¥Œ -) { - -636 -¡ - = * -¥Œ -; - -637 - `FREEMEM -( -¡ --> -buf -); - -639 -¡ - = ( -BIT_STRING_t - *)(* -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -)); - -640 if(! -¡ -) { - -641 - `FREEMEM -( -buf -); - -642  -»suÉ_çžed -; - -646 -¡ --> -buf - = buf; - -647 -¡ --> -size - = -ºd_Ën -; - -648 -¡ --> -b™s_unu£d - = (8 - ( -ºd_b™s - & 0x7)) & 0x7; - -649 if( -¡ --> -b™s_unu£d -) { - -650 - `as£¹ -( -¡ --> -size - > 0); - -651 -¡ --> -buf -[¡-> -size --1] &ð0xfà<< st-> -b™s_unu£d -; - -654 -»suÉ_ok -. -Ëngth - = -¡ --> -size -; - -655  -»suÉ_ok -; - -656 - } -} - - @BOOLEAN.c - -5  - ~ - -6  - ~ - -7  - ~ - -12 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_BOOLEAN_gs -[] = { - -13 ( -ASN_TAG_CLASS_UNIVERSAL - | (1 << 2)) - -15 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_BOOLEAN - = { - -16 -BOOLEAN_ä“ -, - -17 -BOOLEAN_´št -, - -18 -BOOLEAN_com·» -, - -19 -BOOLEAN_decode_b” -, - -20 -BOOLEAN_’code_d” -, - -21 -BOOLEAN_decode_x” -, - -22 -BOOLEAN_’code_x” -, - -23 #ifdef -ASN_DISABLE_OER_SUPPORT - - -27 -BOOLEAN_decode_Ûr -, - -28 -BOOLEAN_’code_Ûr -, - -30 #ifdef -ASN_DISABLE_PER_SUPPORT - - -36 -BOOLEAN_decode_u³r -, - -37 -BOOLEAN_’code_u³r -, - -38 -BOOLEAN_decode_­” -, - -39 -BOOLEAN_’code_­” -, - -41 -BOOLEAN_¿ndom_fžl -, - -44 -a¢_TYPE_desütÜ_t - - ga¢_DEF_BOOLEAN - = { - -47 & -a¢_OP_BOOLEAN -, - -48 -a¢_DEF_BOOLEAN_gs -, - -49 ( -a¢_DEF_BOOLEAN_gs -) / (asn_DEF_BOOLEAN_tags[0]), - -50 -a¢_DEF_BOOLEAN_gs -, - -51 ( -a¢_DEF_BOOLEAN_gs -) / (asn_DEF_BOOLEAN_tags[0]), - -52 { 0, 0, -a¢_g’”ic_no_cÚ¡¿št - }, - -60 -a¢_dec_rv®_t - - -61 - $BOOLEAN_decode_b” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -62 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -boÞ_v®ue -, - -63 cÚ¡ * -buf_±r -, -size_t - -size -,  -g_mode -) { - -64 -BOOLEAN_t - * -¡ - = (BOOLEAN_ˆ*)* -boÞ_v®ue -; - -65 -a¢_dec_rv®_t - -rv® -; - -66 -b”_Žv_Ën_t - -Ëngth -; - -67 -b”_Žv_Ën_t - -lidx -; - -69 if( -¡ - =ð -NULL -) { - -70 -¡ - = ( -BOOLEAN_t - *)(* -boÞ_v®ue - = - `CALLOC -(1, (*st))); - -71 if( -¡ - =ð -NULL -) { - -72 -rv® -. -code - = -RC_FAIL -; - -73 -rv® -. -cÚsumed - = 0; - -74  -rv® -; - -78 - `ASN_DEBUG -("Decoding %s‡s BOOLEAN (tm=%d)", - -79 -td --> -Çme -, -g_mode -); - -84 -rv® - = - `b”_check_gs -( -Ýt_codec_ùx -, -td -, 0, -buf_±r -, -size -, - -85 -g_mode -, 0, & -Ëngth -, 0); - -86 if( -rv® -. -code - !ð -RC_OK -) - -87  -rv® -; - -89 - `ASN_DEBUG -("BoޗÀËngth i %d by‹s", () -Ëngth -); - -91 -buf_±r - = ((cÚ¡ *)buf_±rè+ -rv® -. -cÚsumed -; - -92 -size - -ð -rv® -. -cÚsumed -; - -93 if( -Ëngth - > ( -b”_Žv_Ën_t -) -size -) { - -94 -rv® -. -code - = -RC_WMORE -; - -95 -rv® -. -cÚsumed - = 0; - -96  -rv® -; - -102 * -¡ - = 0, -lidx - = 0; - -103 ( -lidx - < -Ëngth -è&& * -¡ - == 0;†idx++) { - -109 * -¡ - |ð((cÚ¡ -ušt8_t - *) -buf_±r -)[ -lidx -]; - -112 -rv® -. -code - = -RC_OK -; - -113 -rv® -. -cÚsumed - +ð -Ëngth -; - -115 - `ASN_DEBUG -("Took %ld/%ld bytesoƒncode %s, value=%d", - -116 () -rv® -. -cÚsumed -, () -Ëngth -, - -117 -td --> -Çme -, * -¡ -); - -119  -rv® -; - -120 - } -} - -122 -a¢_’c_rv®_t - - -123 - $BOOLEAN_’code_d” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -124  -g_mode -, -b”_Žv_g_t - -g -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -125 * -­p_key -) { - -126 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -127 cÚ¡ -BOOLEAN_t - * -¡ - = (cÚ¡ BOOLEAN_ˆ*) -¥Œ -; - -129 -”v® -. -’coded - = - `d”_wr™e_gs -( -td -, 1, -g_mode -, 0, -g -, -cb -, -­p_key -); - -130 if( -”v® -. -’coded - == -1) { - -131 -”v® -. -çžed_ty³ - = -td -; - -132 -”v® -. -¡ruùu»_±r - = -¥Œ -; - -133  -”v® -; - -136 if( -cb -) { - -137 -ušt8_t - -boÞ_v®ue -; - -139 -boÞ_v®ue - = * -¡ - ? 0xff : 0; - -141 if( - `cb -(& -boÞ_v®ue -, 1, -­p_key -) < 0) { - -142 -”v® -. -’coded - = -1; - -143 -”v® -. -çžed_ty³ - = -td -; - -144 -”v® -. -¡ruùu»_±r - = -¥Œ -; - -145  -”v® -; - -149 -”v® -. -’coded - += 1; - -151 - `ASN__ENCODED_OK -( -”v® -); - -152 - } -} - -158  -x”_pbd_rv® - - -159 - $BOOLEAN__x”_body_decode -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -160 cÚ¡ * -chunk_buf -, -size_t - -chunk_size -) { - -161 -BOOLEAN_t - * -¡ - = (BOOLEAN_ˆ*) -¥Œ -; - -162 cÚ¡ * -p - = (cÚ¡ *) -chunk_buf -; - -164 () -td -; - -166 if( -chunk_size - && -p -[0] == 0x3c ) { - -167  - `x”_check_g -( -chunk_buf -, -chunk_size -, "false")) { - -168  -XCT_BOTH -: - -170 * -¡ - = 0; - -172  -XCT_UNKNOWN_BO -: - -173 if( - `x”_check_g -( -chunk_buf -, -chunk_size -, "true") - -174 !ð -XCT_BOTH -) - -175  -XPBD_BROKEN_ENCODING -; - -177 * -¡ - = 1; - -180  -XPBD_BROKEN_ENCODING -; - -182  -XPBD_BODY_CONSUMED -; - -184  -XPBD_BROKEN_ENCODING -; - -186 - } -} - -189 -a¢_dec_rv®_t - - -190 - $BOOLEAN_decode_x” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -191 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -192 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, -size_t - -size -) { - -193  - `x”_decode_´im™ive -( -Ýt_codec_ùx -, -td -, - -194 -¥Œ -, ( -BOOLEAN_t -), -Ýt_mÇme -, -buf_±r -, -size -, - -195 -BOOLEAN__x”_body_decode -); - -196 - } -} - -198 -a¢_’c_rv®_t - - -199 - $BOOLEAN_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -200  -žev– -, -x”_’cod”_æags_e - -æags -, - -201 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -202 cÚ¡ -BOOLEAN_t - * -¡ - = (cÚ¡ BOOLEAN_ˆ*) -¥Œ -; - -203 -a¢_’c_rv®_t - -” - = {0, 0, 0}; - -205 () -žev– -; - -206 () -æags -; - -208 if(! -¡ -è -ASN__ENCODE_FAILED -; - -210 if(* -¡ -) { - -211 - `ASN__CALLBACK -("", 7); - -213 - `ASN__CALLBACK -("", 8); - -216 - `ASN__ENCODED_OK -( -” -); - -217 -cb_çžed -: - -218 -ASN__ENCODE_FAILED -; - -219 - } -} - -222 - $BOOLEAN_´št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -223 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -224 cÚ¡ -BOOLEAN_t - * -¡ - = (cÚ¡ BOOLEAN_ˆ*) -¥Œ -; - -225 cÚ¡ * -buf -; - -226 -size_t - -buæ’ -; - -228 () -td -; - -229 () -žev– -; - -231 if( -¡ -) { - -232 if(* -¡ -) { - -233 -buf - = "TRUE"; - -234 -buæ’ - = 4; - -236 -buf - = "FALSE"; - -237 -buæ’ - = 5; - -240 -buf - = ""; - -241 -buæ’ - = 8; - -244  ( - `cb -( -buf -, -buæ’ -, -­p_key -) < 0) ? -1 : 0; - -245 - } -} - -248 - $BOOLEAN_ä“ -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -±r -, - -249 -a¢_¡ruù_ä“_m‘hod - -m‘hod -) { - -250 if( -td - && -±r -) { - -251  -m‘hod -) { - -252  -ASFM_FREE_EVERYTHING -: - -253 - `FREEMEM -( -±r -); - -255  -ASFM_FREE_UNDERLYING -: - -257  -ASFM_FREE_UNDERLYING_AND_RESET -: - -258 - `mem£t -( -±r -, 0, ( -BOOLEAN_t -)); - -262 - } -} - -264 #iâdeà -ASN_DISABLE_PER_SUPPORT - - -266 -a¢_dec_rv®_t - - -267 - $BOOLEAN_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -268 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -269 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -270 -a¢_³r_d©a_t - * -pd -) { - -271 -a¢_dec_rv®_t - -rv -; - -272 -BOOLEAN_t - * -¡ - = (BOOLEAN_ˆ*)* -¥Œ -; - -274 () -Ýt_codec_ùx -; - -275 () -td -; - -276 () -cÚ¡¿šts -; - -278 if(! -¡ -) { - -279 -¡ - = ( -BOOLEAN_t - *)(* -¥Œ - = - `MALLOC -((*st))); - -280 if(! -¡ -è -ASN__DECODE_FAILED -; - -286  - `³r_g‘_ãw_b™s -( -pd -, 1)) { - -287 1: * -¡ - = 1; ; - -288 0: * -¡ - = 0; ; - -289 -1: : -ASN__DECODE_STARVED -; - -292 - `ASN_DEBUG -("% decoded‡ %s", -td --> -Çme -, * -¡ - ? "TRUE" : "FALSE"); - -294 -rv -. -code - = -RC_OK -; - -295 -rv -. -cÚsumed - = 1; - -296  -rv -; - -297 - } -} - -300 -a¢_’c_rv®_t - - -301 - $BOOLEAN_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -302 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -303 -a¢_³r_ou_t - * -po -) { - -304 cÚ¡ -BOOLEAN_t - * -¡ - = (cÚ¡ BOOLEAN_ˆ*) -¥Œ -; - -305 -a¢_’c_rv®_t - -” - = { 0, 0, 0 }; - -307 () -cÚ¡¿šts -; - -309 if(! -¡ -è -ASN__ENCODE_FAILED -; - -311 if( - `³r_put_ãw_b™s -( -po -, * -¡ - ? 1 : 0, 1)) - -312 -ASN__ENCODE_FAILED -; - -314 - `ASN__ENCODED_OK -( -” -); - -315 - } -} - -317 -a¢_dec_rv®_t - - -318 - $BOOLEAN_decode_­” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -319 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -320 -a¢_dec_rv®_t - -rv -; - -321 -BOOLEAN_t - * -¡ - = (BOOLEAN_ˆ*)* -¥Œ -; - -323 () -Ýt_codec_ùx -; - -324 () -cÚ¡¿šts -; - -325 () -td -; - -327 if(! -¡ -) { - -328 -¡ - = ( -BOOLEAN_t - *)(* -¥Œ - = - `MALLOC -((*st))); - -329 if(! -¡ -è -ASN__DECODE_FAILED -; - -335  - `³r_g‘_ãw_b™s -( -pd -, 1)) { - -337 * -¡ - = 1; - -340 * -¡ - = 0; - -344 -ASN__DECODE_STARVED -; - -347 - `ASN_DEBUG -("% decoded‡ %s", -td --> -Çme -, * -¡ - ? "TRUE" : "FALSE"); - -349 -rv -. -code - = -RC_OK -; - -350 -rv -. -cÚsumed - = 1; - -351  -rv -; - -352 - } -} - -354 -a¢_’c_rv®_t - - -355 - $BOOLEAN_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -356 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -357 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -358 cÚ¡ -BOOLEAN_t - * -¡ - = (cÚ¡ BOOLEAN_ˆ*) -¥Œ -; - -359 -a¢_’c_rv®_t - -” - = { 0, 0, 0 }; - -361 () -cÚ¡¿šts -; - -363 if(! -¡ -è -ASN__ENCODE_FAILED -; - -365 if( - `³r_put_ãw_b™s -( -po -, * -¡ - ? 1 : 0, 1)) - -366 -ASN__ENCODE_FAILED -; - -368 - `ASN__ENCODED_OK -( -” -); - -369 - } -} - -373 #iâdeà -ASN_DISABLE_OER_SUPPORT - - -378 -a¢_’c_rv®_t - - -379 - $BOOLEAN_’code_Ûr -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -380 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -381 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -382 -a¢_’c_rv®_t - -” - = { 1, 0, 0 }; - -383 cÚ¡ -BOOLEAN_t - * -¡ - = -¥Œ -; - -384 -ušt8_t - -boÞ_v®ue - = * -¡ - ? 0xff : 0; - -386 () -td -; - -387 () -cÚ¡¿šts -; - -389 if( - `cb -(& -boÞ_v®ue -, 1, -­p_key -) < 0) { - -390 -ASN__ENCODE_FAILED -; - -392 - `ASN__ENCODED_OK -( -” -); - -394 - } -} - -396 -a¢_dec_rv®_t - - -397 - $BOOLEAN_decode_Ûr -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -398 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -399 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -400 cÚ¡ * -±r -, -size_t - -size -) { - -401 -a¢_dec_rv®_t - -ok - = { -RC_OK -, 1}; - -402 -BOOLEAN_t - * -¡ -; - -404 () -Ýt_codec_ùx -; - -405 () -td -; - -406 () -cÚ¡¿šts -; - -408 if( -size - < 1) { - -409 -ASN__DECODE_STARVED -; - -412 if(!( -¡ - = * -¥Œ -)) { - -413 -¡ - = ( -BOOLEAN_t - *)(* -¥Œ - = - `CALLOC -(1, (*st))); - -414 if(! -¡ -è -ASN__DECODE_FAILED -; - -417 * -¡ - = *(cÚ¡ -ušt8_t - *) -±r -; - -419  -ok -; - -420 - } -} - -427 - $BOOLEAN_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -­Œ -, - -428 cÚ¡ * -b±r -) { - -429 cÚ¡ -BOOLEAN_t - * -a - = -­Œ -; - -430 cÚ¡ -BOOLEAN_t - * -b - = -b±r -; - -432 () -td -; - -434 if( -a - && -b -) { - -435 if(!* -a - =ð!* -b -) { - -437 } if(!* -a -) { - -442 } if(! -a -) { - -447 - } -} - -449 -a¢_¿ndom_fžl_»suÉ_t - - -450 - $BOOLEAN_¿ndom_fžl -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -451 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -452 -size_t - -max_Ëngth -) { - -453 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_ok - = { -ARFILL_OK -, 1}; - -454 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_çžed - = { -ARFILL_FAILED -, 0}; - -455 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_sk³d - = { -ARFILL_SKIPPED -, 0}; - -456 -BOOLEAN_t - * -¡ - = * -¥Œ -; - -458 if( -max_Ëngth - =ð0è -»suÉ_sk³d -; - -460 if( -¡ - =ð -NULL -) { - -461 -¡ - = ( -BOOLEAN_t - *)(* -¥Œ - = - `CALLOC -(1, (*st))); - -462 if( -¡ - =ð -NULL -) { - -463  -»suÉ_çžed -; - -467 if(! -cÚ¡¿šts - || !cÚ¡¿šts-> -³r_cÚ¡¿šts -) - -468 -cÚ¡¿šts - = & -td --> -’codšg_cÚ¡¿šts -; - -469 if( -cÚ¡¿šts --> -³r_cÚ¡¿šts -) { - -470 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -pc - = & -cÚ¡¿šts --> -³r_cÚ¡¿šts --> -v®ue -; - -471 if( -pc --> -æags - & -APC_CONSTRAINED -) { - -472 * -¡ - = - `a¢_¿ndom_b‘w“n -( -pc --> -low”_bound -,…c-> -uµ”_bound -); - -473  -»suÉ_ok -; - -478  - `a¢_¿ndom_b‘w“n -(0, 7)) { - -482 * -¡ - = 0; ; - -483 3: * -¡ - = -1; ; - -484 4: * -¡ - = 1; ; - -485 5: * -¡ - = -INT_MIN -; ; - -486 6: * -¡ - = -INT_MAX -; ; - -488 * -¡ - = - `a¢_¿ndom_b‘w“n -( -INT_MIN -, -INT_MAX -); - -491  -»suÉ_ok -; - -492 - } -} - - @CGI.c - -8  - ~"CGI.h -" - -10  - ~"NR-CGI.h -" - -11  - ~"EUTRA-CGI.h -" - -12 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_CGI_cÚ¡r_1 - - gCC_NOTUSED - = { - -13 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -14 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -17 -a¢_TYPE_memb”_t - - ga¢_MBR_CGI_1 -[] = { - -18 { -ATF_POINTER -, 0, -off£tof -( -CGI -, -choiû -. -nR_CGI -), - -19 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -21 & -a¢_DEF_NR_CGI -, - -27 { -ATF_POINTER -, 0, -off£tof -( -CGI -, -choiû -. -eUTRA_CGI -), - -28 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -30 & -a¢_DEF_EUTRA_CGI -, - -37 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_CGI_g2–_1 -[] = { - -38 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -39 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -41 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_CGI_¥ecs_1 - = { - -42 ( -CGI -), - -43 -off£tof -( -CGI -, -_a¢_ùx -), - -44 -off£tof -( -CGI -, -´e£Á -), - -45 ((( -CGI - *)0)-> -´e£Á -), - -46 -a¢_MAP_CGI_g2–_1 -, - -51 -a¢_TYPE_desütÜ_t - - ga¢_DEF_CGI - = { - -54 & -a¢_OP_CHOICE -, - -59 { 0, & -a¢_PER_ty³_CGI_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -60 -a¢_MBR_CGI_1 -, - -62 & -a¢_SPC_CGI_¥ecs_1 - - - @CoreCPID.c - -8  - ~"CÜeCPID.h -" - -10  - ~"GUAMI.h -" - -11  - ~"GUMMEI.h -" - -12  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_CÜeCPID_cÚ¡r_1 - - gCC_NOTUSED - = { - -13 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -14 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -17  -a¢_TYPE_memb”_t - - ga¢_MBR_CÜeCPID_1 -[] = { - -18 { -ATF_POINTER -, 0, -off£tof -( -CÜeCPID -, -choiû -. -fiveGC -), - -19 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -21 & -a¢_DEF_GUAMI -, - -27 { -ATF_POINTER -, 0, -off£tof -( -CÜeCPID -, -choiû -. -ePC -), - -28 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -30 & -a¢_DEF_GUMMEI -, - -37 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_CÜeCPID_g2–_1 -[] = { - -38 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -39 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -41  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_CÜeCPID_¥ecs_1 - = { - -42 ( -CÜeCPID -), - -43 -off£tof -( -CÜeCPID -, -_a¢_ùx -), - -44 -off£tof -( -CÜeCPID -, -´e£Á -), - -45 ((( -CÜeCPID - *)0)-> -´e£Á -), - -46 -a¢_MAP_CÜeCPID_g2–_1 -, - -51 -a¢_TYPE_desütÜ_t - - ga¢_DEF_CÜeCPID - = { - -54 & -a¢_OP_CHOICE -, - -59 { 0, & -a¢_PER_ty³_CÜeCPID_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -60 -a¢_MBR_CÜeCPID_1 -, - -62 & -a¢_SPC_CÜeCPID_¥ecs_1 - - - @E-UTRA-ARFCN.c - -8  - ~"E-UTRA-ARFCN.h -" - -11 - $E_UTRA_ARFCN_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 0 && value <= 65535)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_E_UTRA_ARFCN_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED -, 16, 16, 0, 65535 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E_UTRA_ARFCN_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E_UTRA_ARFCN - = { - -50 & -a¢_OP_N©iveIÁeg” -, - -51 -a¢_DEF_E_UTRA_ARFCN_gs_1 -, - -52 ( -a¢_DEF_E_UTRA_ARFCN_gs_1 -) - -53 /( -a¢_DEF_E_UTRA_ARFCN_gs_1 -[0]), - -54 -a¢_DEF_E_UTRA_ARFCN_gs_1 -, - -55 ( -a¢_DEF_E_UTRA_ARFCN_gs_1 -) - -56 /( -a¢_DEF_E_UTRA_ARFCN_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_E_UTRA_ARFCN_cÚ¡r_1 -, -E_UTRA_ARFCN_cÚ¡¿št - }, - - @E-UTRA-PCI.c - -8  - ~"E-UTRA-PCI.h -" - -11 - $E_UTRA_PCI_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 0 && value <= 503)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_E_UTRA_PCI_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 9, 9, 0, 503 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E_UTRA_PCI_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E_UTRA_PCI - = { - -50 & -a¢_OP_N©iveIÁeg” -, - -51 -a¢_DEF_E_UTRA_PCI_gs_1 -, - -52 ( -a¢_DEF_E_UTRA_PCI_gs_1 -) - -53 /( -a¢_DEF_E_UTRA_PCI_gs_1 -[0]), - -54 -a¢_DEF_E_UTRA_PCI_gs_1 -, - -55 ( -a¢_DEF_E_UTRA_PCI_gs_1 -) - -56 /( -a¢_DEF_E_UTRA_PCI_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_E_UTRA_PCI_cÚ¡r_1 -, -E_UTRA_PCI_cÚ¡¿št - }, - - @E-UTRA-TAC.c - -8  - ~"E-UTRA-TAC.h -" - -11 - $E_UTRA_TAC_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 -size - = -¡ -->size; - -25 if(( -size - == 2)) { - -29 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -31 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -34 - } -} - -40  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_E_UTRA_TAC_cÚ¡r_1 - - gCC_NOTUSED - = { - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -42 { -APC_CONSTRAINED -, 0, 0, 2, 2 } , - -45 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E_UTRA_TAC_gs_1 -[] = { - -46 ( -ASN_TAG_CLASS_UNIVERSAL - | (4 << 2)) - -48 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E_UTRA_TAC - = { - -51 & -a¢_OP_OCTET_STRING -, - -52 -a¢_DEF_E_UTRA_TAC_gs_1 -, - -53 ( -a¢_DEF_E_UTRA_TAC_gs_1 -) - -54 /( -a¢_DEF_E_UTRA_TAC_gs_1 -[0]), - -55 -a¢_DEF_E_UTRA_TAC_gs_1 -, - -56 ( -a¢_DEF_E_UTRA_TAC_gs_1 -) - -57 /( -a¢_DEF_E_UTRA_TAC_gs_1 -[0]), - -58 { 0, & -a¢_PER_ty³_E_UTRA_TAC_cÚ¡r_1 -, -E_UTRA_TAC_cÚ¡¿št - }, - -60 & -a¢_SPC_OCTET_STRING_¥ecs - - - @E2SM-KPM-ActionDefinition-Format1.c - -8  - ~"E2SM-KPM-AùiÚDefš™iÚ-FÜm©1.h -" - -10  - ~"CGI.h -" - -11 -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_1 -[] = { - -12 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©1 -, -m—sInfoLi¡ -), - -13 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -15 & -a¢_DEF_M—su»m’tInfoLi¡ -, - -21 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©1 -, -g¿nulP”iod -), - -22 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -24 & -a¢_DEF_G¿nuÏr™yP”iod -, - -30 { -ATF_POINTER -, 1, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©1 -, -ûÎGlob®ID -), - -31 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -33 & -a¢_DEF_CGI -, - -40 cÚ¡  - ga¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_oms_1 -[] = { 2 }; - -41 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_gs_1 -[] = { - -42 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -44 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_g2–_1 -[] = { - -45 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -46 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -47 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -49 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_¥ecs_1 - = { - -50 ( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©1 -), - -51 -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©1 -, -_a¢_ùx -), - -52 -a¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_g2–_1 -, - -54 -a¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_oms_1 -, - -58 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1 - = { - -61 & -a¢_OP_SEQUENCE -, - -62 -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_gs_1 -, - -63 ( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_gs_1 -) - -64 /( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_gs_1 -[0]), - -65 -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_gs_1 -, - -66 ( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_gs_1 -) - -67 /( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_gs_1 -[0]), - -68 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -69 -a¢_MBR_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_1 -, - -71 & -a¢_SPC_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1_¥ecs_1 - - - @E2SM-KPM-ActionDefinition-Format2.c - -8  - ~"E2SM-KPM-AùiÚDefš™iÚ-FÜm©2.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©2 -, -ueID -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_UEID -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©2 -, -subsütInfo -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1 -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_¥ecs_1 - = { - -38 ( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©2 -), - -39 -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©2 -, -_a¢_ùx -), - -40 -a¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2 - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_gs_1 -, - -50 ( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_gs_1 -) - -51 /( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_gs_1 -[0]), - -52 -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_gs_1 -, - -53 ( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_gs_1 -) - -54 /( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_1 -, - -58 & -a¢_SPC_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2_¥ecs_1 - - - @E2SM-KPM-ActionDefinition-Format3.c - -8  - ~"E2SM-KPM-AùiÚDefš™iÚ-FÜm©3.h -" - -10  - ~"CGI.h -" - -11 -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_1 -[] = { - -12 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©3 -, -m—sCÚdLi¡ -), - -13 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -15 & -a¢_DEF_M—su»m’tCÚdLi¡ -, - -21 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©3 -, -g¿nulP”iod -), - -22 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -24 & -a¢_DEF_G¿nuÏr™yP”iod -, - -30 { -ATF_POINTER -, 1, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©3 -, -ûÎGlob®ID -), - -31 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -33 & -a¢_DEF_CGI -, - -40 cÚ¡  - ga¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_oms_1 -[] = { 2 }; - -41 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_gs_1 -[] = { - -42 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -44 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_g2–_1 -[] = { - -45 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -46 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -47 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -49 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_¥ecs_1 - = { - -50 ( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©3 -), - -51 -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ_FÜm©3 -, -_a¢_ùx -), - -52 -a¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_g2–_1 -, - -54 -a¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_oms_1 -, - -58 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3 - = { - -61 & -a¢_OP_SEQUENCE -, - -62 -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_gs_1 -, - -63 ( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_gs_1 -) - -64 /( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_gs_1 -[0]), - -65 -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_gs_1 -, - -66 ( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_gs_1 -) - -67 /( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_gs_1 -[0]), - -68 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -69 -a¢_MBR_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_1 -, - -71 & -a¢_SPC_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3_¥ecs_1 - - - @E2SM-KPM-ActionDefinition.c - -8  - ~"E2SM-KPM-AùiÚDefš™iÚ.h -" - -10  - ~"E2SM-KPM-AùiÚDefš™iÚ-FÜm©1.h -" - -11  - ~"E2SM-KPM-AùiÚDefš™iÚ-FÜm©2.h -" - -12  - ~"E2SM-KPM-AùiÚDefš™iÚ-FÜm©3.h -" - -13  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_aùiÚDefš™iÚ_fÜm©s_cÚ¡r_3 - - gCC_NOTUSED - = { - -14 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 2, 2, 0, 2 } , - -15 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -18  -a¢_TYPE_memb”_t - - ga¢_MBR_aùiÚDefš™iÚ_fÜm©s_3 -[] = { - -19 { -ATF_POINTER -, 0, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ__aùiÚDefš™iÚ_fÜm©s -, -choiû -. -aùiÚDefš™iÚ_FÜm©1 -), - -20 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -22 & -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©1 -, - -28 { -ATF_POINTER -, 0, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ__aùiÚDefš™iÚ_fÜm©s -, -choiû -. -aùiÚDefš™iÚ_FÜm©2 -), - -29 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -31 & -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©2 -, - -37 { -ATF_POINTER -, 0, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ__aùiÚDefš™iÚ_fÜm©s -, -choiû -. -aùiÚDefš™iÚ_FÜm©3 -), - -38 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -40 & -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_FÜm©3 -, - -47 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_aùiÚDefš™iÚ_fÜm©s_g2–_3 -[] = { - -48 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -49 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -50 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -52  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_aùiÚDefš™iÚ_fÜm©s_¥ecs_3 - = { - -53 ( -E2SM_KPM_AùiÚDefš™iÚ__aùiÚDefš™iÚ_fÜm©s -), - -54 -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ__aùiÚDefš™iÚ_fÜm©s -, -_a¢_ùx -), - -55 -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ__aùiÚDefš™iÚ_fÜm©s -, -´e£Á -), - -56 ((( -E2SM_KPM_AùiÚDefš™iÚ__aùiÚDefš™iÚ_fÜm©s - *)0)-> -´e£Á -), - -57 -a¢_MAP_aùiÚDefš™iÚ_fÜm©s_g2–_3 -, - -63 -a¢_TYPE_desütÜ_t - - ga¢_DEF_aùiÚDefš™iÚ_fÜm©s_3 - = { - -66 & -a¢_OP_CHOICE -, - -71 { 0, & -a¢_PER_ty³_aùiÚDefš™iÚ_fÜm©s_cÚ¡r_3 -, -CHOICE_cÚ¡¿št - }, - -72 -a¢_MBR_aùiÚDefš™iÚ_fÜm©s_3 -, - -74 & -a¢_SPC_aùiÚDefš™iÚ_fÜm©s_¥ecs_3 - - -77  -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_AùiÚDefš™iÚ_1 -[] = { - -78 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ -, -ric_StyË_Ty³ -), - -79 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -81 & -a¢_DEF_RIC_StyË_Ty³ -, - -87 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ -, -aùiÚDefš™iÚ_fÜm©s -), - -88 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -90 & -a¢_DEF_aùiÚDefš™iÚ_fÜm©s_3 -, - -97 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_gs_1 -[] = { - -98 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -100 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_g2–_1 -[] = { - -101 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -102 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -104  -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_AùiÚDefš™iÚ_¥ecs_1 - = { - -105 ( -E2SM_KPM_AùiÚDefš™iÚ -), - -106 -off£tof -( -E2SM_KPM_AùiÚDefš™iÚ -, -_a¢_ùx -), - -107 -a¢_MAP_E2SM_KPM_AùiÚDefš™iÚ_g2–_1 -, - -112 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_AùiÚDefš™iÚ - = { - -115 & -a¢_OP_SEQUENCE -, - -116 -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_gs_1 -, - -117 ( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_gs_1 -) - -118 /( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_gs_1 -[0]), - -119 -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_gs_1 -, - -120 ( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_gs_1 -) - -121 /( -a¢_DEF_E2SM_KPM_AùiÚDefš™iÚ_gs_1 -[0]), - -122 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -123 -a¢_MBR_E2SM_KPM_AùiÚDefš™iÚ_1 -, - -125 & -a¢_SPC_E2SM_KPM_AùiÚDefš™iÚ_¥ecs_1 - - - @E2SM-KPM-EventTriggerDefinition-Format1.c - -8  - ~"E2SM-KPM-Ev’tTrigg”Defš™iÚ-FÜm©1.h -" - -11 - $»pÜtšgP”iod_2_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 1 && value <= 4294967295)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -40 - $memb_»pÜtšgP”iod_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -41 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -42  -v®ue -; - -44 if(! -¥Œ -) { - -45 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -47 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -51 -v®ue - = *(cÚ¡ *) -¥Œ -; - -53 if(( -v®ue - >= 1 && value <= 4294967295)) { - -57 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -59 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -62 - } -} - -64  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_»pÜtšgP”iod_cÚ¡r_2 - - gCC_NOTUSED - = { - -65 { -APC_CONSTRAINED -, 32, -1, 1, 4294967295 } , - -66 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -69  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_»pÜtšgP”iod_cÚ¡r_2 - - gCC_NOTUSED - = { - -70 { -APC_CONSTRAINED -, 32, -1, 1, 4294967295 } , - -71 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -74 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_»pÜtšgP”iod_¥ecs_2 - = { - -79 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_»pÜtšgP”iod_gs_2 -[] = { - -80 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -81 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -84 -a¢_TYPE_desütÜ_t - - ga¢_DEF_»pÜtšgP”iod_2 - = { - -87 & -a¢_OP_N©iveIÁeg” -, - -88 -a¢_DEF_»pÜtšgP”iod_gs_2 -, - -89 ( -a¢_DEF_»pÜtšgP”iod_gs_2 -) - -90 /( -a¢_DEF_»pÜtšgP”iod_gs_2 -[0]) - 1, - -91 -a¢_DEF_»pÜtšgP”iod_gs_2 -, - -92 ( -a¢_DEF_»pÜtšgP”iod_gs_2 -) - -93 /( -a¢_DEF_»pÜtšgP”iod_gs_2 -[0]), - -94 { 0, & -a¢_PER_ty³_»pÜtšgP”iod_cÚ¡r_2 -, -»pÜtšgP”iod_2_cÚ¡¿št - }, - -96 & -a¢_SPC_»pÜtšgP”iod_¥ecs_2 - - -99 -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_1 -[] = { - -100 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1 -, -»pÜtšgP”iod -), - -101 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -103 & -a¢_DEF_»pÜtšgP”iod_2 -, - -105 { 0, & -a¢_PER_memb_»pÜtšgP”iod_cÚ¡r_2 -, -memb_»pÜtšgP”iod_cÚ¡¿št_1 - }, - -110 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_gs_1 -[] = { - -111 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -113 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_g2–_1 -[] = { - -114 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -116 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_¥ecs_1 - = { - -117 ( -E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1 -), - -118 -off£tof -( -E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1 -, -_a¢_ùx -), - -119 -a¢_MAP_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_g2–_1 -, - -124 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1 - = { - -127 & -a¢_OP_SEQUENCE -, - -128 -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_gs_1 -, - -129 ( -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_gs_1 -) - -130 /( -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_gs_1 -[0]), - -131 -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_gs_1 -, - -132 ( -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_gs_1 -) - -133 /( -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_gs_1 -[0]), - -134 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -135 -a¢_MBR_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_1 -, - -137 & -a¢_SPC_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1_¥ecs_1 - - - @E2SM-KPM-EventTriggerDefinition.c - -8  - ~"E2SM-KPM-Ev’tTrigg”Defš™iÚ.h -" - -10  - ~"E2SM-KPM-Ev’tTrigg”Defš™iÚ-FÜm©1.h -" - -11  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_ev’tDefš™iÚ_fÜm©s_cÚ¡r_2 - - gCC_NOTUSED - = { - -12 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -13 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -16  -a¢_TYPE_memb”_t - - ga¢_MBR_ev’tDefš™iÚ_fÜm©s_2 -[] = { - -17 { -ATF_POINTER -, 0, -off£tof -( -E2SM_KPM_Ev’tTrigg”Defš™iÚ__ev’tDefš™iÚ_fÜm©s -, -choiû -. -ev’tDefš™iÚ_FÜm©1 -), - -18 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -20 & -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_FÜm©1 -, - -27 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_ev’tDefš™iÚ_fÜm©s_g2–_2 -[] = { - -28 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -30  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_ev’tDefš™iÚ_fÜm©s_¥ecs_2 - = { - -31 ( -E2SM_KPM_Ev’tTrigg”Defš™iÚ__ev’tDefš™iÚ_fÜm©s -), - -32 -off£tof -( -E2SM_KPM_Ev’tTrigg”Defš™iÚ__ev’tDefš™iÚ_fÜm©s -, -_a¢_ùx -), - -33 -off£tof -( -E2SM_KPM_Ev’tTrigg”Defš™iÚ__ev’tDefš™iÚ_fÜm©s -, -´e£Á -), - -34 ((( -E2SM_KPM_Ev’tTrigg”Defš™iÚ__ev’tDefš™iÚ_fÜm©s - *)0)-> -´e£Á -), - -35 -a¢_MAP_ev’tDefš™iÚ_fÜm©s_g2–_2 -, - -41 -a¢_TYPE_desütÜ_t - - ga¢_DEF_ev’tDefš™iÚ_fÜm©s_2 - = { - -44 & -a¢_OP_CHOICE -, - -49 { 0, & -a¢_PER_ty³_ev’tDefš™iÚ_fÜm©s_cÚ¡r_2 -, -CHOICE_cÚ¡¿št - }, - -50 -a¢_MBR_ev’tDefš™iÚ_fÜm©s_2 -, - -52 & -a¢_SPC_ev’tDefš™iÚ_fÜm©s_¥ecs_2 - - -55  -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_Ev’tTrigg”Defš™iÚ_1 -[] = { - -56 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_Ev’tTrigg”Defš™iÚ -, -ev’tDefš™iÚ_fÜm©s -), - -57 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -59 & -a¢_DEF_ev’tDefš™iÚ_fÜm©s_2 -, - -66 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_gs_1 -[] = { - -67 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -69 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_Ev’tTrigg”Defš™iÚ_g2–_1 -[] = { - -70 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -72  -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_Ev’tTrigg”Defš™iÚ_¥ecs_1 - = { - -73 ( -E2SM_KPM_Ev’tTrigg”Defš™iÚ -), - -74 -off£tof -( -E2SM_KPM_Ev’tTrigg”Defš™iÚ -, -_a¢_ùx -), - -75 -a¢_MAP_E2SM_KPM_Ev’tTrigg”Defš™iÚ_g2–_1 -, - -80 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ - = { - -83 & -a¢_OP_SEQUENCE -, - -84 -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_gs_1 -, - -85 ( -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_gs_1 -) - -86 /( -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_gs_1 -[0]), - -87 -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_gs_1 -, - -88 ( -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_gs_1 -) - -89 /( -a¢_DEF_E2SM_KPM_Ev’tTrigg”Defš™iÚ_gs_1 -[0]), - -90 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -91 -a¢_MBR_E2SM_KPM_Ev’tTrigg”Defš™iÚ_1 -, - -93 & -a¢_SPC_E2SM_KPM_Ev’tTrigg”Defš™iÚ_¥ecs_1 - - - @E2SM-KPM-IndicationHeader-Format1.c - -8  - ~"E2SM-KPM-IndiÿtiÚH—d”-FÜm©1.h -" - -10 cÚ¡  - g³rm™‹d_®phab‘_bË_3 -[256] = { - -20 cÚ¡  - g³rm™‹d_®phab‘_code2v®ue_3 -[74] = { - -28  - $check_³rm™‹d_®phab‘_3 -(cÚ¡ * -¥Œ -) { - -29 cÚ¡ * -bË - = -³rm™‹d_®phab‘_bË_3 -; - -31 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -32 cÚ¡ -ušt8_t - * -ch - = -¡ --> -buf -; - -33 cÚ¡ -ušt8_t - * -’d - = -ch - + -¡ --> -size -; - -35 ; -ch - < -’d -; ch++) { - -36 -ušt8_t - -cv - = * -ch -; - -37 if(! -bË -[ -cv -])  -1; - -40 - } -} - -42 cÚ¡  - g³rm™‹d_®phab‘_bË_4 -[256] = { - -52 cÚ¡  - g³rm™‹d_®phab‘_code2v®ue_4 -[74] = { - -60  - $check_³rm™‹d_®phab‘_4 -(cÚ¡ * -¥Œ -) { - -61 cÚ¡ * -bË - = -³rm™‹d_®phab‘_bË_4 -; - -63 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -64 cÚ¡ -ušt8_t - * -ch - = -¡ --> -buf -; - -65 cÚ¡ -ušt8_t - * -’d - = -ch - + -¡ --> -size -; - -67 ; -ch - < -’d -; ch++) { - -68 -ušt8_t - -cv - = * -ch -; - -69 if(! -bË -[ -cv -])  -1; - -72 - } -} - -74 cÚ¡  - g³rm™‹d_®phab‘_bË_5 -[256] = { - -84 cÚ¡  - g³rm™‹d_®phab‘_code2v®ue_5 -[74] = { - -92  - $check_³rm™‹d_®phab‘_5 -(cÚ¡ * -¥Œ -) { - -93 cÚ¡ * -bË - = -³rm™‹d_®phab‘_bË_5 -; - -95 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -96 cÚ¡ -ušt8_t - * -ch - = -¡ --> -buf -; - -97 cÚ¡ -ušt8_t - * -’d - = -ch - + -¡ --> -size -; - -99 ; -ch - < -’d -; ch++) { - -100 -ušt8_t - -cv - = * -ch -; - -101 if(! -bË -[ -cv -])  -1; - -104 - } -} - -106 cÚ¡  - g³rm™‹d_®phab‘_bË_6 -[256] = { - -116 cÚ¡  - g³rm™‹d_®phab‘_code2v®ue_6 -[74] = { - -124  - $check_³rm™‹d_®phab‘_6 -(cÚ¡ * -¥Œ -) { - -125 cÚ¡ * -bË - = -³rm™‹d_®phab‘_bË_6 -; - -127 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -128 cÚ¡ -ušt8_t - * -ch - = -¡ --> -buf -; - -129 cÚ¡ -ušt8_t - * -’d - = -ch - + -¡ --> -size -; - -131 ; -ch - < -’d -; ch++) { - -132 -ušt8_t - -cv - = * -ch -; - -133 if(! -bË -[ -cv -])  -1; - -136 - } -} - -139 - $memb_fžeFÜm©v”siÚ_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -140 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -141 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -142 -size_t - -size -; - -144 if(! -¥Œ -) { - -145 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -147 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -151 -size - = -¡ -->size; - -153 if(( -size - <= 15) - -154 && ! - `check_³rm™‹d_®phab‘_3 -( -¡ -)) { - -158 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -160 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -163 - } -} - -165  - $a¢_PER_MAP_fžeFÜm©v”siÚ_3_v2c -( -v®ue -) { - -166 if( -v®ue - >ð( -³rm™‹d_®phab‘_bË_3 -)/(permitted_alphabet_table_3[0])) - -168  -³rm™‹d_®phab‘_bË_3 -[ -v®ue -] - 1; - -169 - } -} - -170  - $a¢_PER_MAP_fžeFÜm©v”siÚ_3_c2v -( -code -) { - -171 if( -code - >ð( -³rm™‹d_®phab‘_code2v®ue_3 -)/(permitted_alphabet_code2value_3[0])) - -173  -³rm™‹d_®phab‘_code2v®ue_3 -[ -code -]; - -174 - } -} - -176 - $memb_£nd”Name_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -177 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -178 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -179 -size_t - -size -; - -181 if(! -¥Œ -) { - -182 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -184 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -188 -size - = -¡ -->size; - -190 if(( -size - <= 400) - -191 && ! - `check_³rm™‹d_®phab‘_4 -( -¡ -)) { - -195 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -197 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -200 - } -} - -202  - $a¢_PER_MAP_£nd”Name_4_v2c -( -v®ue -) { - -203 if( -v®ue - >ð( -³rm™‹d_®phab‘_bË_4 -)/(permitted_alphabet_table_4[0])) - -205  -³rm™‹d_®phab‘_bË_4 -[ -v®ue -] - 1; - -206 - } -} - -207  - $a¢_PER_MAP_£nd”Name_4_c2v -( -code -) { - -208 if( -code - >ð( -³rm™‹d_®phab‘_code2v®ue_4 -)/(permitted_alphabet_code2value_4[0])) - -210  -³rm™‹d_®phab‘_code2v®ue_4 -[ -code -]; - -211 - } -} - -213 - $memb_£nd”Ty³_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -214 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -215 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -216 -size_t - -size -; - -218 if(! -¥Œ -) { - -219 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -221 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -225 -size - = -¡ -->size; - -227 if(( -size - <= 8) - -228 && ! - `check_³rm™‹d_®phab‘_5 -( -¡ -)) { - -232 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -234 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -237 - } -} - -239  - $a¢_PER_MAP_£nd”Ty³_5_v2c -( -v®ue -) { - -240 if( -v®ue - >ð( -³rm™‹d_®phab‘_bË_5 -)/(permitted_alphabet_table_5[0])) - -242  -³rm™‹d_®phab‘_bË_5 -[ -v®ue -] - 1; - -243 - } -} - -244  - $a¢_PER_MAP_£nd”Ty³_5_c2v -( -code -) { - -245 if( -code - >ð( -³rm™‹d_®phab‘_code2v®ue_5 -)/(permitted_alphabet_code2value_5[0])) - -247  -³rm™‹d_®phab‘_code2v®ue_5 -[ -code -]; - -248 - } -} - -250 - $memb_v’dÜName_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -251 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -252 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -253 -size_t - -size -; - -255 if(! -¥Œ -) { - -256 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -258 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -262 -size - = -¡ -->size; - -264 if(( -size - <= 32) - -265 && ! - `check_³rm™‹d_®phab‘_6 -( -¡ -)) { - -269 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -271 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -274 - } -} - -276  - $a¢_PER_MAP_v’dÜName_6_v2c -( -v®ue -) { - -277 if( -v®ue - >ð( -³rm™‹d_®phab‘_bË_6 -)/(permitted_alphabet_table_6[0])) - -279  -³rm™‹d_®phab‘_bË_6 -[ -v®ue -] - 1; - -280 - } -} - -281  - $a¢_PER_MAP_v’dÜName_6_c2v -( -code -) { - -282 if( -code - >ð( -³rm™‹d_®phab‘_code2v®ue_6 -)/(permitted_alphabet_code2value_6[0])) - -284  -³rm™‹d_®phab‘_code2v®ue_6 -[ -code -]; - -285 - } -} - -286  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_fžeFÜm©v”siÚ_cÚ¡r_3 - - gCC_NOTUSED - = { - -287 { -APC_CONSTRAINED -, 7, 7, 32, 122 } , - -288 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 4, 4, 0, 15 } , - -289 -a¢_PER_MAP_fžeFÜm©v”siÚ_3_v2c -, - -290 -a¢_PER_MAP_fžeFÜm©v”siÚ_3_c2v - - -292  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_£nd”Name_cÚ¡r_4 - - gCC_NOTUSED - = { - -293 { -APC_CONSTRAINED -, 7, 7, 32, 122 } , - -294 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 9, 9, 0, 400 } , - -295 -a¢_PER_MAP_£nd”Name_4_v2c -, - -296 -a¢_PER_MAP_£nd”Name_4_c2v - - -298  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_£nd”Ty³_cÚ¡r_5 - - gCC_NOTUSED - = { - -299 { -APC_CONSTRAINED -, 7, 7, 32, 122 } , - -300 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 4, 4, 0, 8 } , - -301 -a¢_PER_MAP_£nd”Ty³_5_v2c -, - -302 -a¢_PER_MAP_£nd”Ty³_5_c2v - - -304  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_v’dÜName_cÚ¡r_6 - - gCC_NOTUSED - = { - -305 { -APC_CONSTRAINED -, 7, 7, 32, 122 } , - -306 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 6, 6, 0, 32 } , - -307 -a¢_PER_MAP_v’dÜName_6_v2c -, - -308 -a¢_PER_MAP_v’dÜName_6_c2v - - -310 -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_1 -[] = { - -311 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_IndiÿtiÚH—d”_FÜm©1 -, -cÞËtS¹Time -), - -312 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -314 & -a¢_DEF_TimeSmp -, - -320 { -ATF_POINTER -, 4, -off£tof -( -E2SM_KPM_IndiÿtiÚH—d”_FÜm©1 -, -fžeFÜm©v”siÚ -), - -321 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -323 & -a¢_DEF_PršbËSŒšg -, - -325 { 0, & -a¢_PER_memb_fžeFÜm©v”siÚ_cÚ¡r_3 -, -memb_fžeFÜm©v”siÚ_cÚ¡¿št_1 - }, - -329 { -ATF_POINTER -, 3, -off£tof -( -E2SM_KPM_IndiÿtiÚH—d”_FÜm©1 -, -£nd”Name -), - -330 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -332 & -a¢_DEF_PršbËSŒšg -, - -334 { 0, & -a¢_PER_memb_£nd”Name_cÚ¡r_4 -, -memb_£nd”Name_cÚ¡¿št_1 - }, - -338 { -ATF_POINTER -, 2, -off£tof -( -E2SM_KPM_IndiÿtiÚH—d”_FÜm©1 -, -£nd”Ty³ -), - -339 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -341 & -a¢_DEF_PršbËSŒšg -, - -343 { 0, & -a¢_PER_memb_£nd”Ty³_cÚ¡r_5 -, -memb_£nd”Ty³_cÚ¡¿št_1 - }, - -347 { -ATF_POINTER -, 1, -off£tof -( -E2SM_KPM_IndiÿtiÚH—d”_FÜm©1 -, -v’dÜName -), - -348 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -350 & -a¢_DEF_PršbËSŒšg -, - -352 { 0, & -a¢_PER_memb_v’dÜName_cÚ¡r_6 -, -memb_v’dÜName_cÚ¡¿št_1 - }, - -357 cÚ¡  - ga¢_MAP_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_oms_1 -[] = { 1, 2, 3, 4 }; - -358 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_gs_1 -[] = { - -359 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -361 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_g2–_1 -[] = { - -362 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -363 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -364 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -365 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 }, - -366 { ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), 4, 0, 0 } - -368 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_¥ecs_1 - = { - -369 ( -E2SM_KPM_IndiÿtiÚH—d”_FÜm©1 -), - -370 -off£tof -( -E2SM_KPM_IndiÿtiÚH—d”_FÜm©1 -, -_a¢_ùx -), - -371 -a¢_MAP_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_g2–_1 -, - -373 -a¢_MAP_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_oms_1 -, - -377 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1 - = { - -380 & -a¢_OP_SEQUENCE -, - -381 -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_gs_1 -, - -382 ( -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_gs_1 -) - -383 /( -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_gs_1 -[0]), - -384 -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_gs_1 -, - -385 ( -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_gs_1 -) - -386 /( -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_gs_1 -[0]), - -387 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -388 -a¢_MBR_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_1 -, - -390 & -a¢_SPC_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1_¥ecs_1 - - - @E2SM-KPM-IndicationHeader.c - -8  - ~"E2SM-KPM-IndiÿtiÚH—d”.h -" - -10  - ~"E2SM-KPM-IndiÿtiÚH—d”-FÜm©1.h -" - -11  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_šdiÿtiÚH—d”_fÜm©s_cÚ¡r_2 - - gCC_NOTUSED - = { - -12 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -13 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -16  -a¢_TYPE_memb”_t - - ga¢_MBR_šdiÿtiÚH—d”_fÜm©s_2 -[] = { - -17 { -ATF_POINTER -, 0, -off£tof -( -E2SM_KPM_IndiÿtiÚH—d”__šdiÿtiÚH—d”_fÜm©s -, -choiû -. -šdiÿtiÚH—d”_FÜm©1 -), - -18 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -20 & -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_FÜm©1 -, - -27 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_šdiÿtiÚH—d”_fÜm©s_g2–_2 -[] = { - -28 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -30  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_šdiÿtiÚH—d”_fÜm©s_¥ecs_2 - = { - -31 ( -E2SM_KPM_IndiÿtiÚH—d”__šdiÿtiÚH—d”_fÜm©s -), - -32 -off£tof -( -E2SM_KPM_IndiÿtiÚH—d”__šdiÿtiÚH—d”_fÜm©s -, -_a¢_ùx -), - -33 -off£tof -( -E2SM_KPM_IndiÿtiÚH—d”__šdiÿtiÚH—d”_fÜm©s -, -´e£Á -), - -34 ((( -E2SM_KPM_IndiÿtiÚH—d”__šdiÿtiÚH—d”_fÜm©s - *)0)-> -´e£Á -), - -35 -a¢_MAP_šdiÿtiÚH—d”_fÜm©s_g2–_2 -, - -41 -a¢_TYPE_desütÜ_t - - ga¢_DEF_šdiÿtiÚH—d”_fÜm©s_2 - = { - -44 & -a¢_OP_CHOICE -, - -49 { 0, & -a¢_PER_ty³_šdiÿtiÚH—d”_fÜm©s_cÚ¡r_2 -, -CHOICE_cÚ¡¿št - }, - -50 -a¢_MBR_šdiÿtiÚH—d”_fÜm©s_2 -, - -52 & -a¢_SPC_šdiÿtiÚH—d”_fÜm©s_¥ecs_2 - - -55  -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_IndiÿtiÚH—d”_1 -[] = { - -56 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_IndiÿtiÚH—d” -, -šdiÿtiÚH—d”_fÜm©s -), - -57 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -59 & -a¢_DEF_šdiÿtiÚH—d”_fÜm©s_2 -, - -66 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_gs_1 -[] = { - -67 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -69 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_IndiÿtiÚH—d”_g2–_1 -[] = { - -70 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -72  -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_IndiÿtiÚH—d”_¥ecs_1 - = { - -73 ( -E2SM_KPM_IndiÿtiÚH—d” -), - -74 -off£tof -( -E2SM_KPM_IndiÿtiÚH—d” -, -_a¢_ùx -), - -75 -a¢_MAP_E2SM_KPM_IndiÿtiÚH—d”_g2–_1 -, - -80 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_IndiÿtiÚH—d” - = { - -83 & -a¢_OP_SEQUENCE -, - -84 -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_gs_1 -, - -85 ( -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_gs_1 -) - -86 /( -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_gs_1 -[0]), - -87 -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_gs_1 -, - -88 ( -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_gs_1 -) - -89 /( -a¢_DEF_E2SM_KPM_IndiÿtiÚH—d”_gs_1 -[0]), - -90 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -91 -a¢_MBR_E2SM_KPM_IndiÿtiÚH—d”_1 -, - -93 & -a¢_SPC_E2SM_KPM_IndiÿtiÚH—d”_¥ecs_1 - - - @E2SM-KPM-IndicationMessage-Format1.c - -8  - ~"E2SM-KPM-IndiÿtiÚMes§ge-FÜm©1.h -" - -10  - ~"M—su»m’tInfoLi¡.h -" - -11 -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_1 -[] = { - -12 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1 -, -m—sD©a -), - -13 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -15 & -a¢_DEF_M—su»m’tD©a -, - -21 { -ATF_POINTER -, 2, -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1 -, -m—sInfoLi¡ -), - -22 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -24 & -a¢_DEF_M—su»m’tInfoLi¡ -, - -30 { -ATF_POINTER -, 1, -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1 -, -g¿nulP”iod -), - -31 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -33 & -a¢_DEF_G¿nuÏr™yP”iod -, - -40 cÚ¡  - ga¢_MAP_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_oms_1 -[] = { 1, 2 }; - -41 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_gs_1 -[] = { - -42 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -44 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_g2–_1 -[] = { - -45 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -46 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -47 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -49 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_¥ecs_1 - = { - -50 ( -E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1 -), - -51 -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1 -, -_a¢_ùx -), - -52 -a¢_MAP_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_g2–_1 -, - -54 -a¢_MAP_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_oms_1 -, - -58 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1 - = { - -61 & -a¢_OP_SEQUENCE -, - -62 -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_gs_1 -, - -63 ( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_gs_1 -) - -64 /( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_gs_1 -[0]), - -65 -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_gs_1 -, - -66 ( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_gs_1 -) - -67 /( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_gs_1 -[0]), - -68 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -69 -a¢_MBR_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_1 -, - -71 & -a¢_SPC_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1_¥ecs_1 - - - @E2SM-KPM-IndicationMessage-Format2.c - -8  - ~"E2SM-KPM-IndiÿtiÚMes§ge-FÜm©2.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2 -, -m—sD©a -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_M—su»m’tD©a -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2 -, -m—sCÚdUEidLi¡ -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_M—su»m’tCÚdUEidLi¡ -, - -29 { -ATF_POINTER -, 1, -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2 -, -g¿nulP”iod -), - -30 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -32 & -a¢_DEF_G¿nuÏr™yP”iod -, - -39 cÚ¡  - ga¢_MAP_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_oms_1 -[] = { 2 }; - -40 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_gs_1 -[] = { - -41 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -43 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_g2–_1 -[] = { - -44 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -45 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -46 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -48 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_¥ecs_1 - = { - -49 ( -E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2 -), - -50 -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2 -, -_a¢_ùx -), - -51 -a¢_MAP_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_g2–_1 -, - -53 -a¢_MAP_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_oms_1 -, - -57 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2 - = { - -60 & -a¢_OP_SEQUENCE -, - -61 -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_gs_1 -, - -62 ( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_gs_1 -) - -63 /( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_gs_1 -[0]), - -64 -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_gs_1 -, - -65 ( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_gs_1 -) - -66 /( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_gs_1 -[0]), - -67 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -68 -a¢_MBR_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_1 -, - -70 & -a¢_SPC_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2_¥ecs_1 - - - @E2SM-KPM-IndicationMessage.c - -8  - ~"E2SM-KPM-IndiÿtiÚMes§ge.h -" - -10  - ~"E2SM-KPM-IndiÿtiÚMes§ge-FÜm©1.h -" - -11  - ~"E2SM-KPM-IndiÿtiÚMes§ge-FÜm©2.h -" - -12  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_šdiÿtiÚMes§ge_fÜm©s_cÚ¡r_2 - - gCC_NOTUSED - = { - -13 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -14 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -17  -a¢_TYPE_memb”_t - - ga¢_MBR_šdiÿtiÚMes§ge_fÜm©s_2 -[] = { - -18 { -ATF_POINTER -, 0, -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge__šdiÿtiÚMes§ge_fÜm©s -, -choiû -. -šdiÿtiÚMes§ge_FÜm©1 -), - -19 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -21 & -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©1 -, - -27 { -ATF_POINTER -, 0, -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge__šdiÿtiÚMes§ge_fÜm©s -, -choiû -. -šdiÿtiÚMes§ge_FÜm©2 -), - -28 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -30 & -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_FÜm©2 -, - -37 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_šdiÿtiÚMes§ge_fÜm©s_g2–_2 -[] = { - -38 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -39 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -41  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_šdiÿtiÚMes§ge_fÜm©s_¥ecs_2 - = { - -42 ( -E2SM_KPM_IndiÿtiÚMes§ge__šdiÿtiÚMes§ge_fÜm©s -), - -43 -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge__šdiÿtiÚMes§ge_fÜm©s -, -_a¢_ùx -), - -44 -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge__šdiÿtiÚMes§ge_fÜm©s -, -´e£Á -), - -45 ((( -E2SM_KPM_IndiÿtiÚMes§ge__šdiÿtiÚMes§ge_fÜm©s - *)0)-> -´e£Á -), - -46 -a¢_MAP_šdiÿtiÚMes§ge_fÜm©s_g2–_2 -, - -52 -a¢_TYPE_desütÜ_t - - ga¢_DEF_šdiÿtiÚMes§ge_fÜm©s_2 - = { - -55 & -a¢_OP_CHOICE -, - -60 { 0, & -a¢_PER_ty³_šdiÿtiÚMes§ge_fÜm©s_cÚ¡r_2 -, -CHOICE_cÚ¡¿št - }, - -61 -a¢_MBR_šdiÿtiÚMes§ge_fÜm©s_2 -, - -63 & -a¢_SPC_šdiÿtiÚMes§ge_fÜm©s_¥ecs_2 - - -66  -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_IndiÿtiÚMes§ge_1 -[] = { - -67 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge -, -šdiÿtiÚMes§ge_fÜm©s -), - -68 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -70 & -a¢_DEF_šdiÿtiÚMes§ge_fÜm©s_2 -, - -77 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_gs_1 -[] = { - -78 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -80 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_IndiÿtiÚMes§ge_g2–_1 -[] = { - -81 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -83  -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_IndiÿtiÚMes§ge_¥ecs_1 - = { - -84 ( -E2SM_KPM_IndiÿtiÚMes§ge -), - -85 -off£tof -( -E2SM_KPM_IndiÿtiÚMes§ge -, -_a¢_ùx -), - -86 -a¢_MAP_E2SM_KPM_IndiÿtiÚMes§ge_g2–_1 -, - -91 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge - = { - -94 & -a¢_OP_SEQUENCE -, - -95 -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_gs_1 -, - -96 ( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_gs_1 -) - -97 /( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_gs_1 -[0]), - -98 -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_gs_1 -, - -99 ( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_gs_1 -) - -100 /( -a¢_DEF_E2SM_KPM_IndiÿtiÚMes§ge_gs_1 -[0]), - -101 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -102 -a¢_MBR_E2SM_KPM_IndiÿtiÚMes§ge_1 -, - -104 & -a¢_SPC_E2SM_KPM_IndiÿtiÚMes§ge_¥ecs_1 - - - @E2SM-KPM-RANfunction-Description.c - -8  - ~"E2SM-KPM-RANfunùiÚ-DesütiÚ.h -" - -10  - ~"RIC-Ev’tTrigg”StyË-I‹m.h -" - -11  - ~"RIC-R•ÜtStyË-I‹m.h -" - -13 - $memb_ric_Ev’tTrigg”StyË_Li¡_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -14 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -15 -size_t - -size -; - -17 if(! -¥Œ -) { - -18 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -20 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -25 -size - = - `_A_CSEQUENCE_FROM_VOID -( -¥Œ -)-> -couÁ -; - -27 if(( -size - >= 1 && size <= 63)) { - -29  -td --> -’codšg_cÚ¡¿šts -. - `g’”®_cÚ¡¿šts -Ñd, -¥Œ -, -ùçžcb -, -­p_key -); - -31 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -33 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -36 - } -} - -39 - $memb_ric_R•ÜtStyË_Li¡_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -40 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -41 -size_t - -size -; - -43 if(! -¥Œ -) { - -44 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -46 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -51 -size - = - `_A_CSEQUENCE_FROM_VOID -( -¥Œ -)-> -couÁ -; - -53 if(( -size - >= 1 && size <= 63)) { - -55  -td --> -’codšg_cÚ¡¿šts -. - `g’”®_cÚ¡¿šts -Ñd, -¥Œ -, -ùçžcb -, -­p_key -); - -57 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -59 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -62 - } -} - -64  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_ric_Ev’tTrigg”StyË_Li¡_cÚ¡r_3 - - gCC_NOTUSED - = { - -65 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -66 { -APC_CONSTRAINED -, 6, 6, 1, 63 } , - -69  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_ric_R•ÜtStyË_Li¡_cÚ¡r_5 - - gCC_NOTUSED - = { - -70 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -71 { -APC_CONSTRAINED -, 6, 6, 1, 63 } , - -74  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_ric_Ev’tTrigg”StyË_Li¡_cÚ¡r_3 - - gCC_NOTUSED - = { - -75 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -76 { -APC_CONSTRAINED -, 6, 6, 1, 63 } , - -79  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_ric_R•ÜtStyË_Li¡_cÚ¡r_5 - - gCC_NOTUSED - = { - -80 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -81 { -APC_CONSTRAINED -, 6, 6, 1, 63 } , - -84  -a¢_TYPE_memb”_t - - ga¢_MBR_ric_Ev’tTrigg”StyË_Li¡_3 -[] = { - -85 { -ATF_POINTER -, 0, 0, - -86 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -88 & -a¢_DEF_RIC_Ev’tTrigg”StyË_I‹m -, - -95 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_ric_Ev’tTrigg”StyË_Li¡_gs_3 -[] = { - -96 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -97 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -99  -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_ric_Ev’tTrigg”StyË_Li¡_¥ecs_3 - = { - -100 ( -E2SM_KPM_RANfunùiÚ_DesütiÚ__ric_Ev’tTrigg”StyË_Li¡ -), - -101 -off£tof -( -E2SM_KPM_RANfunùiÚ_DesütiÚ__ric_Ev’tTrigg”StyË_Li¡ -, -_a¢_ùx -), - -105 -a¢_TYPE_desütÜ_t - - ga¢_DEF_ric_Ev’tTrigg”StyË_Li¡_3 - = { - -108 & -a¢_OP_SEQUENCE_OF -, - -109 -a¢_DEF_ric_Ev’tTrigg”StyË_Li¡_gs_3 -, - -110 ( -a¢_DEF_ric_Ev’tTrigg”StyË_Li¡_gs_3 -) - -111 /( -a¢_DEF_ric_Ev’tTrigg”StyË_Li¡_gs_3 -[0]) - 1, - -112 -a¢_DEF_ric_Ev’tTrigg”StyË_Li¡_gs_3 -, - -113 ( -a¢_DEF_ric_Ev’tTrigg”StyË_Li¡_gs_3 -) - -114 /( -a¢_DEF_ric_Ev’tTrigg”StyË_Li¡_gs_3 -[0]), - -115 { 0, & -a¢_PER_ty³_ric_Ev’tTrigg”StyË_Li¡_cÚ¡r_3 -, -SEQUENCE_OF_cÚ¡¿št - }, - -116 -a¢_MBR_ric_Ev’tTrigg”StyË_Li¡_3 -, - -118 & -a¢_SPC_ric_Ev’tTrigg”StyË_Li¡_¥ecs_3 - - -121  -a¢_TYPE_memb”_t - - ga¢_MBR_ric_R•ÜtStyË_Li¡_5 -[] = { - -122 { -ATF_POINTER -, 0, 0, - -123 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -125 & -a¢_DEF_RIC_R•ÜtStyË_I‹m -, - -132 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_ric_R•ÜtStyË_Li¡_gs_5 -[] = { - -133 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -134 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -136  -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_ric_R•ÜtStyË_Li¡_¥ecs_5 - = { - -137 ( -E2SM_KPM_RANfunùiÚ_DesütiÚ__ric_R•ÜtStyË_Li¡ -), - -138 -off£tof -( -E2SM_KPM_RANfunùiÚ_DesütiÚ__ric_R•ÜtStyË_Li¡ -, -_a¢_ùx -), - -142 -a¢_TYPE_desütÜ_t - - ga¢_DEF_ric_R•ÜtStyË_Li¡_5 - = { - -145 & -a¢_OP_SEQUENCE_OF -, - -146 -a¢_DEF_ric_R•ÜtStyË_Li¡_gs_5 -, - -147 ( -a¢_DEF_ric_R•ÜtStyË_Li¡_gs_5 -) - -148 /( -a¢_DEF_ric_R•ÜtStyË_Li¡_gs_5 -[0]) - 1, - -149 -a¢_DEF_ric_R•ÜtStyË_Li¡_gs_5 -, - -150 ( -a¢_DEF_ric_R•ÜtStyË_Li¡_gs_5 -) - -151 /( -a¢_DEF_ric_R•ÜtStyË_Li¡_gs_5 -[0]), - -152 { 0, & -a¢_PER_ty³_ric_R•ÜtStyË_Li¡_cÚ¡r_5 -, -SEQUENCE_OF_cÚ¡¿št - }, - -153 -a¢_MBR_ric_R•ÜtStyË_Li¡_5 -, - -155 & -a¢_SPC_ric_R•ÜtStyË_Li¡_¥ecs_5 - - -158  -a¢_TYPE_memb”_t - - ga¢_MBR_E2SM_KPM_RANfunùiÚ_DesütiÚ_1 -[] = { - -159 { -ATF_NOFLAGS -, 0, -off£tof -( -E2SM_KPM_RANfunùiÚ_DesütiÚ -, -¿nFunùiÚ_Name -), - -160 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -162 & -a¢_DEF_RANfunùiÚ_Name -, - -168 { -ATF_POINTER -, 2, -off£tof -( -E2SM_KPM_RANfunùiÚ_DesütiÚ -, -ric_Ev’tTrigg”StyË_Li¡ -), - -169 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -171 & -a¢_DEF_ric_Ev’tTrigg”StyË_Li¡_3 -, - -173 { 0, & -a¢_PER_memb_ric_Ev’tTrigg”StyË_Li¡_cÚ¡r_3 -, -memb_ric_Ev’tTrigg”StyË_Li¡_cÚ¡¿št_1 - }, - -177 { -ATF_POINTER -, 1, -off£tof -( -E2SM_KPM_RANfunùiÚ_DesütiÚ -, -ric_R•ÜtStyË_Li¡ -), - -178 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -180 & -a¢_DEF_ric_R•ÜtStyË_Li¡_5 -, - -182 { 0, & -a¢_PER_memb_ric_R•ÜtStyË_Li¡_cÚ¡r_5 -, -memb_ric_R•ÜtStyË_Li¡_cÚ¡¿št_1 - }, - -187 cÚ¡  - ga¢_MAP_E2SM_KPM_RANfunùiÚ_DesütiÚ_oms_1 -[] = { 1, 2 }; - -188 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_E2SM_KPM_RANfunùiÚ_DesütiÚ_gs_1 -[] = { - -189 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -191 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_E2SM_KPM_RANfunùiÚ_DesütiÚ_g2–_1 -[] = { - -192 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -193 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -194 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -196  -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_E2SM_KPM_RANfunùiÚ_DesütiÚ_¥ecs_1 - = { - -197 ( -E2SM_KPM_RANfunùiÚ_DesütiÚ -), - -198 -off£tof -( -E2SM_KPM_RANfunùiÚ_DesütiÚ -, -_a¢_ùx -), - -199 -a¢_MAP_E2SM_KPM_RANfunùiÚ_DesütiÚ_g2–_1 -, - -201 -a¢_MAP_E2SM_KPM_RANfunùiÚ_DesütiÚ_oms_1 -, - -205 -a¢_TYPE_desütÜ_t - - ga¢_DEF_E2SM_KPM_RANfunùiÚ_DesütiÚ - = { - -208 & -a¢_OP_SEQUENCE -, - -209 -a¢_DEF_E2SM_KPM_RANfunùiÚ_DesütiÚ_gs_1 -, - -210 ( -a¢_DEF_E2SM_KPM_RANfunùiÚ_DesütiÚ_gs_1 -) - -211 /( -a¢_DEF_E2SM_KPM_RANfunùiÚ_DesütiÚ_gs_1 -[0]), - -212 -a¢_DEF_E2SM_KPM_RANfunùiÚ_DesütiÚ_gs_1 -, - -213 ( -a¢_DEF_E2SM_KPM_RANfunùiÚ_DesütiÚ_gs_1 -) - -214 /( -a¢_DEF_E2SM_KPM_RANfunùiÚ_DesütiÚ_gs_1 -[0]), - -215 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -216 -a¢_MBR_E2SM_KPM_RANfunùiÚ_DesütiÚ_1 -, - -218 & -a¢_SPC_E2SM_KPM_RANfunùiÚ_DesütiÚ_¥ecs_1 - - - @EN-GNB-ID.c - -8  - ~"EN-GNB-ID.h -" - -11 - $memb_’_gNB_ID_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( -¡ --> -size - > 0) { - -25 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -27 -size - = 0; - -30 if(( -size - >= 22 && size <= 32)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -41  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_’_gNB_ID_cÚ¡r_2 - - gCC_NOTUSED - = { - -42 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -43 { -APC_CONSTRAINED -, 4, 4, 22, 32 } , - -46 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_EN_GNB_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -47 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -48 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -51 -a¢_TYPE_memb”_t - - ga¢_MBR_EN_GNB_ID_1 -[] = { - -52 { -ATF_NOFLAGS -, 0, -off£tof -( -EN_GNB_ID -, -choiû -. -’_gNB_ID -), - -53 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -55 & -a¢_DEF_BIT_STRING -, - -57 { 0, & -a¢_PER_memb_’_gNB_ID_cÚ¡r_2 -, -memb_’_gNB_ID_cÚ¡¿št_1 - }, - -62 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_EN_GNB_ID_g2–_1 -[] = { - -63 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -65 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_EN_GNB_ID_¥ecs_1 - = { - -66 ( -EN_GNB_ID -), - -67 -off£tof -( -EN_GNB_ID -, -_a¢_ùx -), - -68 -off£tof -( -EN_GNB_ID -, -´e£Á -), - -69 ((( -EN_GNB_ID - *)0)-> -´e£Á -), - -70 -a¢_MAP_EN_GNB_ID_g2–_1 -, - -75 -a¢_TYPE_desütÜ_t - - ga¢_DEF_EN_GNB_ID - = { - -78 & -a¢_OP_CHOICE -, - -83 { 0, & -a¢_PER_ty³_EN_GNB_ID_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -84 -a¢_MBR_EN_GNB_ID_1 -, - -86 & -a¢_SPC_EN_GNB_ID_¥ecs_1 - - - @ENB-ID.c - -8  - ~"ENB-ID.h -" - -11 - $memb_maüo_eNB_ID_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( -¡ --> -size - > 0) { - -25 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -27 -size - = 0; - -30 if(( -size - == 20)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -42 - $memb_home_eNB_ID_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -43 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -44 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -45 -size_t - -size -; - -47 if(! -¥Œ -) { - -48 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -50 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -54 if( -¡ --> -size - > 0) { - -56 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -58 -size - = 0; - -61 if(( -size - == 28)) { - -65 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -67 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -70 - } -} - -73 - $memb_shÜt_Maüo_eNB_ID_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -74 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -75 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -76 -size_t - -size -; - -78 if(! -¥Œ -) { - -79 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -81 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -85 if( -¡ --> -size - > 0) { - -87 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -89 -size - = 0; - -92 if(( -size - == 18)) { - -96 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -98 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -101 - } -} - -104 - $memb_lÚg_Maüo_eNB_ID_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -105 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -106 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -107 -size_t - -size -; - -109 if(! -¥Œ -) { - -110 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -112 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -116 if( -¡ --> -size - > 0) { - -118 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -120 -size - = 0; - -123 if(( -size - == 21)) { - -127 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -129 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -132 - } -} - -134  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_maüo_eNB_ID_cÚ¡r_2 - - gCC_NOTUSED - = { - -135 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -136 { -APC_CONSTRAINED -, 0, 0, 20, 20 } , - -139  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_home_eNB_ID_cÚ¡r_3 - - gCC_NOTUSED - = { - -140 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -141 { -APC_CONSTRAINED -, 0, 0, 28, 28 } , - -144  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_shÜt_Maüo_eNB_ID_cÚ¡r_5 - - gCC_NOTUSED - = { - -145 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -146 { -APC_CONSTRAINED -, 0, 0, 18, 18 } , - -149  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_lÚg_Maüo_eNB_ID_cÚ¡r_6 - - gCC_NOTUSED - = { - -150 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -151 { -APC_CONSTRAINED -, 0, 0, 21, 21 } , - -154 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_ENB_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -155 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -156 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -159 -a¢_TYPE_memb”_t - - ga¢_MBR_ENB_ID_1 -[] = { - -160 { -ATF_NOFLAGS -, 0, -off£tof -( -ENB_ID -, -choiû -. -maüo_eNB_ID -), - -161 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -163 & -a¢_DEF_BIT_STRING -, - -165 { 0, & -a¢_PER_memb_maüo_eNB_ID_cÚ¡r_2 -, -memb_maüo_eNB_ID_cÚ¡¿št_1 - }, - -169 { -ATF_NOFLAGS -, 0, -off£tof -( -ENB_ID -, -choiû -. -home_eNB_ID -), - -170 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -172 & -a¢_DEF_BIT_STRING -, - -174 { 0, & -a¢_PER_memb_home_eNB_ID_cÚ¡r_3 -, -memb_home_eNB_ID_cÚ¡¿št_1 - }, - -178 { -ATF_NOFLAGS -, 0, -off£tof -( -ENB_ID -, -choiû -. -shÜt_Maüo_eNB_ID -), - -179 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -181 & -a¢_DEF_BIT_STRING -, - -183 { 0, & -a¢_PER_memb_shÜt_Maüo_eNB_ID_cÚ¡r_5 -, -memb_shÜt_Maüo_eNB_ID_cÚ¡¿št_1 - }, - -187 { -ATF_NOFLAGS -, 0, -off£tof -( -ENB_ID -, -choiû -. -lÚg_Maüo_eNB_ID -), - -188 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -190 & -a¢_DEF_BIT_STRING -, - -192 { 0, & -a¢_PER_memb_lÚg_Maüo_eNB_ID_cÚ¡r_6 -, -memb_lÚg_Maüo_eNB_ID_cÚ¡¿št_1 - }, - -197 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_ENB_ID_g2–_1 -[] = { - -198 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -199 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -200 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -201 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 } - -203 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_ENB_ID_¥ecs_1 - = { - -204 ( -ENB_ID -), - -205 -off£tof -( -ENB_ID -, -_a¢_ùx -), - -206 -off£tof -( -ENB_ID -, -´e£Á -), - -207 ((( -ENB_ID - *)0)-> -´e£Á -), - -208 -a¢_MAP_ENB_ID_g2–_1 -, - -213 -a¢_TYPE_desütÜ_t - - ga¢_DEF_ENB_ID - = { - -216 & -a¢_OP_CHOICE -, - -221 { 0, & -a¢_PER_ty³_ENB_ID_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -222 -a¢_MBR_ENB_ID_1 -, - -224 & -a¢_SPC_ENB_ID_¥ecs_1 - - - @ENB-UE-X2AP-ID-Extension.c - -8  - ~"ENB-UE-X2AP-ID-Ex‹nsiÚ.h -" - -11 - $ENB_UE_X2AP_ID_Ex‹nsiÚ_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 0 && value <= 4095)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_ENB_UE_X2AP_ID_Ex‹nsiÚ_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 12, 12, 0, 4095 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_ENB_UE_X2AP_ID_Ex‹nsiÚ_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_ENB_UE_X2AP_ID_Ex‹nsiÚ - = { - -50 & -a¢_OP_N©iveIÁeg” -, - -51 -a¢_DEF_ENB_UE_X2AP_ID_Ex‹nsiÚ_gs_1 -, - -52 ( -a¢_DEF_ENB_UE_X2AP_ID_Ex‹nsiÚ_gs_1 -) - -53 /( -a¢_DEF_ENB_UE_X2AP_ID_Ex‹nsiÚ_gs_1 -[0]), - -54 -a¢_DEF_ENB_UE_X2AP_ID_Ex‹nsiÚ_gs_1 -, - -55 ( -a¢_DEF_ENB_UE_X2AP_ID_Ex‹nsiÚ_gs_1 -) - -56 /( -a¢_DEF_ENB_UE_X2AP_ID_Ex‹nsiÚ_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_ENB_UE_X2AP_ID_Ex‹nsiÚ_cÚ¡r_1 -, -ENB_UE_X2AP_ID_Ex‹nsiÚ_cÚ¡¿št - }, - - @ENB-UE-X2AP-ID.c - -8  - ~"ENB-UE-X2AP-ID.h -" - -11 - $ENB_UE_X2AP_ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 0 && value <= 4095)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_ENB_UE_X2AP_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED -, 12, 12, 0, 4095 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_ENB_UE_X2AP_ID_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_ENB_UE_X2AP_ID - = { - -50 & -a¢_OP_N©iveIÁeg” -, - -51 -a¢_DEF_ENB_UE_X2AP_ID_gs_1 -, - -52 ( -a¢_DEF_ENB_UE_X2AP_ID_gs_1 -) - -53 /( -a¢_DEF_ENB_UE_X2AP_ID_gs_1 -[0]), - -54 -a¢_DEF_ENB_UE_X2AP_ID_gs_1 -, - -55 ( -a¢_DEF_ENB_UE_X2AP_ID_gs_1 -) - -56 /( -a¢_DEF_ENB_UE_X2AP_ID_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_ENB_UE_X2AP_ID_cÚ¡r_1 -, -ENB_UE_X2AP_ID_cÚ¡¿št - }, - - @EUTRA-CGI.c - -8  - ~"EUTRA-CGI.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_EUTRA_CGI_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -EUTRA_CGI -, -pLMNId’t™y -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_PLMNId’t™y -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -EUTRA_CGI -, -eUTRAC–lId’t™y -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_EUTRAC–lId’t™y -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_EUTRA_CGI_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_EUTRA_CGI_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_EUTRA_CGI_¥ecs_1 - = { - -38 ( -EUTRA_CGI -), - -39 -off£tof -( -EUTRA_CGI -, -_a¢_ùx -), - -40 -a¢_MAP_EUTRA_CGI_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_EUTRA_CGI - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_EUTRA_CGI_gs_1 -, - -50 ( -a¢_DEF_EUTRA_CGI_gs_1 -) - -51 /( -a¢_DEF_EUTRA_CGI_gs_1 -[0]), - -52 -a¢_DEF_EUTRA_CGI_gs_1 -, - -53 ( -a¢_DEF_EUTRA_CGI_gs_1 -) - -54 /( -a¢_DEF_EUTRA_CGI_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_EUTRA_CGI_1 -, - -58 & -a¢_SPC_EUTRA_CGI_¥ecs_1 - - - @EUTRACellIdentity.c - -8  - ~"EUTRAC–lId’t™y.h -" - -11 - $EUTRAC–lId’t™y_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( -¡ --> -size - > 0) { - -25 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -27 -size - = 0; - -30 if(( -size - == 28)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -45 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_EUTRAC–lId’t™y_cÚ¡r_1 - - gCC_NOTUSED - = { - -46 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -47 { -APC_CONSTRAINED -, 0, 0, 28, 28 } , - -50 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_EUTRAC–lId’t™y_gs_1 -[] = { - -51 ( -ASN_TAG_CLASS_UNIVERSAL - | (3 << 2)) - -53 -a¢_TYPE_desütÜ_t - - ga¢_DEF_EUTRAC–lId’t™y - = { - -56 & -a¢_OP_BIT_STRING -, - -57 -a¢_DEF_EUTRAC–lId’t™y_gs_1 -, - -58 ( -a¢_DEF_EUTRAC–lId’t™y_gs_1 -) - -59 /( -a¢_DEF_EUTRAC–lId’t™y_gs_1 -[0]), - -60 -a¢_DEF_EUTRAC–lId’t™y_gs_1 -, - -61 ( -a¢_DEF_EUTRAC–lId’t™y_gs_1 -) - -62 /( -a¢_DEF_EUTRAC–lId’t™y_gs_1 -[0]), - -63 { 0, & -a¢_PER_ty³_EUTRAC–lId’t™y_cÚ¡r_1 -, -EUTRAC–lId’t™y_cÚ¡¿št - }, - -65 & -a¢_SPC_BIT_STRING_¥ecs - - - @FiveGS-TAC.c - -8  - ~"FiveGS-TAC.h -" - -11 - $FiveGS_TAC_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 -size - = -¡ -->size; - -25 if(( -size - == 3)) { - -29 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -31 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -34 - } -} - -40  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_FiveGS_TAC_cÚ¡r_1 - - gCC_NOTUSED - = { - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -42 { -APC_CONSTRAINED -, 0, 0, 3, 3 } , - -45 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_FiveGS_TAC_gs_1 -[] = { - -46 ( -ASN_TAG_CLASS_UNIVERSAL - | (4 << 2)) - -48 -a¢_TYPE_desütÜ_t - - ga¢_DEF_FiveGS_TAC - = { - -51 & -a¢_OP_OCTET_STRING -, - -52 -a¢_DEF_FiveGS_TAC_gs_1 -, - -53 ( -a¢_DEF_FiveGS_TAC_gs_1 -) - -54 /( -a¢_DEF_FiveGS_TAC_gs_1 -[0]), - -55 -a¢_DEF_FiveGS_TAC_gs_1 -, - -56 ( -a¢_DEF_FiveGS_TAC_gs_1 -) - -57 /( -a¢_DEF_FiveGS_TAC_gs_1 -[0]), - -58 { 0, & -a¢_PER_ty³_FiveGS_TAC_cÚ¡r_1 -, -FiveGS_TAC_cÚ¡¿št - }, - -60 & -a¢_SPC_OCTET_STRING_¥ecs - - - @FiveQI.c - -8  - ~"FiveQI.h -" - -11 - $FiveQI_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 0 && value <= 255)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_FiveQI_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 8, 8, 0, 255 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_FiveQI_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_FiveQI - = { - -50 & -a¢_OP_N©iveIÁeg” -, - -51 -a¢_DEF_FiveQI_gs_1 -, - -52 ( -a¢_DEF_FiveQI_gs_1 -) - -53 /( -a¢_DEF_FiveQI_gs_1 -[0]), - -54 -a¢_DEF_FiveQI_gs_1 -, - -55 ( -a¢_DEF_FiveQI_gs_1 -) - -56 /( -a¢_DEF_FiveQI_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_FiveQI_cÚ¡r_1 -, -FiveQI_cÚ¡¿št - }, - - @FreqBandNrItem.c - -8  - ~"F»qBªdNrI‹m.h -" - -11 - $memb_äeqBªdIndiÿtÜNr_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 1 && value <= 1024)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -35  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_äeqBªdIndiÿtÜNr_cÚ¡r_2 - - gCC_NOTUSED - = { - -36 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 10, 10, 1, 1024 } , - -37 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -40  -a¢_TYPE_memb”_t - - ga¢_MBR_F»qBªdNrI‹m_1 -[] = { - -41 { -ATF_NOFLAGS -, 0, -off£tof -( -F»qBªdNrI‹m -, -äeqBªdIndiÿtÜNr -), - -42 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -44 & -a¢_DEF_N©iveIÁeg” -, - -46 { 0, & -a¢_PER_memb_äeqBªdIndiÿtÜNr_cÚ¡r_2 -, -memb_äeqBªdIndiÿtÜNr_cÚ¡¿št_1 - }, - -51 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_F»qBªdNrI‹m_gs_1 -[] = { - -52 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -54 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_F»qBªdNrI‹m_g2–_1 -[] = { - -55 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -57  -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_F»qBªdNrI‹m_¥ecs_1 - = { - -58 ( -F»qBªdNrI‹m -), - -59 -off£tof -( -F»qBªdNrI‹m -, -_a¢_ùx -), - -60 -a¢_MAP_F»qBªdNrI‹m_g2–_1 -, - -65 -a¢_TYPE_desütÜ_t - - ga¢_DEF_F»qBªdNrI‹m - = { - -68 & -a¢_OP_SEQUENCE -, - -69 -a¢_DEF_F»qBªdNrI‹m_gs_1 -, - -70 ( -a¢_DEF_F»qBªdNrI‹m_gs_1 -) - -71 /( -a¢_DEF_F»qBªdNrI‹m_gs_1 -[0]), - -72 -a¢_DEF_F»qBªdNrI‹m_gs_1 -, - -73 ( -a¢_DEF_F»qBªdNrI‹m_gs_1 -) - -74 /( -a¢_DEF_F»qBªdNrI‹m_gs_1 -[0]), - -75 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -76 -a¢_MBR_F»qBªdNrI‹m_1 -, - -78 & -a¢_SPC_F»qBªdNrI‹m_¥ecs_1 - - - @GNB-CU-CP-UE-E1AP-ID.c - -8  - ~"GNB-CU-CP-UE-E1AP-ID.h -" - -11 - $GNB_CU_CP_UE_E1AP_ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -14 if(! -¥Œ -) { - -15 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -17 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -24 - } -} - -30 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_GNB_CU_CP_UE_E1AP_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -31 { -APC_CONSTRAINED -, 32, -1, 0, 4294967295 } , - -32 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -35 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_GNB_CU_CP_UE_E1AP_ID_¥ecs_1 - = { - -40 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_GNB_CU_CP_UE_E1AP_ID_gs_1 -[] = { - -41 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -43 -a¢_TYPE_desütÜ_t - - ga¢_DEF_GNB_CU_CP_UE_E1AP_ID - = { - -46 & -a¢_OP_N©iveIÁeg” -, - -47 -a¢_DEF_GNB_CU_CP_UE_E1AP_ID_gs_1 -, - -48 ( -a¢_DEF_GNB_CU_CP_UE_E1AP_ID_gs_1 -) - -49 /( -a¢_DEF_GNB_CU_CP_UE_E1AP_ID_gs_1 -[0]), - -50 -a¢_DEF_GNB_CU_CP_UE_E1AP_ID_gs_1 -, - -51 ( -a¢_DEF_GNB_CU_CP_UE_E1AP_ID_gs_1 -) - -52 /( -a¢_DEF_GNB_CU_CP_UE_E1AP_ID_gs_1 -[0]), - -53 { 0, & -a¢_PER_ty³_GNB_CU_CP_UE_E1AP_ID_cÚ¡r_1 -, -GNB_CU_CP_UE_E1AP_ID_cÚ¡¿št - }, - -55 & -a¢_SPC_GNB_CU_CP_UE_E1AP_ID_¥ecs_1 - - - @GNB-CU-UE-F1AP-ID.c - -8  - ~"GNB-CU-UE-F1AP-ID.h -" - -11 - $GNB_CU_UE_F1AP_ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -14 if(! -¥Œ -) { - -15 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -17 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -24 - } -} - -30 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_GNB_CU_UE_F1AP_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -31 { -APC_CONSTRAINED -, 32, -1, 0, 4294967295 } , - -32 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -35 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_GNB_CU_UE_F1AP_ID_¥ecs_1 - = { - -40 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_GNB_CU_UE_F1AP_ID_gs_1 -[] = { - -41 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -43 -a¢_TYPE_desütÜ_t - - ga¢_DEF_GNB_CU_UE_F1AP_ID - = { - -46 & -a¢_OP_N©iveIÁeg” -, - -47 -a¢_DEF_GNB_CU_UE_F1AP_ID_gs_1 -, - -48 ( -a¢_DEF_GNB_CU_UE_F1AP_ID_gs_1 -) - -49 /( -a¢_DEF_GNB_CU_UE_F1AP_ID_gs_1 -[0]), - -50 -a¢_DEF_GNB_CU_UE_F1AP_ID_gs_1 -, - -51 ( -a¢_DEF_GNB_CU_UE_F1AP_ID_gs_1 -) - -52 /( -a¢_DEF_GNB_CU_UE_F1AP_ID_gs_1 -[0]), - -53 { 0, & -a¢_PER_ty³_GNB_CU_UE_F1AP_ID_cÚ¡r_1 -, -GNB_CU_UE_F1AP_ID_cÚ¡¿št - }, - -55 & -a¢_SPC_GNB_CU_UE_F1AP_ID_¥ecs_1 - - - @GNB-CU-UP-ID.c - -8  - ~"GNB-CU-UP-ID.h -" - -11 - $GNB_CU_UP_ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -INTEGER_t - * -¡ - = (cÚ¡ INTEGER_ˆ*) -¥Œ -; - -14  -v®ue -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( - `a¢_INTEGER2lÚg -( -¡ -, & -v®ue -)) { - -24 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -26 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -30 if(( -v®ue - >= 0 && value <= 68719476735)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -45 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_GNB_CU_UP_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -46 { -APC_CONSTRAINED -, 36, -1, 0, 68719476735 } , - -47 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -50 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_GNB_CU_UP_ID_gs_1 -[] = { - -51 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -53 -a¢_TYPE_desütÜ_t - - ga¢_DEF_GNB_CU_UP_ID - = { - -56 & -a¢_OP_INTEGER -, - -57 -a¢_DEF_GNB_CU_UP_ID_gs_1 -, - -58 ( -a¢_DEF_GNB_CU_UP_ID_gs_1 -) - -59 /( -a¢_DEF_GNB_CU_UP_ID_gs_1 -[0]), - -60 -a¢_DEF_GNB_CU_UP_ID_gs_1 -, - -61 ( -a¢_DEF_GNB_CU_UP_ID_gs_1 -) - -62 /( -a¢_DEF_GNB_CU_UP_ID_gs_1 -[0]), - -63 { 0, & -a¢_PER_ty³_GNB_CU_UP_ID_cÚ¡r_1 -, -GNB_CU_UP_ID_cÚ¡¿št - }, - - @GNB-DU-ID.c - -8  - ~"GNB-DU-ID.h -" - -11 - $GNB_DU_ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -INTEGER_t - * -¡ - = (cÚ¡ INTEGER_ˆ*) -¥Œ -; - -14  -v®ue -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( - `a¢_INTEGER2lÚg -( -¡ -, & -v®ue -)) { - -24 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -26 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -30 if(( -v®ue - >= 0 && value <= 68719476735)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -45 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_GNB_DU_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -46 { -APC_CONSTRAINED -, 36, -1, 0, 68719476735 } , - -47 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -50 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_GNB_DU_ID_gs_1 -[] = { - -51 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -53 -a¢_TYPE_desütÜ_t - - ga¢_DEF_GNB_DU_ID - = { - -56 & -a¢_OP_INTEGER -, - -57 -a¢_DEF_GNB_DU_ID_gs_1 -, - -58 ( -a¢_DEF_GNB_DU_ID_gs_1 -) - -59 /( -a¢_DEF_GNB_DU_ID_gs_1 -[0]), - -60 -a¢_DEF_GNB_DU_ID_gs_1 -, - -61 ( -a¢_DEF_GNB_DU_ID_gs_1 -) - -62 /( -a¢_DEF_GNB_DU_ID_gs_1 -[0]), - -63 { 0, & -a¢_PER_ty³_GNB_DU_ID_cÚ¡r_1 -, -GNB_DU_ID_cÚ¡¿št - }, - - @GNB-ID.c - -8  - ~"GNB-ID.h -" - -11 - $memb_gNB_ID_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( -¡ --> -size - > 0) { - -25 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -27 -size - = 0; - -30 if(( -size - >= 22 && size <= 32)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -41  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_gNB_ID_cÚ¡r_2 - - gCC_NOTUSED - = { - -42 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -43 { -APC_CONSTRAINED -, 4, 4, 22, 32 } , - -46 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_GNB_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -47 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -48 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -51 -a¢_TYPE_memb”_t - - ga¢_MBR_GNB_ID_1 -[] = { - -52 { -ATF_NOFLAGS -, 0, -off£tof -( -GNB_ID -, -choiû -. -gNB_ID -), - -53 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -55 & -a¢_DEF_BIT_STRING -, - -57 { 0, & -a¢_PER_memb_gNB_ID_cÚ¡r_2 -, -memb_gNB_ID_cÚ¡¿št_1 - }, - -62 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_GNB_ID_g2–_1 -[] = { - -63 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -65 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_GNB_ID_¥ecs_1 - = { - -66 ( -GNB_ID -), - -67 -off£tof -( -GNB_ID -, -_a¢_ùx -), - -68 -off£tof -( -GNB_ID -, -´e£Á -), - -69 ((( -GNB_ID - *)0)-> -´e£Á -), - -70 -a¢_MAP_GNB_ID_g2–_1 -, - -75 -a¢_TYPE_desütÜ_t - - ga¢_DEF_GNB_ID - = { - -78 & -a¢_OP_CHOICE -, - -83 { 0, & -a¢_PER_ty³_GNB_ID_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -84 -a¢_MBR_GNB_ID_1 -, - -86 & -a¢_SPC_GNB_ID_¥ecs_1 - - - @GUAMI.c - -8  - ~"GUAMI.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_GUAMI_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -GUAMI -, -pLMNId’t™y -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_PLMNId’t™y -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -GUAMI -, -aMFRegiÚID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_AMFRegiÚID -, - -29 { -ATF_NOFLAGS -, 0, -off£tof -( -GUAMI -, -aMFS‘ID -), - -30 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -32 & -a¢_DEF_AMFS‘ID -, - -38 { -ATF_NOFLAGS -, 0, -off£tof -( -GUAMI -, -aMFPoš‹r -), - -39 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -41 & -a¢_DEF_AMFPoš‹r -, - -48 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_GUAMI_gs_1 -[] = { - -49 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -51 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_GUAMI_g2–_1 -[] = { - -52 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -53 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -54 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -55 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 } - -57 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_GUAMI_¥ecs_1 - = { - -58 ( -GUAMI -), - -59 -off£tof -( -GUAMI -, -_a¢_ùx -), - -60 -a¢_MAP_GUAMI_g2–_1 -, - -65 -a¢_TYPE_desütÜ_t - - ga¢_DEF_GUAMI - = { - -68 & -a¢_OP_SEQUENCE -, - -69 -a¢_DEF_GUAMI_gs_1 -, - -70 ( -a¢_DEF_GUAMI_gs_1 -) - -71 /( -a¢_DEF_GUAMI_gs_1 -[0]), - -72 -a¢_DEF_GUAMI_gs_1 -, - -73 ( -a¢_DEF_GUAMI_gs_1 -) - -74 /( -a¢_DEF_GUAMI_gs_1 -[0]), - -75 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -76 -a¢_MBR_GUAMI_1 -, - -78 & -a¢_SPC_GUAMI_¥ecs_1 - - - @GUMMEI.c - -8  - ~"GUMMEI.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_GUMMEI_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -GUMMEI -, -pLMN_Id’t™y -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_PLMNId’t™y -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -GUMMEI -, -mME_Group_ID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_MME_Group_ID -, - -29 { -ATF_NOFLAGS -, 0, -off£tof -( -GUMMEI -, -mME_Code -), - -30 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -32 & -a¢_DEF_MME_Code -, - -39 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_GUMMEI_gs_1 -[] = { - -40 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -42 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_GUMMEI_g2–_1 -[] = { - -43 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -44 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -45 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -47 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_GUMMEI_¥ecs_1 - = { - -48 ( -GUMMEI -), - -49 -off£tof -( -GUMMEI -, -_a¢_ùx -), - -50 -a¢_MAP_GUMMEI_g2–_1 -, - -55 -a¢_TYPE_desütÜ_t - - ga¢_DEF_GUMMEI - = { - -58 & -a¢_OP_SEQUENCE -, - -59 -a¢_DEF_GUMMEI_gs_1 -, - -60 ( -a¢_DEF_GUMMEI_gs_1 -) - -61 /( -a¢_DEF_GUMMEI_gs_1 -[0]), - -62 -a¢_DEF_GUMMEI_gs_1 -, - -63 ( -a¢_DEF_GUMMEI_gs_1 -) - -64 /( -a¢_DEF_GUMMEI_gs_1 -[0]), - -65 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -66 -a¢_MBR_GUMMEI_1 -, - -68 & -a¢_SPC_GUMMEI_¥ecs_1 - - - @GlobalENB-ID.c - -8  - ~"Glob®ENB-ID.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_Glob®ENB_ID_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -Glob®ENB_ID -, -pLMNId’t™y -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_PLMNId’t™y -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -Glob®ENB_ID -, -eNB_ID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_ENB_ID -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_Glob®ENB_ID_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_Glob®ENB_ID_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_Glob®ENB_ID_¥ecs_1 - = { - -38 ( -Glob®ENB_ID -), - -39 -off£tof -( -Glob®ENB_ID -, -_a¢_ùx -), - -40 -a¢_MAP_Glob®ENB_ID_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Glob®ENB_ID - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_Glob®ENB_ID_gs_1 -, - -50 ( -a¢_DEF_Glob®ENB_ID_gs_1 -) - -51 /( -a¢_DEF_Glob®ENB_ID_gs_1 -[0]), - -52 -a¢_DEF_Glob®ENB_ID_gs_1 -, - -53 ( -a¢_DEF_Glob®ENB_ID_gs_1 -) - -54 /( -a¢_DEF_Glob®ENB_ID_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_Glob®ENB_ID_1 -, - -58 & -a¢_SPC_Glob®ENB_ID_¥ecs_1 - - - @GlobalGNB-ID.c - -8  - ~"Glob®GNB-ID.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_Glob®GNB_ID_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -Glob®GNB_ID -, -pLMNId’t™y -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_PLMNId’t™y -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -Glob®GNB_ID -, -gNB_ID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_GNB_ID -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_Glob®GNB_ID_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_Glob®GNB_ID_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_Glob®GNB_ID_¥ecs_1 - = { - -38 ( -Glob®GNB_ID -), - -39 -off£tof -( -Glob®GNB_ID -, -_a¢_ùx -), - -40 -a¢_MAP_Glob®GNB_ID_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Glob®GNB_ID - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_Glob®GNB_ID_gs_1 -, - -50 ( -a¢_DEF_Glob®GNB_ID_gs_1 -) - -51 /( -a¢_DEF_Glob®GNB_ID_gs_1 -[0]), - -52 -a¢_DEF_Glob®GNB_ID_gs_1 -, - -53 ( -a¢_DEF_Glob®GNB_ID_gs_1 -) - -54 /( -a¢_DEF_Glob®GNB_ID_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_Glob®GNB_ID_1 -, - -58 & -a¢_SPC_Glob®GNB_ID_¥ecs_1 - - - @GlobalNGRANNodeID.c - -8  - ~"Glob®NGRANNodeID.h -" - -10  - ~"Glob®GNB-ID.h -" - -11  - ~"Glob®NgENB-ID.h -" - -12 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_Glob®NGRANNodeID_cÚ¡r_1 - - gCC_NOTUSED - = { - -13 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -14 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -17 -a¢_TYPE_memb”_t - - ga¢_MBR_Glob®NGRANNodeID_1 -[] = { - -18 { -ATF_POINTER -, 0, -off£tof -( -Glob®NGRANNodeID -, -choiû -. -gNB -), - -19 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -21 & -a¢_DEF_Glob®GNB_ID -, - -27 { -ATF_POINTER -, 0, -off£tof -( -Glob®NGRANNodeID -, -choiû -. -ng_eNB -), - -28 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -30 & -a¢_DEF_Glob®NgENB_ID -, - -37 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_Glob®NGRANNodeID_g2–_1 -[] = { - -38 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -39 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -41 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_Glob®NGRANNodeID_¥ecs_1 - = { - -42 ( -Glob®NGRANNodeID -), - -43 -off£tof -( -Glob®NGRANNodeID -, -_a¢_ùx -), - -44 -off£tof -( -Glob®NGRANNodeID -, -´e£Á -), - -45 ((( -Glob®NGRANNodeID - *)0)-> -´e£Á -), - -46 -a¢_MAP_Glob®NGRANNodeID_g2–_1 -, - -51 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Glob®NGRANNodeID - = { - -54 & -a¢_OP_CHOICE -, - -59 { 0, & -a¢_PER_ty³_Glob®NGRANNodeID_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -60 -a¢_MBR_Glob®NGRANNodeID_1 -, - -62 & -a¢_SPC_Glob®NGRANNodeID_¥ecs_1 - - - @GlobalNgENB-ID.c - -8  - ~"Glob®NgENB-ID.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_Glob®NgENB_ID_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -Glob®NgENB_ID -, -pLMNId’t™y -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_PLMNId’t™y -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -Glob®NgENB_ID -, -ngENB_ID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_NgENB_ID -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_Glob®NgENB_ID_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_Glob®NgENB_ID_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_Glob®NgENB_ID_¥ecs_1 - = { - -38 ( -Glob®NgENB_ID -), - -39 -off£tof -( -Glob®NgENB_ID -, -_a¢_ùx -), - -40 -a¢_MAP_Glob®NgENB_ID_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Glob®NgENB_ID - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_Glob®NgENB_ID_gs_1 -, - -50 ( -a¢_DEF_Glob®NgENB_ID_gs_1 -) - -51 /( -a¢_DEF_Glob®NgENB_ID_gs_1 -[0]), - -52 -a¢_DEF_Glob®NgENB_ID_gs_1 -, - -53 ( -a¢_DEF_Glob®NgENB_ID_gs_1 -) - -54 /( -a¢_DEF_Glob®NgENB_ID_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_Glob®NgENB_ID_1 -, - -58 & -a¢_SPC_Glob®NgENB_ID_¥ecs_1 - - - @GlobalenGNB-ID.c - -8  - ~"Glob®’GNB-ID.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_Glob®’GNB_ID_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -Glob®’GNB_ID -, -pLMN_Id’t™y -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_PLMNId’t™y -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -Glob®’GNB_ID -, -’_gNB_ID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_EN_GNB_ID -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_Glob®’GNB_ID_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_Glob®’GNB_ID_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_Glob®’GNB_ID_¥ecs_1 - = { - -38 ( -Glob®’GNB_ID -), - -39 -off£tof -( -Glob®’GNB_ID -, -_a¢_ùx -), - -40 -a¢_MAP_Glob®’GNB_ID_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Glob®’GNB_ID - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_Glob®’GNB_ID_gs_1 -, - -50 ( -a¢_DEF_Glob®’GNB_ID_gs_1 -) - -51 /( -a¢_DEF_Glob®’GNB_ID_gs_1 -[0]), - -52 -a¢_DEF_Glob®’GNB_ID_gs_1 -, - -53 ( -a¢_DEF_Glob®’GNB_ID_gs_1 -) - -54 /( -a¢_DEF_Glob®’GNB_ID_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_Glob®’GNB_ID_1 -, - -58 & -a¢_SPC_Glob®’GNB_ID_¥ecs_1 - - - @GranularityPeriod.c - -8  - ~"G¿nuÏr™yP”iod.h -" - -11 - $G¿nuÏr™yP”iod_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 1 && value <= 4294967295)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_G¿nuÏr™yP”iod_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED -, 32, -1, 1, 4294967295 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_G¿nuÏr™yP”iod_¥ecs_1 - = { - -49 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_G¿nuÏr™yP”iod_gs_1 -[] = { - -50 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -52 -a¢_TYPE_desütÜ_t - - ga¢_DEF_G¿nuÏr™yP”iod - = { - -55 & -a¢_OP_N©iveIÁeg” -, - -56 -a¢_DEF_G¿nuÏr™yP”iod_gs_1 -, - -57 ( -a¢_DEF_G¿nuÏr™yP”iod_gs_1 -) - -58 /( -a¢_DEF_G¿nuÏr™yP”iod_gs_1 -[0]), - -59 -a¢_DEF_G¿nuÏr™yP”iod_gs_1 -, - -60 ( -a¢_DEF_G¿nuÏr™yP”iod_gs_1 -) - -61 /( -a¢_DEF_G¿nuÏr™yP”iod_gs_1 -[0]), - -62 { 0, & -a¢_PER_ty³_G¿nuÏr™yP”iod_cÚ¡r_1 -, -G¿nuÏr™yP”iod_cÚ¡¿št - }, - -64 & -a¢_SPC_G¿nuÏr™yP”iod_¥ecs_1 - - - @GroupID.c - -8  - ~"GroupID.h -" - -10  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_GroupID_cÚ¡r_1 - - gCC_NOTUSED - = { - -11 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -15  -a¢_TYPE_memb”_t - - ga¢_MBR_GroupID_1 -[] = { - -16 { -ATF_NOFLAGS -, 0, -off£tof -( -GroupID -, -choiû -. -fiveGC -), - -17 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -19 & -a¢_DEF_FiveQI -, - -25 { -ATF_NOFLAGS -, 0, -off£tof -( -GroupID -, -choiû -. -ePC -), - -26 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -28 & -a¢_DEF_QCI -, - -35 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_GroupID_g2–_1 -[] = { - -36 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -37 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -39  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_GroupID_¥ecs_1 - = { - -40 ( -GroupID -), - -41 -off£tof -( -GroupID -, -_a¢_ùx -), - -42 -off£tof -( -GroupID -, -´e£Á -), - -43 ((( -GroupID - *)0)-> -´e£Á -), - -44 -a¢_MAP_GroupID_g2–_1 -, - -49 -a¢_TYPE_desütÜ_t - - ga¢_DEF_GroupID - = { - -52 & -a¢_OP_CHOICE -, - -57 { 0, & -a¢_PER_ty³_GroupID_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -58 -a¢_MBR_GroupID_1 -, - -60 & -a¢_SPC_GroupID_¥ecs_1 - - - @INTEGER.c - -6  - ~ - -7  - ~ - -8  - ~ - -9  - ~<”ºo.h -> - -14 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_INTEGER_gs -[] = { - -15 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -17 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_INTEGER - = { - -18 -INTEGER_ä“ -, - -19 -INTEGER_´št -, - -20 -INTEGER_com·» -, - -21 -b”_decode_´im™ive -, - -22 -INTEGER_’code_d” -, - -23 -INTEGER_decode_x” -, - -24 -INTEGER_’code_x” -, - -25 #ifdeà -ASN_DISABLE_OER_SUPPORT - - -29 -INTEGER_decode_Ûr -, - -30 -INTEGER_’code_Ûr -, - -32 #ifdef -ASN_DISABLE_PER_SUPPORT - - -38 -INTEGER_decode_u³r -, - -39 -INTEGER_’code_u³r -, - -40 -INTEGER_decode_­” -, - -41 -INTEGER_’code_­” -, - -43 -INTEGER_¿ndom_fžl -, - -46 -a¢_TYPE_desütÜ_t - - ga¢_DEF_INTEGER - = { - -49 & -a¢_OP_INTEGER -, - -50 -a¢_DEF_INTEGER_gs -, - -51 ( -a¢_DEF_INTEGER_gs -) / (asn_DEF_INTEGER_tags[0]), - -52 -a¢_DEF_INTEGER_gs -, - -53 ( -a¢_DEF_INTEGER_gs -) / (asn_DEF_INTEGER_tags[0]), - -54 { 0, 0, -a¢_g’”ic_no_cÚ¡¿št - }, - -62 -a¢_’c_rv®_t - - -63 - $INTEGER_’code_d” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -64  -g_mode -, -b”_Žv_g_t - -g -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -65 * -­p_key -) { - -66 cÚ¡ -INTEGER_t - * -¡ - = (cÚ¡ INTEGER_ˆ*) -¥Œ -; - -67 -a¢_’c_rv®_t - -rv® -; - -68 -INTEGER_t - -efãùive_š‹g” -; - -70 - `ASN_DEBUG -("%s %s‡s INTEGER (tm=%d)", - -71 -cb -?"Encodšg":"E¡im©šg", -td --> -Çme -, -g_mode -); - -77 if( -¡ --> -buf -) { - -78 -ušt8_t - * -buf - = -¡ -->buf; - -79 -ušt8_t - * -’d1 - = -buf - + -¡ --> -size - - 1; - -80  -shiá -; - -83 ; -buf - < -’d1 -; buf++) { - -91 * -buf -) { - -92 0x00: if(( -buf -[1] & 0x80) == 0) - -95 0xff: if(( -buf -[1] & 0x80)) - -103 -shiá - = -buf - - -¡ -->buf; - -104 if( -shiá -) { - -106 cÚ¡ -ušt8_t - * -c_buf -; - -107 -ušt8_t - * -nc_buf -; - -108 } -uncÚ¡ -; - -109 -uncÚ¡ -. -c_buf - = -¡ --> -buf -; - -110 -efãùive_š‹g” -. -buf - = -uncÚ¡ -. -nc_buf - + -shiá -; - -111 -efãùive_š‹g” -. -size - = -¡ -->siz- -shiá -; - -113 -¡ - = & -efãùive_š‹g” -; - -117 -rv® - = - `d”_’code_´im™ive -( -td -, -¡ -, -g_mode -, -g -, -cb -, -­p_key -); - -118 if( -rv® -. -¡ruùu»_±r - =ð& -efãùive_š‹g” -) { - -119 -rv® -. -¡ruùu»_±r - = -¥Œ -; - -121  -rv® -; - -122 - } -} - -124 cÚ¡ -a¢_INTEGER_’um_m­_t - * -INTEGER_m­_’um2v®ue -( - -125 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs -, cÚ¡ * -l¡¬t -, - -126 cÚ¡ * -l¡Ý -); - -131  -ssize_t - - -132 - $INTEGER__dump -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ -INTEGER_t - * -¡ -, -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -,  -¶ašOrXER -) { - -133 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -134 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -135  -sü©ch -[32]; - -136 -ušt8_t - * -buf - = -¡ -->buf; - -137 -ušt8_t - * -buf_’d - = -¡ --> -buf - + st-> -size -; - -138 -štmax_t - -v®ue -; - -139 -ssize_t - -wrÙe - = 0; - -140 * -p -; - -141  -»t -; - -143 if( -¥ecs - && s³cs-> -f›ld_unsigÃd -) - -144 -»t - = - `a¢_INTEGER2umax -( -¡ -, ( -uštmax_t - *)& -v®ue -); - -146 -»t - = - `a¢_INTEGER2imax -( -¡ -, & -v®ue -); - -149 if( -»t - == 0) { - -150 cÚ¡ -a¢_INTEGER_’um_m­_t - * -– -; - -151 -– - = ( -v®ue - >ð0 || ! -¥ecs - || !¥ecs-> -f›ld_unsigÃd -) - -152 ? - `INTEGER_m­_v®ue2’um -( -¥ecs -, -v®ue -) : 0; - -153 if( -– -) { - -154 if( -¶ašOrXER - == 0) - -155  - `a¢__fÜm©_to_ÿÎback -( -cb -, -­p_key -, - -156 "%" -ASN_PRIdMAX - " (%s)", -v®ue -, -– --> -’um_Çme -); - -158  - `a¢__fÜm©_to_ÿÎback -( -cb -, -­p_key -, - -159 "<%s/>", -– --> -’um_Çme -); - -160 } if( -¶ašOrXER - && -¥ecs - && s³cs-> -¡riù_’um”©iÚ -) { - -161 - `ASN_DEBUG -("ASN.1 forbids dealing with " - -163 -”ºo - = -EPERM -; - -166  - `a¢__fÜm©_to_ÿÎback -( -cb -, -­p_key -, - -167 ( -¥ecs - && s³cs-> -f›ld_unsigÃd -) - -168 ? "%" -ASN_PRIuMAX - - -169 : "%" -ASN_PRIdMAX -, - -170 -v®ue -); - -172 } if( -¶ašOrXER - && -¥ecs - && s³cs-> -¡riù_’um”©iÚ -) { - -177 - `ASN_DEBUG -("ASN.1 forbids dealing with " - -179 -”ºo - = -EPERM -; - -185  -p - = -sü©ch -; -buf - < -buf_’d -; buf++) { - -186 cÚ¡ * cÚ¡ -h2c - = "0123456789ABCDEF"; - -187 if(( -p - - -sü©ch -è>ð( -ssize_t -)((scratch) - 4)) { - -189 if( - `cb -( -sü©ch -, -p - - sü©ch, -­p_key -) < 0) - -191 -wrÙe - +ð -p - - -sü©ch -; - -192 -p - = -sü©ch -; - -194 * -p -++ = -h2c -[* -buf - >> 4]; - -195 * -p -++ = -h2c -[* -buf - & 0x0F]; - -196 * -p -++ = 0x3a; - -198 if( -p - !ð -sü©ch -) - -199 -p ---; - -201 -wrÙe - +ð -p - - -sü©ch -; - -202  ( - `cb -( -sü©ch -, -p - - sü©ch, -­p_key -è< 0è? -1 : -wrÙe -; - -203 - } -} - -209 - $INTEGER_´št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -210 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -211 cÚ¡ -INTEGER_t - * -¡ - = (cÚ¡ INTEGER_ˆ*) -¥Œ -; - -212 -ssize_t - -»t -; - -214 () -žev– -; - -216 if(! -¡ - || !¡-> -buf -) - -217 -»t - = - `cb -("", 8, -­p_key -); - -219 -»t - = - `INTEGER__dump -( -td -, -¡ -, -cb -, -­p_key -, 0); - -221  ( -»t - < 0) ? -1 : 0; - -222 - } -} - -224  - se2v_key - { - -225 cÚ¡ * - m¡¬t -; - -226 cÚ¡ * - m¡Ý -; - -227 cÚ¡ -a¢_INTEGER_’um_m­_t - * - mvem­ -; - -228 cÚ¡ * - mevm­ -; - -231 - $INTEGER__com·r_’um2v®ue -(cÚ¡ * -kp -, cÚ¡ * -am -) { - -232 cÚ¡  -e2v_key - * -key - = (cÚ¡ e2v_key *) -kp -; - -233 cÚ¡ -a¢_INTEGER_’um_m­_t - * -– - = (cÚ¡‡¢_INTEGER_’um_m­_ˆ*) -am -; - -234 cÚ¡ * -±r -, * -’d -, * -Çme -; - -237 -– - = -key --> -vem­ - + key-> -evm­ -[el - key->vemap]; - -240  -±r - = -key --> -¡¬t -, -’d - = key-> -¡Ý -, -Çme - = -– --> -’um_Çme -; - -241 -±r - < -’d -;…Œ++, -Çme -++) { - -242 if(* -±r - !ð* -Çme - || !*name) - -243  *(cÚ¡ *) -±r - - -244 - *(cÚ¡ *) -Çme -; - -246  -Çme -[0] ? -1 : 0; - -247 - } -} - -249 cÚ¡ -a¢_INTEGER_’um_m­_t - * - -250 - $INTEGER_m­_’um2v®ue -(cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs -, cÚ¡ * -l¡¬t -, - -251 cÚ¡ * -l¡Ý -) { - -252 cÚ¡ -a¢_INTEGER_’um_m­_t - * -–_found -; - -253  -couÁ - = -¥ecs - ? s³cs-> -m­_couÁ - : 0; - -254  -e2v_key - -key -; - -255 cÚ¡ * -Í -; - -257 if(! -couÁ -è -NULL -; - -261  -l¡¬t -++, -Í - =†¡¬t;†°< -l¡Ý -;†p++) { - -262 * -Í -) { - -271 if( -Í - =ð -l¡Ý -è -NULL -; - -272 -l¡Ý - = -Í -; - -274 -key -. -¡¬t - = -l¡¬t -; - -275 -key -. -¡Ý - = -l¡Ý -; - -276 -key -. -vem­ - = -¥ecs --> -v®ue2’um -; - -277 -key -. -evm­ - = -¥ecs --> -’um2v®ue -; - -278 -–_found - = ( -a¢_INTEGER_’um_m­_t - *) - `b£¬ch -(& -key -, - -279 -¥ecs --> -v®ue2’um -, -couÁ -, (specs->value2enum[0]), - -280 -INTEGER__com·r_’um2v®ue -); - -281 if( -–_found -) { - -283 -–_found - = -key -. -vem­ - + key. -evm­ -[el_found - key.vemap]; - -285  -–_found -; - -286 - } -} - -289 - $INTEGER__com·r_v®ue2’um -(cÚ¡ * -kp -, cÚ¡ * -am -) { - -290  -a - = *(cÚ¡ *) -kp -; - -291 cÚ¡ -a¢_INTEGER_’um_m­_t - * -– - = (cÚ¡‡¢_INTEGER_’um_m­_ˆ*) -am -; - -292  -b - = -– --> -Çt_v®ue -; - -293 if( -a - < -b -)  -1; - -294 if( -a - =ð -b -)  0; - -296 - } -} - -298 cÚ¡ -a¢_INTEGER_’um_m­_t - * - -299 - $INTEGER_m­_v®ue2’um -(cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs -,  -v®ue -) { - -300  -couÁ - = -¥ecs - ? s³cs-> -m­_couÁ - : 0; - -301 if(! -couÁ -)  0; - -302  ( -a¢_INTEGER_’um_m­_t - *) - `b£¬ch -(& -v®ue -, -¥ecs --> -v®ue2’um -, - -303 -couÁ -, ( -¥ecs --> -v®ue2’um -[0]), - -304 -INTEGER__com·r_v®ue2’um -); - -305 - } -} - -308 - $INTEGER_¡_´—Îoc -( -INTEGER_t - * -¡ -,  -mš_size -) { - -309 * -p - = - `MALLOC -( -mš_size - + 1); - -310 if( -p -) { - -311 * -b - = -¡ --> -buf -; - -312 -¡ --> -size - = 0; - -313 -¡ --> -buf - = -p -; - -314 - `FREEMEM -( -b -); - -319 - } -} - -324  -x”_pbd_rv® - - -325 - $INTEGER__x”_body_decode -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -326 cÚ¡ * -chunk_buf -, -size_t - -chunk_size -) { - -327 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -328 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -329 -INTEGER_t - * -¡ - = (INTEGER_ˆ*) -¥Œ -; - -330 -štmax_t - -dec_v®ue -; - -331 -štmax_t - -hex_v®ue - = 0; - -332 cÚ¡ * -Í -; - -333 cÚ¡ * -l¡¬t - = (cÚ¡ *) -chunk_buf -; - -334 cÚ¡ * -l¡Ý - = -l¡¬t - + -chunk_size -; - -336 -ST_LEADSPACE -, - -337 -ST_SKIPSPHEX -, - -338 -ST_WAITDIGITS -, - -339 -ST_DIGITS -, - -340 -ST_DIGITS_TRAILSPACE -, - -341 -ST_HEXDIGIT1 -, - -342 -ST_HEXDIGIT2 -, - -343 -ST_HEXDIGITS_TRAILSPACE -, - -344 -ST_HEXCOLON -, - -345 -ST_END_ENUM -, - -346 -ST_UNEXPECTED - - -347 } -¡©e - = -ST_LEADSPACE -; - -348 cÚ¡ * -dec_v®ue_¡¬t - = 0; - -349 cÚ¡ * -dec_v®ue_’d - = 0; - -351 if( -chunk_size -) - -352 - `ASN_DEBUG -("INTEGER body %ld 0x%2x..0x%2x", - -353 () -chunk_size -, * -l¡¬t -, -l¡Ý -[-1]); - -355 if( - `INTEGER_¡_´—Îoc -( -¡ -, ( -chunk_size -/3) + 1)) - -356  -XPBD_SYSTEM_FAILURE -; - -362  -Í - = -l¡¬t -;†°< -l¡Ý -;†p++) { - -363  -lv - = * -Í -; - -364  -lv -) { - -366  -¡©e -) { - -367  -ST_LEADSPACE -: - -368  -ST_DIGITS_TRAILSPACE -: - -369  -ST_HEXDIGITS_TRAILSPACE -: - -370  -ST_SKIPSPHEX -: - -372  -ST_DIGITS -: - -373 -dec_v®ue_’d - = -Í -; - -374 -¡©e - = -ST_DIGITS_TRAILSPACE -; - -376  -ST_HEXCOLON -: - -377 -¡©e - = -ST_HEXDIGITS_TRAILSPACE -; - -384 if( -¡©e - =ð -ST_LEADSPACE -) { - -385 -dec_v®ue - = 0; - -386 -dec_v®ue_¡¬t - = -Í -; - -387 -¡©e - = -ST_WAITDIGITS -; - -392 if( -¡©e - =ð -ST_LEADSPACE -) { - -393 -dec_v®ue - = 0; - -394 -dec_v®ue_¡¬t - = -Í -; - -395 -¡©e - = -ST_WAITDIGITS -; - -401  -¡©e -) { - -402  -ST_DIGITS -: ; - -403  -ST_SKIPSPHEX -: - -404  -ST_HEXDIGIT1 -: - -405 -hex_v®ue - = ( -lv - - 0x30) << 4; - -406 -¡©e - = -ST_HEXDIGIT2 -; - -408  -ST_HEXDIGIT2 -: - -409 -hex_v®ue - +ð( -lv - - 0x30); - -410 -¡©e - = -ST_HEXCOLON -; - -411 -¡ --> -buf -[¡-> -size -++] = ( -ušt8_t -) -hex_v®ue -; - -413  -ST_HEXCOLON -: - -414  -XPBD_BROKEN_ENCODING -; - -415  -ST_LEADSPACE -: - -416 -dec_v®ue - = 0; - -417 -dec_v®ue_¡¬t - = -Í -; - -419  -ST_WAITDIGITS -: - -420 -¡©e - = -ST_DIGITS -; - -427 if( -¡©e - =ð -ST_LEADSPACE -) { - -428 cÚ¡ -a¢_INTEGER_’um_m­_t - * -– -; - -429 -– - = - `INTEGER_m­_’um2v®ue -( - -430 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) - -431 -td --> -¥ecifics -, -l¡¬t -, -l¡Ý -); - -432 if( -– -) { - -433 - `ASN_DEBUG -("Found \"%s\" => %ld", - -434 -– --> -’um_Çme -,ƒl-> -Çt_v®ue -); - -435 -dec_v®ue - = -– --> -Çt_v®ue -; - -436 -¡©e - = -ST_END_ENUM -; - -437 -Í - = -l¡Ý - - 1; - -440 - `ASN_DEBUG -("Unknown identifier for INTEGER"); - -442  -XPBD_BROKEN_ENCODING -; - -444 if( -¡©e - =ð -ST_HEXCOLON -) { - -446 -¡©e - = -ST_HEXDIGIT1 -; - -448 } if( -¡©e - =ð -ST_DIGITS -) { - -453 - `ASN_DEBUG -("INTEGER„e-evaluate‡s hex form"); - -454 -¡©e - = -ST_SKIPSPHEX -; - -455 -dec_v®ue_¡¬t - = 0; - -456 -Í - = -l¡¬t - - 1; - -459 - `ASN_DEBUG -("¡©%d‡ˆ%ld", -¡©e -, ()( -Í - - -l¡¬t -)); - -465  -¡©e -) { - -466  -ST_SKIPSPHEX -: - -467  -ST_LEADSPACE -: - -468  -ST_HEXDIGIT1 -: - -469 -hex_v®ue - = -lv - - ((lv < 0x61) ? 0x41 : 0x61); - -470 -hex_v®ue - += 10; - -471 -hex_v®ue - <<= 4; - -472 -¡©e - = -ST_HEXDIGIT2 -; - -474  -ST_HEXDIGIT2 -: - -475 -hex_v®ue - +ð -lv - - ((lv < 0x61) ? 0x41 : 0x61); - -476 -hex_v®ue - += 10; - -477 -¡ --> -buf -[¡-> -size -++] = ( -ušt8_t -) -hex_v®ue -; - -478 -¡©e - = -ST_HEXCOLON -; - -480  -ST_DIGITS -: - -481 - `ASN_DEBUG -("INTEGER„e-evaluate‡s hex form"); - -482 -¡©e - = -ST_SKIPSPHEX -; - -483 -dec_v®ue_¡¬t - = 0; - -484 -Í - = -l¡¬t - - 1; - -493 - `ASN_DEBUG -("INTEGER :: Found‚on-numeric 0x%2x‡t %ld", - -494 -lv -, ()( -Í - - -l¡¬t -)); - -495 -¡©e - = -ST_UNEXPECTED -; - -499  -¡©e -) { - -500  -ST_END_ENUM -: - -503  -ST_DIGITS -: - -504 -dec_v®ue_’d - = -l¡Ý -; - -506  -ST_DIGITS_TRAILSPACE -: - -508  - `a¢_¡¹oimax_lim -( -dec_v®ue_¡¬t -, & -dec_v®ue_’d -, & -dec_v®ue -)) { - -509  -ASN_STRTOX_OK -: - -510 if( -¥ecs - && s³cs-> -f›ld_unsigÃd - && ( -uštmax_t -è -dec_v®ue - <ð -ULONG_MAX -) { - -512 } if( -dec_v®ue - >ð -LONG_MIN - && dec_v®u<ð -LONG_MAX -) { - -519 - `ASN_DEBUG -("INTEGERƒxceeds†ong„ange"); - -522  -ASN_STRTOX_ERROR_RANGE -: - -523 - `ASN_DEBUG -("INTEGER decod% h™„ªglim™", -td --> -Çme -); - -524  -XPBD_DECODER_LIMIT -; - -525  -ASN_STRTOX_ERROR_INVAL -: - -526  -ASN_STRTOX_EXPECT_MORE -: - -527  -ASN_STRTOX_EXTRA_DATA -: - -528  -XPBD_BROKEN_ENCODING -; - -531  -ST_HEXCOLON -: - -532  -ST_HEXDIGITS_TRAILSPACE -: - -533 -¡ --> -buf -[¡-> -size -] = 0; - -534  -XPBD_BODY_CONSUMED -; - -535  -ST_HEXDIGIT1 -: - -536  -ST_HEXDIGIT2 -: - -537  -ST_SKIPSPHEX -: - -538  -XPBD_BROKEN_ENCODING -; - -539  -ST_LEADSPACE -: - -541  -XPBD_NOT_BODY_IGNORE -; - -542  -ST_WAITDIGITS -: - -543  -ST_UNEXPECTED -: - -544 - `ASN_DEBUG -("INTEGER: NØu£fuÈdig™ (¡©%d)", -¡©e -); - -545  -XPBD_BROKEN_ENCODING -; - -552 if( - `a¢_imax2INTEGER -( -¡ -, -dec_v®ue -)) { - -553 - `ASN_DEBUG -("INTEGER decod% cÚv”siÚ fažed", -td --> -Çme -); - -554  -XPBD_SYSTEM_FAILURE -; - -557  -XPBD_BODY_CONSUMED -; - -558 - } -} - -560 -a¢_dec_rv®_t - - -561 - $INTEGER_decode_x” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -562 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -563 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, -size_t - -size -) { - -564  - `x”_decode_´im™ive -( -Ýt_codec_ùx -, -td -, - -565 -¥Œ -, ( -INTEGER_t -), -Ýt_mÇme -, - -566 -buf_±r -, -size -, -INTEGER__x”_body_decode -); - -567 - } -} - -569 -a¢_’c_rv®_t - - -570 - $INTEGER_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -571  -žev– -, -x”_’cod”_æags_e - -æags -, - -572 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -573 cÚ¡ -INTEGER_t - * -¡ - = (cÚ¡ INTEGER_ˆ*) -¥Œ -; - -574 -a¢_’c_rv®_t - -” - = {0,0,0}; - -576 () -žev– -; - -577 () -æags -; - -579 if(! -¡ - || !¡-> -buf -) - -580 -ASN__ENCODE_FAILED -; - -582 -” -. -’coded - = - `INTEGER__dump -( -td -, -¡ -, -cb -, -­p_key -, 1); - -583 if( -” -. -’coded - < 0è -ASN__ENCODE_FAILED -; - -585 - `ASN__ENCODED_OK -( -” -); - -586 - } -} - -588 #iâdef -ASN_DISABLE_PER_SUPPORT - - -590 -a¢_dec_rv®_t - - -591 - $INTEGER_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -592 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -593 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -594 -a¢_³r_d©a_t - * -pd -) { - -595 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -596 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -597 -a¢_dec_rv®_t - -rv® - = { -RC_OK -, 0 }; - -598 -INTEGER_t - * -¡ - = (INTEGER_ˆ*)* -¥Œ -; - -599 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -600  -»³© -; - -602 () -Ýt_codec_ùx -; - -604 if(! -¡ -) { - -605 -¡ - = ( -INTEGER_t - *)(* -¥Œ - = - `CALLOC -(1, (*st))); - -606 if(! -¡ -è -ASN__DECODE_FAILED -; - -609 if(! -cÚ¡¿šts -ècÚ¡¿št ð -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -; - -610 -ù - = -cÚ¡¿šts - ? &cÚ¡¿šts-> -v®ue - : 0; - -612 if( -ù - && ct-> -æags - & -APC_EXTENSIBLE -) { - -613  -šext - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -614 if( -šext - < 0è -ASN__DECODE_STARVED -; - -615 if( -šext -è -ù - = 0; - -618 - `FREEMEM -( -¡ --> -buf -); - -619 -¡ --> -buf - = 0; - -620 -¡ --> -size - = 0; - -621 if( -ù -) { - -622 if( -ù --> -æags - & -APC_SEMI_CONSTRAINED -) { - -623 -¡ --> -buf - = ( -ušt8_t - *) - `CALLOC -(1, 2); - -624 if(! -¡ --> -buf -è -ASN__DECODE_FAILED -; - -625 -¡ --> -size - = 1; - -626 } if( -ù --> -æags - & -APC_CONSTRAINED - && ct-> -¿nge_b™s - >= 0) { - -627 -size_t - -size - = ( -ù --> -¿nge_b™s - + 7) >> 3; - -628 -¡ --> -buf - = ( -ušt8_t - *) - `MALLOC -(1 + -size - + 1); - -629 if(! -¡ --> -buf -è -ASN__DECODE_FAILED -; - -630 -¡ --> -size - = size; - -635 if( -ù - && ct-> -æags - !ð -APC_UNCONSTRAINED -) { - -637 - `ASN_DEBUG -("IÁeg” w™h„ªg%d b™s", -ù --> -¿nge_b™s -); - -638 if( -ù --> -¿nge_b™s - >= 0) { - -639 if(( -size_t -) -ù --> -¿nge_b™s - > 8 * ()) - -640 -ASN__DECODE_FAILED -; - -642 if( -¥ecs - && s³cs-> -f›ld_unsigÃd -) { - -643  -uv®ue - = 0; - -644 if( - `u³r_g‘_cÚ¡¿šed_whÞe_numb” -( -pd -, - -645 & -uv®ue -, -ù --> -¿nge_b™s -)) - -646 -ASN__DECODE_STARVED -; - -647 - `ASN_DEBUG -("Got value %lu +†ow %ld", - -648 -uv®ue -, -ù --> -low”_bound -); - -649 -uv®ue - +ð -ù --> -low”_bound -; - -650 if( - `a¢_ulÚg2INTEGER -( -¡ -, -uv®ue -)) - -651 -ASN__DECODE_FAILED -; - -653  -uv®ue - = 0; - -654  -sv®ue -; - -655 if( - `u³r_g‘_cÚ¡¿šed_whÞe_numb” -( -pd -, - -656 & -uv®ue -, -ù --> -¿nge_b™s -)) - -657 -ASN__DECODE_STARVED -; - -658 - `ASN_DEBUG -("Got value %lu +†ow %ld", - -659 -uv®ue -, -ù --> -low”_bound -); - -660 if( - `³r_lÚg_¿nge_uÄeba£ -( -uv®ue -, -ù --> -low”_bound -, - -661 -ù --> -uµ”_bound -, & -sv®ue -) - -662 || - `a¢_lÚg2INTEGER -( -¡ -, -sv®ue -)) { - -663 -ASN__DECODE_FAILED -; - -666  -rv® -; - -669 - `ASN_DEBUG -("Decodšg uncÚ¡¿šed iÁeg” %s", -td --> -Çme -); - -674 -ssize_t - -Ën - = 0; - -675 * -p - = -NULL -; - -676  -»t - = 0; - -679 -Ën - = - `u³r_g‘_Ëngth -( -pd -, -1, 0, & -»³© -); - -680 if( -Ën - < 0è -ASN__DECODE_STARVED -; - -682 -p - = - `REALLOC -( -¡ --> -buf -, st-> -size - + -Ën - + 1); - -683 if(! -p -è -ASN__DECODE_FAILED -; - -684 -¡ --> -buf - = ( -ušt8_t - *) -p -; - -686 -»t - = - `³r_g‘_mªy_b™s -( -pd -, & -¡ --> -buf -[¡-> -size -], 0, 8 * -Ën -); - -687 if( -»t - < 0è -ASN__DECODE_STARVED -; - -688 -¡ --> -size - +ð -Ën -; - -689 }  -»³© -); - -690 -¡ --> -buf -[¡-> -size -] = 0; - -693 if( -ù - && ct-> -low”_bound -) { - -697  -v®ue - = 0; - -698 if( - `a¢_INTEGER2lÚg -( -¡ -, & -v®ue -)) - -699 -ASN__DECODE_FAILED -; - -700 if( - `a¢_imax2INTEGER -( -¡ -, -v®ue - + -ù --> -low”_bound -)) - -701 -ASN__DECODE_FAILED -; - -704  -rv® -; - -705 - } -} - -707 -a¢_’c_rv®_t - - -708 - $INTEGER_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -709 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -710 -a¢_³r_ou_t - * -po -) { - -711 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -712 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -713 -a¢_’c_rv®_t - -” - = {0,0,0}; - -714 cÚ¡ -INTEGER_t - * -¡ - = (cÚ¡ INTEGER_ˆ*) -¥Œ -; - -715 cÚ¡ -ušt8_t - * -buf -; - -716 cÚ¡ -ušt8_t - * -’d -; - -717 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -718  -v®ue - = 0; - -720 if(! -¡ - || st-> -size - =ð0è -ASN__ENCODE_FAILED -; - -722 if(! -cÚ¡¿šts -ècÚ¡¿št ð -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -; - -723 -ù - = -cÚ¡¿šts - ? &cÚ¡¿šts-> -v®ue - : 0; - -725 -” -. -’coded - = 0; - -727 if( -ù -) { - -728  -šext - = 0; - -729 if( -¥ecs - && s³cs-> -f›ld_unsigÃd -) { - -730  -uv® -; - -731 if( - `a¢_INTEGER2ulÚg -( -¡ -, & -uv® -)) - -732 -ASN__ENCODE_FAILED -; - -734 if( -ù --> -æags - & -APC_SEMI_CONSTRAINED -) { - -735 if( -uv® - < () -ù --> -low”_bound -) - -736 -šext - = 1; - -737 } if( -ù --> -¿nge_b™s - >= 0) { - -738 if( -uv® - < () -ù --> -low”_bound - - -739 || -uv® - > () -ù --> -uµ”_bound -) - -740 -šext - = 1; - -742 - `ASN_DEBUG -("V®u%lu (%02x/%" -ASN_PRI_SIZE - ")†b %lu ub %lu %s", - -743 -uv® -, -¡ --> -buf -[0], st-> -size -, - -744 -ù --> -low”_bound -, ct-> -uµ”_bound -, - -745 -šext - ? "ext" : "fix"); - -746 -v®ue - = -uv® -; - -748 if( - `a¢_INTEGER2lÚg -( -¡ -, & -v®ue -)) - -749 -ASN__ENCODE_FAILED -; - -751 if( -ù --> -æags - & -APC_SEMI_CONSTRAINED -) { - -752 if( -v®ue - < -ù --> -low”_bound -) - -753 -šext - = 1; - -754 } if( -ù --> -¿nge_b™s - >= 0) { - -755 if( -v®ue - < -ù --> -low”_bound - - -756 || -v®ue - > -ù --> -uµ”_bound -) - -757 -šext - = 1; - -759 - `ASN_DEBUG -("V®u%ld (%02x/%" -ASN_PRI_SIZE - ")†b %ld ub %ld %s", - -760 -v®ue -, -¡ --> -buf -[0], st-> -size -, - -761 -ù --> -low”_bound -, ct-> -uµ”_bound -, - -762 -šext - ? "ext" : "fix"); - -764 if( -ù --> -æags - & -APC_EXTENSIBLE -) { - -765 if( - `³r_put_ãw_b™s -( -po -, -šext -, 1)) - -766 -ASN__ENCODE_FAILED -; - -767 if( -šext -è -ù - = 0; - -768 } if( -šext -) { - -769 -ASN__ENCODE_FAILED -; - -775 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -776  -v -; - -778 - `ASN_DEBUG -("Encoding integer %ld (%lu) with„ange %d bits", - -779 -v®ue -, v®u- -ù --> -low”_bound -, ct-> -¿nge_b™s -); - -780 if( -¥ecs - && s³cs-> -f›ld_unsigÃd -) { - -781 iàÐ(() -ù --> -low”_bound - > ()(ù-> -uµ”_bound -) - -782 || (() -v®ue - < () -ù --> -low”_bound -)) - -783 || (() -v®ue - > () -ù --> -uµ”_bound -) - -785 - `ASN_DEBUG -("Value %luo-be-encoded is outsidehe bounds [%lu, %lu]!", - -786 -v®ue -, -ù --> -low”_bound -, ct-> -uµ”_bound -); - -787 -ASN__ENCODE_FAILED -; - -789 -v - = () -v®ue - - () -ù --> -low”_bound -; - -791 if( - `³r_lÚg_¿nge_»ba£ -( -v®ue -, -ù --> -low”_bound -, ct-> -uµ”_bound -, & -v -)) { - -792 -ASN__ENCODE_FAILED -; - -795 if( - `u³r_put_cÚ¡¿šed_whÞe_numb”_u -( -po -, -v -, -ù --> -¿nge_b™s -)) - -796 -ASN__ENCODE_FAILED -; - -797 - `ASN__ENCODED_OK -( -” -); - -800 if( -ù - && ct-> -low”_bound -) { - -801 - `ASN_DEBUG -("Adju¡†ow” boundØ%ld", -ù --> -low”_bound -); - -803 -ASN__ENCODE_FAILED -; - -806  -buf - = -¡ -->buf, -’d - = st->buà+ st-> -size -; buf <ƒnd;) { - -807  -Ãed_eom - = 0; - -808 -ssize_t - -mayEncode - = - `u³r_put_Ëngth -( -po -, -’d - - -buf -, & -Ãed_eom -); - -809 if( -mayEncode - < 0) - -810 -ASN__ENCODE_FAILED -; - -811 if( - `³r_put_mªy_b™s -( -po -, -buf -, 8 * -mayEncode -)) - -812 -ASN__ENCODE_FAILED -; - -813 -buf - +ð -mayEncode -; - -814 if( -Ãed_eom - && - `u³r_put_Ëngth -( -po -, 0, 0)è -ASN__ENCODE_FAILED -; - -817 - `ASN__ENCODED_OK -( -” -); - -818 - } -} - -820 -a¢_dec_rv®_t - - -821 - $INTEGER_decode_­” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -822 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -823 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -824 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_INTEGER_¥ecifics_ˆ*) -td --> -¥ecifics -; - -825 -a¢_dec_rv®_t - -rv® - = { -RC_OK -, 0 }; - -826 -INTEGER_t - * -¡ - = (INTEGER_ˆ*)* -¥Œ -; - -827 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -828  -»³© -; - -830 () -Ýt_codec_ùx -; - -832 if(! -¡ -) { - -833 -¡ - = ( -INTEGER_t - *)(* -¥Œ - = - `CALLOC -(1, (*st))); - -834 if(! -¡ -è -ASN__DECODE_FAILED -; - -837 if(! -cÚ¡¿šts -ècÚ¡¿št ð -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -; - -838 -ù - = -cÚ¡¿šts - ? &cÚ¡¿šts-> -v®ue - : 0; - -840 if( -ù - && ct-> -æags - & -APC_EXTENSIBLE -) { - -841  -šext - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -842 if( -šext - < 0è -ASN__DECODE_STARVED -; - -843 if( -šext -è -ù - = 0; - -846 - `FREEMEM -( -¡ --> -buf -); - -847 -¡ --> -buf - = 0; - -848 -¡ --> -size - = 0; - -849 if( -ù -) { - -850 if( -ù --> -æags - & -APC_SEMI_CONSTRAINED -) { - -851 -¡ --> -buf - = ( -ušt8_t - *) - `CALLOC -(1, 2); - -852 if(! -¡ --> -buf -è -ASN__DECODE_FAILED -; - -853 -¡ --> -size - = 1; - -854 } if( -ù --> -æags - & -APC_CONSTRAINED - && ct-> -¿nge_b™s - >= 0) { - -855 -size_t - -size - = ( -ù --> -¿nge_b™s - + 7) >> 3; - -856 -¡ --> -buf - = ( -ušt8_t - *) - `MALLOC -(1 + -size - + 1); - -857 if(! -¡ --> -buf -è -ASN__DECODE_FAILED -; - -858 -¡ --> -size - = size; - -863 if( -ù - && ct-> -æags - !ð -APC_UNCONSTRAINED -) { - -865 - `ASN_DEBUG -("IÁeg” w™h„ªg%d b™s", -ù --> -¿nge_b™s -); - -866 if( -ù --> -¿nge_b™s - >= 0) { - -867 ià( -ù --> -¿nge_b™s - > 16) { - -868  -max_¿nge_by‹s - = ( -ù --> -¿nge_b™s - >> 3) + - -869 ((( -ù --> -¿nge_b™s - % 8) > 0) ? 1 : 0); - -870  -Ëngth - = 0, -i -; - -871  -v®ue - = 0; - -873  -i - = 1; ; i++) { - -874  -uµ” - = 1 << -i -; - -875 ià( -uµ” - >ð -max_¿nge_by‹s -) - -878 - `ASN_DEBUG -("Cªƒncod%d (%d by‹sèš %d b™s", -ù --> -¿nge_b™s -, - -879 -max_¿nge_by‹s -, -i -); - -881 ià(( -Ëngth - = - `³r_g‘_ãw_b™s -( -pd -, -i -)) < 0) - -882 -ASN__DECODE_FAILED -; - -885 -Ëngth - += 1; - -886 - `ASN_DEBUG -("Gن’gth %d", -Ëngth -); - -887 ià( - `­”_g‘_®ign -( -pd -) != 0) - -888 -ASN__DECODE_FAILED -; - -889  -Ëngth ---) { - -890  -buf - = - `³r_g‘_ãw_b™s -( -pd -, 8); - -891 ià( -buf - < 0) - -892 -ASN__DECODE_FAILED -; - -893 -v®ue - +ð((() -buf -è<< (8 * -Ëngth -)); - -896 -v®ue - +ð -ù --> -low”_bound -; - -897 if(( -¥ecs - && s³cs-> -f›ld_unsigÃd -) - -898 ? - `a¢_ušt642INTEGER -( -¡ -, () -v®ue -) - -899 : - `a¢_št642INTEGER -( -¡ -, -v®ue -)) - -900 -ASN__DECODE_FAILED -; - -901 - `ASN_DEBUG -("Got value %ld +†ow %ld", - -902 -v®ue -, -ù --> -low”_bound -); - -904  -v®ue - = 0; - -905 ià( -ù --> -¿nge_b™s - < 8) { - -906 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, -ù --> -¿nge_b™s -); - -907 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -908 } ià( -ù --> -¿nge_b™s - == 8) { - -909 ià( - `­”_g‘_®ign -( -pd -) < 0) - -910 -ASN__DECODE_FAILED -; - -911 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, -ù --> -¿nge_b™s -); - -912 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -915 ià( - `­”_g‘_®ign -( -pd -) < 0) - -916 -ASN__DECODE_FAILED -; - -917 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, 16); - -918 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -920 -v®ue - +ð -ù --> -low”_bound -; - -921 if(( -¥ecs - && s³cs-> -f›ld_unsigÃd -) - -922 ? - `a¢_ulÚg2INTEGER -( -¡ -, -v®ue -) - -923 : - `a¢_lÚg2INTEGER -( -¡ -, -v®ue -)) - -924 -ASN__DECODE_FAILED -; - -925 - `ASN_DEBUG -("Got value %ld +†ow %ld", - -926 -v®ue -, -ù --> -low”_bound -); - -928  -rv® -; - -930 -ASN__DECODE_FAILED -; - -933 - `ASN_DEBUG -("Decodšg uncÚ¡¿šed iÁeg” %s", -td --> -Çme -); - -938 -ssize_t - -Ën -; - -939 * -p -; - -940  -»t -; - -943 -Ën - = - `­”_g‘_Ëngth -( -pd -, -1, -1, & -»³© -); - -944 if( -Ën - < 0è -ASN__DECODE_STARVED -; - -946 -p - = - `REALLOC -( -¡ --> -buf -, st-> -size - + -Ën - + 1); - -947 if(! -p -è -ASN__DECODE_FAILED -; - -948 -¡ --> -buf - = ( -ušt8_t - *) -p -; - -950 -»t - = - `³r_g‘_mªy_b™s -( -pd -, & -¡ --> -buf -[¡-> -size -], 0, 8 * -Ën -); - -951 if( -»t - < 0è -ASN__DECODE_STARVED -; - -952 -¡ --> -size - +ð -Ën -; - -953 }  -»³© -); - -954 -¡ --> -buf -[¡-> -size -] = 0; - -957 if( -ù - && ct-> -low”_bound -) { - -961  -v®ue -; - -962 if( - `a¢_INTEGER2lÚg -( -¡ -, & -v®ue -)) - -963 -ASN__DECODE_FAILED -; - -964 if( - `a¢_lÚg2INTEGER -( -¡ -, -v®ue - + -ù --> -low”_bound -)) - -965 -ASN__DECODE_FAILED -; - -968  -rv® -; - -969 - } -} - -971 -a¢_’c_rv®_t - - -972 - $INTEGER_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -973 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -974 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -975 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_INTEGER_¥ecifics_ˆ*) -td --> -¥ecifics -; - -976 -a¢_’c_rv®_t - -” - = {0,0,0}; - -977 cÚ¡ -INTEGER_t - * -¡ - = (cÚ¡ INTEGER_ˆ*) -¥Œ -; - -978 cÚ¡ -ušt8_t - * -buf -; - -979 cÚ¡ -ušt8_t - * -’d -; - -980 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -981  -v®ue - = 0; - -983 if(! -¡ - || st-> -size - =ð0è -ASN__ENCODE_FAILED -; - -985 if(! -cÚ¡¿šts -ècÚ¡¿št ð -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -; - -986 -ù - = -cÚ¡¿šts - ? &cÚ¡¿šts-> -v®ue - : 0; - -988 -” -. -’coded - = 0; - -990 if( -ù -) { - -991  -šext - = 0; - -992 if( -¥ecs - && s³cs-> -f›ld_unsigÃd -) { - -993  -uv® -; - -994 if( - `a¢_INTEGER2ulÚg -( -¡ -, & -uv® -)) - -995 -ASN__ENCODE_FAILED -; - -997 if( -ù --> -æags - & -APC_SEMI_CONSTRAINED -) { - -998 if( -uv® - < () -ù --> -low”_bound -) - -999 -šext - = 1; - -1000 } if( -ù --> -¿nge_b™s - >= 0) { - -1001 if( -uv® - < () -ù --> -low”_bound - - -1002 || -uv® - > () -ù --> -uµ”_bound -) - -1003 -šext - = 1; - -1005 - `ASN_DEBUG -("Value %lu (%02x/%lu)†b %ld ub %ld %s", - -1006 -uv® -, -¡ --> -buf -[0], st-> -size -, - -1007 -ù --> -low”_bound -, ct-> -uµ”_bound -, - -1008 -šext - ? "ext" : "fix"); - -1009 -v®ue - = -uv® -; - -1011 if( - `a¢_INTEGER2lÚg -( -¡ -, & -v®ue -)è -ASN__ENCODE_FAILED -; - -1013 if( -ù --> -æags - & -APC_SEMI_CONSTRAINED -) { - -1014 if( -v®ue - < -ù --> -low”_bound -) - -1015 -šext - = 1; - -1016 } if( -ù --> -¿nge_b™s - >= 0) { - -1017 if( -v®ue - < -ù --> -low”_bound - - -1018 || -v®ue - > -ù --> -uµ”_bound -) - -1019 -šext - = 1; - -1021 - `ASN_DEBUG -("Value %lu (%02x/%lu)†b %ld ub %ld %s", - -1022 -v®ue -, -¡ --> -buf -[0], st-> -size -, - -1023 -ù --> -low”_bound -, ct-> -uµ”_bound -, - -1024 -šext - ? "ext" : "fix"); - -1026 if( -ù --> -æags - & -APC_EXTENSIBLE -) { - -1027 if( - `³r_put_ãw_b™s -( -po -, -šext -, 1)) - -1028 -ASN__ENCODE_FAILED -; - -1029 if( -šext -è -ù - = 0; - -1030 } if( -šext -) { - -1031 -ASN__ENCODE_FAILED -; - -1036 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -1037  -v -; - -1040 - `ASN_DEBUG -("Encoding integer %ld (%lu) with„ange %d bits", - -1041 -v®ue -, v®u- -ù --> -low”_bound -, ct-> -¿nge_b™s -); - -1043 -v - = -v®ue - - -ù --> -low”_bound -; - -1046 ià( -ù --> -¿nge_b™s - < 8) { - -1047 if( - `³r_put_ãw_b™s -( -po -, 0x00 | -v -, -ù --> -¿nge_b™s -)) - -1048 -ASN__ENCODE_FAILED -; - -1049 } ià( -ù --> -¿nge_b™s - == 8) { - -1050 if( - `­”_put_®ign -( -po -) < 0) - -1051 -ASN__ENCODE_FAILED -; - -1052 if( - `³r_put_ãw_b™s -( -po -, 0x00 | -v -, -ù --> -¿nge_b™s -)) - -1053 -ASN__ENCODE_FAILED -; - -1054 } ià( -ù --> -¿nge_b™s - <= 16) { - -1056 if( - `­”_put_®ign -( -po -) < 0) - -1057 -ASN__ENCODE_FAILED -; - -1058 if( - `³r_put_ãw_b™s -( -po -, 0x0000 | -v -, - -1060 -ASN__ENCODE_FAILED -; - -1063 -št64_t - -v64 - = -v -; - -1064  -i -, -j -; - -1065  -max_¿nge_by‹s - = ( -ù --> -¿nge_b™s - >> 3) + - -1066 ((( -ù --> -¿nge_b™s - % 8) > 0) ? 1 : 0); - -1068  -i - = 1; ; i++) { - -1069  -uµ” - = 1 << -i -; - -1070 ià( -uµ” - >ð -max_¿nge_by‹s -) - -1074  -j - = ( -št64_t -) -1; j != 0; j--) { - -1075 -št64_t - -v® -; - -1076 -v® - = -v64 - >> ( -j - * 8); - -1077 ià( -v® - != 0) - -1082 ià( - `³r_put_ãw_b™s -( -po -, -j -, -i -)) - -1083 -ASN__ENCODE_FAILED -; - -1086 ià( - `­”_put_®ign -( -po -) < 0) - -1087 -ASN__ENCODE_FAILED -; - -1089  -i - = 0; i <ð -j -; i++) { - -1090 if( - `³r_put_ãw_b™s -( -po -, ( -v64 - >> (8 * ( -j - - -i -))) & 0xff, 8)) - -1091 -ASN__ENCODE_FAILED -; - -1094 - `ASN__ENCODED_OK -( -” -); - -1097 if( -ù - && ct-> -low”_bound -) { - -1098 - `ASN_DEBUG -("Adju¡†ow” boundØ%ld", -ù --> -low”_bound -); - -1100 -ASN__ENCODE_FAILED -; - -1103  -buf - = -¡ -->buf, -’d - = st->buà+ st-> -size -; buf <ƒnd;) { - -1104 -ssize_t - -mayEncode - = - `­”_put_Ëngth -( -po -, -1, -’d - - -buf -); - -1105 if( -mayEncode - < 0) - -1106 -ASN__ENCODE_FAILED -; - -1107 if( - `³r_put_mªy_b™s -( -po -, -buf -, 8 * -mayEncode -)) - -1108 -ASN__ENCODE_FAILED -; - -1109 -buf - +ð -mayEncode -; - -1112 - `ASN__ENCODED_OK -( -” -); - -1113 - } -} - -1117  -štmax_t - - -1118 - $a¢__š‹g”_cÚv”t -(cÚ¡ -ušt8_t - * -b -, cÚ¡ ušt8_ˆ* -’d -) { - -1119 -uštmax_t - -v®ue -; - -1123 if((* -b - >> 7)) { - -1124 -v®ue - = ( -uštmax_t -)(-1); - -1126 -v®ue - = 0; - -1130 ; -b - < -’d -; b++) { - -1131 -v®ue - = (v®u<< 8è| * -b -; - -1134  -v®ue -; - -1135 - } -} - -1138 - $a¢_INTEGER2imax -(cÚ¡ -INTEGER_t - * -Œ -, -štmax_t - * -͌ -) { - -1139 -ušt8_t - * -b -, * -’d -; - -1140 -size_t - -size -; - -1143 if(! -Œ - || !Œ-> -buf - || ! -͌ -) { - -1144 -”ºo - = -EINVAL -; - -1149 -b - = -Œ --> -buf -; - -1150 -size - = -Œ -->size; - -1151 -’d - = -b - + -size -; - -1153 if( -size - > ( -štmax_t -)) { - -1154 -ušt8_t - * -’d1 - = -’d - - 1; - -1162 ; -b - < -’d1 -; b++) { - -1163 * -b -) { - -1164 0x00: if(( -b -[1] & 0x80) == 0) ; ; - -1165 0xff: if(( -b -[1] & 0x80) != 0) ; ; - -1170 -size - = -’d - - -b -; - -1171 if( -size - > ( -štmax_t -)) { - -1173 -”ºo - = -ERANGE -; - -1179 if( -’d - =ð -b -) { - -1180 * -͌ - = 0; - -1184 * -͌ - = - `a¢__š‹g”_cÚv”t -( -b -, -’d -); - -1186 - } -} - -1190 - $a¢_INTEGER2umax -(cÚ¡ -INTEGER_t - * -Œ -, -uštmax_t - * -͌ -) { - -1191 -ušt8_t - * -b -, * -’d -; - -1192 -uštmax_t - -v®ue -; - -1193 -size_t - -size -; - -1195 if(! -Œ - || !Œ-> -buf - || ! -͌ -) { - -1196 -”ºo - = -EINVAL -; - -1200 -b - = -Œ --> -buf -; - -1201 -size - = -Œ -->size; - -1202 -’d - = -b - + -size -; - -1205 ; -size - > ( -v®ue -); -b -++, size--) { - -1206 if(* -b -) { - -1208 -”ºo - = -ERANGE -; - -1214  -v®ue - = 0; -b - < -’d -; b++) - -1215 -v®ue - = (v®u<< 8è| * -b -; - -1217 * -͌ - = -v®ue -; - -1219 - } -} - -1222 - $a¢_umax2INTEGER -( -INTEGER_t - * -¡ -, -uštmax_t - -v®ue -) { - -1223 -ušt8_t - * -buf -; - -1224 -ušt8_t - * -’d -; - -1225 -ušt8_t - * -b -; - -1226  -shr -; - -1228 if( -v®ue - <ð((~( -uštmax_t -)0) >> 1)) { - -1229  - `a¢_imax2INTEGER -( -¡ -, -v®ue -); - -1232 -buf - = ( -ušt8_t - *) - `MALLOC -(1 + ( -v®ue -)); - -1233 if(! -buf -)  -1; - -1235 -’d - = -buf - + (( -v®ue -) + 1); - -1236 -buf -[0] = 0; - -1237  -b - = -buf - + 1, -shr - = (( -v®ue -è- 1è* 8; b < -’d -; shr -= 8, b++) - -1238 * -b - = ( -ušt8_t -)( -v®ue - >> -shr -); - -1240 if( -¡ --> -buf -è - `FREEMEM -(st->buf); - -1241 -¡ --> -buf - = buf; - -1242 -¡ --> -size - = 1 + ( -v®ue -); - -1245 - } -} - -1248 - $a¢_imax2INTEGER -( -INTEGER_t - * -¡ -, -štmax_t - -v®ue -) { - -1249 -ušt8_t - * -buf -, * -bp -; - -1250 -ušt8_t - * -p -; - -1251 -ušt8_t - * -p¡¬t -; - -1252 -ušt8_t - * -³nd1 -; - -1253  -l™ŽeEndŸn - = 1; - -1254  -add -; - -1256 if(! -¡ -) { - -1257 -”ºo - = -EINVAL -; - -1261 -buf - = ( -ušt8_t - *)(*) - `MALLOC -(( -v®ue -)); - -1262 if(! -buf -)  -1; - -1264 if(*(*)& -l™ŽeEndŸn -) { - -1265 -p¡¬t - = ( -ušt8_t - *)& -v®ue - + (value) - 1; - -1266 -³nd1 - = ( -ušt8_t - *)& -v®ue -; - -1267 -add - = -1; - -1269 -p¡¬t - = ( -ušt8_t - *)& -v®ue -; - -1270 -³nd1 - = -p¡¬t - + ( -v®ue -) - 1; - -1271 -add - = 1; - -1280  -p - = -p¡¬t -;… !ð -³nd1 -;… +ð -add -) { - -1281 * -p -) { - -1282 0x00: if((*( -p -+ -add -) & 0x80) == 0) - -1285 0xff: if((*( -p -+ -add -) & 0x80)) - -1292  -bp - = -buf -, -³nd1 - +ð -add -; -p - !=…end1;… +=‡dd) - -1293 * -bp -++ = * -p -; - -1295 if( -¡ --> -buf -è - `FREEMEM -(st->buf); - -1296 -¡ --> -buf - = buf; - -1297 -¡ --> -size - = -bp - - -buf -; - -1300 - } -} - -1303 - $a¢_INTEGER2lÚg -(cÚ¡ -INTEGER_t - * -Œ -, * -l -) { - -1304 -štmax_t - -v -; - -1305 if( - `a¢_INTEGER2imax -( -Œ -, & -v -) == 0) { - -1306 if( -v - < -LONG_MIN - || v > -LONG_MAX -) { - -1307 -”ºo - = -ERANGE -; - -1310 * -l - = -v -; - -1315 - } -} - -1318 - $a¢_INTEGER2ulÚg -(cÚ¡ -INTEGER_t - * -Œ -, * -l -) { - -1319 -uštmax_t - -v -; - -1320 if( - `a¢_INTEGER2umax -( -Œ -, & -v -) == 0) { - -1321 if( -v - > -ULONG_MAX -) { - -1322 -”ºo - = -ERANGE -; - -1325 * -l - = -v -; - -1330 - } -} - -1333 - $a¢_lÚg2INTEGER -( -INTEGER_t - * -¡ -,  -v®ue -) { - -1334  - `a¢_imax2INTEGER -( -¡ -, -v®ue -); - -1335 - } -} - -1338 - $a¢_ulÚg2INTEGER -( -INTEGER_t - * -¡ -,  -v®ue -) { - -1339  - `a¢_imax2INTEGER -( -¡ -, -v®ue -); - -1340 - } -} - -1344 - $a¢_ušt642INTEGER -( -INTEGER_t - * -¡ -, -ušt64_t - -v®ue -) { - -1345 -ušt8_t - * -buf -; - -1346 -ušt8_t - * -’d -; - -1347 -ušt8_t - * -b -; - -1348  -shr -; - -1350 if( -v®ue - <ð -INT64_MAX -) - -1351  - `a¢_št642INTEGER -( -¡ -, -v®ue -); - -1353 -buf - = ( -ušt8_t - *) - `MALLOC -(1 + ( -v®ue -)); - -1354 if(! -buf -)  -1; - -1356 -’d - = -buf - + (( -v®ue -) + 1); - -1357 -buf -[0] = 0; - -1358  -b - = -buf - + 1, -shr - = (( -v®ue -)-1)*8; b < -’d -; shr -= 8, b++) - -1359 * -b - = ( -ušt8_t -)( -v®ue - >> -shr -); - -1361 if( -¡ --> -buf -è - `FREEMEM -(st->buf); - -1362 -¡ --> -buf - = buf; - -1363 -¡ --> -size - = 1 + ( -v®ue -); - -1366 - } -} - -1369 - $a¢_št642INTEGER -( -INTEGER_t - * -¡ -, -št64_t - -v®ue -) { - -1370 -ušt8_t - * -buf -, * -bp -; - -1371 -ušt8_t - * -p -; - -1372 -ušt8_t - * -p¡¬t -; - -1373 -ušt8_t - * -³nd1 -; - -1374  -l™ŽeEndŸn - = 1; - -1375  -add -; - -1377 if(! -¡ -) { - -1378 -”ºo - = -EINVAL -; - -1382 -buf - = ( -ušt8_t - *) - `MALLOC -(( -v®ue -)); - -1383 if(! -buf -)  -1; - -1385 if(*(*)& -l™ŽeEndŸn -) { - -1386 -p¡¬t - = ( -ušt8_t - *)& -v®ue - + (value) - 1; - -1387 -³nd1 - = ( -ušt8_t - *)& -v®ue -; - -1388 -add - = -1; - -1390 -p¡¬t - = ( -ušt8_t - *)& -v®ue -; - -1391 -³nd1 - = -p¡¬t - + ( -v®ue -) - 1; - -1392 -add - = 1; - -1401  -p - = -p¡¬t -;… !ð -³nd1 -;… +ð -add -) { - -1402 * -p -) { - -1403 0x00: if((*( -p -+ -add -) & 0x80) == 0) - -1406 0xff: if((*( -p -+ -add -) & 0x80)) - -1413  -p¡¬t - = -p -, -bp - = -buf -, -³nd1 - +ð -add -;… !=…end1;… +=‡dd) - -1414 * -bp -++ = * -p -; - -1416 if( -¡ --> -buf -è - `FREEMEM -(st->buf); - -1417 -¡ --> -buf - = buf; - -1418 -¡ --> -size - = -bp - - -buf -; - -1421 - } -} - -1429 -a¢_¡¹ox_»suÉ_e - - -1430 - $a¢_¡¹oimax_lim -(cÚ¡ * -¡r -, cÚ¡ ** -’d -, -štmax_t - * -š -) { - -1431  -sign - = 1; - -1432 -štmax_t - -v®ue -; - -1434  - #ASN1_INTMAX_MAX - ((~( -uštmax_t -)0è>> 1) - - ) - -1435 cÚ¡ -štmax_t - -uµ”_bound¬y - = -ASN1_INTMAX_MAX - / 10; - -1436 -štmax_t - -Ï¡_dig™_max - = -ASN1_INTMAX_MAX - % 10; - -1437 #undeà -ASN1_INTMAX_MAX - - -1439 if( -¡r - >ð* -’d -è -ASN_STRTOX_ERROR_INVAL -; - -1441 * -¡r -) { - -1443 -Ï¡_dig™_max -++; - -1444 -sign - = -1; - -1447 -¡r -++; - -1448 if( -¡r - >ð* -’d -) { - -1449 * -’d - = -¡r -; - -1450  -ASN_STRTOX_EXPECT_MORE -; - -1454  -v®ue - = 0; -¡r - < (* -’d -); str++) { - -1455 * -¡r -) { - -1458  -d - = * -¡r - - '0'; - -1459 if( -v®ue - < -uµ”_bound¬y -) { - -1460 -v®ue - = v®u* 10 + -d -; - -1461 } if( -v®ue - =ð -uµ”_bound¬y -) { - -1462 if( -d - <ð -Ï¡_dig™_max -) { - -1463 if( -sign - > 0) { - -1464 -v®ue - = v®u* 10 + -d -; - -1466 -sign - = 1; - -1467 -v®ue - = -v®u* 10 - -d -; - -1470 * -’d - = -¡r -; - -1471  -ASN_STRTOX_ERROR_RANGE -; - -1474 * -’d - = -¡r -; - -1475  -ASN_STRTOX_ERROR_RANGE -; - -1480 * -’d - = -¡r -; - -1481 * -š - = -sign - * -v®ue -; - -1482  -ASN_STRTOX_EXTRA_DATA -; - -1486 * -’d - = -¡r -; - -1487 * -š - = -sign - * -v®ue -; - -1488  -ASN_STRTOX_OK -; - -1489 - } -} - -1497 -a¢_¡¹ox_»suÉ_e - - -1498 - $a¢_¡¹oumax_lim -(cÚ¡ * -¡r -, cÚ¡ ** -’d -, -uštmax_t - * -uš -) { - -1499 -uštmax_t - -v®ue -; - -1501  - #ASN1_UINTMAX_MAX - ((~( -uštmax_t -)0)) - - ) - -1502 cÚ¡ -uštmax_t - -uµ”_bound¬y - = -ASN1_UINTMAX_MAX - / 10; - -1503 -uštmax_t - -Ï¡_dig™_max - = -ASN1_UINTMAX_MAX - % 10; - -1504 #undeà -ASN1_UINTMAX_MAX - - -1506 if( -¡r - >ð* -’d -è -ASN_STRTOX_ERROR_INVAL -; - -1508 * -¡r -) { - -1510  -ASN_STRTOX_ERROR_INVAL -; - -1512 -¡r -++; - -1513 if( -¡r - >ð* -’d -) { - -1514 * -’d - = -¡r -; - -1515  -ASN_STRTOX_EXPECT_MORE -; - -1519  -v®ue - = 0; -¡r - < (* -’d -); str++) { - -1520 * -¡r -) { - -1523  -d - = * -¡r - - '0'; - -1524 if( -v®ue - < -uµ”_bound¬y -) { - -1525 -v®ue - = v®u* 10 + -d -; - -1526 } if( -v®ue - =ð -uµ”_bound¬y -) { - -1527 if( -d - <ð -Ï¡_dig™_max -) { - -1528 -v®ue - = v®u* 10 + -d -; - -1530 * -’d - = -¡r -; - -1531  -ASN_STRTOX_ERROR_RANGE -; - -1534 * -’d - = -¡r -; - -1535  -ASN_STRTOX_ERROR_RANGE -; - -1540 * -’d - = -¡r -; - -1541 * -uš - = -v®ue -; - -1542  -ASN_STRTOX_EXTRA_DATA -; - -1546 * -’d - = -¡r -; - -1547 * -uš - = -v®ue -; - -1548  -ASN_STRTOX_OK -; - -1549 - } -} - -1551 -a¢_¡¹ox_»suÉ_e - - -1552 - $a¢_¡¹Þ_lim -(cÚ¡ * -¡r -, cÚ¡ ** -’d -, * -Í -) { - -1553 -štmax_t - -v®ue -; - -1554  - `a¢_¡¹oimax_lim -( -¡r -, -’d -, & -v®ue -)) { - -1555  -ASN_STRTOX_ERROR_RANGE -: - -1556  -ASN_STRTOX_ERROR_RANGE -; - -1557  -ASN_STRTOX_ERROR_INVAL -: - -1558  -ASN_STRTOX_ERROR_INVAL -; - -1559  -ASN_STRTOX_EXPECT_MORE -: - -1560  -ASN_STRTOX_EXPECT_MORE -; - -1561  -ASN_STRTOX_OK -: - -1562 if( -v®ue - >ð -LONG_MIN - && v®u<ð -LONG_MAX -) { - -1563 * -Í - = -v®ue -; - -1564  -ASN_STRTOX_OK -; - -1566  -ASN_STRTOX_ERROR_RANGE -; - -1568  -ASN_STRTOX_EXTRA_DATA -: - -1569 if( -v®ue - >ð -LONG_MIN - && v®u<ð -LONG_MAX -) { - -1570 * -Í - = -v®ue -; - -1571  -ASN_STRTOX_EXTRA_DATA -; - -1573  -ASN_STRTOX_ERROR_RANGE -; - -1577 - `as£¹ -(!"Unreachable"); - -1578  -ASN_STRTOX_ERROR_INVAL -; - -1579 - } -} - -1581 -a¢_¡¹ox_»suÉ_e - - -1582 - $a¢_¡¹oul_lim -(cÚ¡ * -¡r -, cÚ¡ ** -’d -, * -uÍ -) { - -1583 -uštmax_t - -v®ue -; - -1584  - `a¢_¡¹oumax_lim -( -¡r -, -’d -, & -v®ue -)) { - -1585  -ASN_STRTOX_ERROR_RANGE -: - -1586  -ASN_STRTOX_ERROR_RANGE -; - -1587  -ASN_STRTOX_ERROR_INVAL -: - -1588  -ASN_STRTOX_ERROR_INVAL -; - -1589  -ASN_STRTOX_EXPECT_MORE -: - -1590  -ASN_STRTOX_EXPECT_MORE -; - -1591  -ASN_STRTOX_OK -: - -1592 if( -v®ue - <ð -ULONG_MAX -) { - -1593 * -uÍ - = -v®ue -; - -1594  -ASN_STRTOX_OK -; - -1596  -ASN_STRTOX_ERROR_RANGE -; - -1598  -ASN_STRTOX_EXTRA_DATA -: - -1599 if( -v®ue - <ð -ULONG_MAX -) { - -1600 * -uÍ - = -v®ue -; - -1601  -ASN_STRTOX_EXTRA_DATA -; - -1603  -ASN_STRTOX_ERROR_RANGE -; - -1607 - `as£¹ -(!"Unreachable"); - -1608  -ASN_STRTOX_ERROR_INVAL -; - -1609 - } -} - -1612 - $INTEGER_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -­Œ -, - -1613 cÚ¡ * -b±r -) { - -1614 cÚ¡ -INTEGER_t - * -a - = -­Œ -; - -1615 cÚ¡ -INTEGER_t - * -b - = -b±r -; - -1617 () -td -; - -1619 if( -a - && -b -) { - -1620 if( -a --> -size - && -b -->size) { - -1621  -sign_a - = ( -a --> -buf -[0] & 0x80) ? -1 : 1; - -1622  -sign_b - = ( -b --> -buf -[0] & 0x80) ? -1 : 1; - -1624 if( -sign_a - < -sign_b -)  -1; - -1625 if( -sign_a - > -sign_b -)  1; - -1628 if( -a --> -size - < -b -->size) { - -1629  -1 * -sign_a -; - -1630 } if( -a --> -size - > -b -->size) { - -1631  1 * -sign_b -; - -1634  -sign_a - * - `memcmp -( -a --> -buf -, -b -->buf,‡-> -size -); - -1635 } if( -a --> -size -) { - -1636  -sign - = ( -a --> -buf -[0] & 0x80) ? -1 : 1; - -1637  (1è* -sign -; - -1638 } if( -b --> -size -) { - -1639  -sign - = ( -a --> -buf -[0] & 0x80) ? -1 : 1; - -1640  (-1è* -sign -; - -1644 } if(! -a - && ! -b -) { - -1646 } if(! -a -) { - -1652 - } -} - -1654 -a¢_¿ndom_fžl_»suÉ_t - - -1655 - $INTEGER_¿ndom_fžl -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -1656 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -1657 -size_t - -max_Ëngth -) { - -1658 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -1659 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -1660 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_ok - = { -ARFILL_OK -, 1}; - -1661 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_çžed - = { -ARFILL_FAILED -, 0}; - -1662 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_sk³d - = { -ARFILL_SKIPPED -, 0}; - -1663 -INTEGER_t - * -¡ - = * -¥Œ -; - -1664 cÚ¡ -a¢_INTEGER_’um_m­_t - * -em­ -; - -1665 -size_t - -em­_Ën -; - -1666 -štmax_t - -v®ue -; - -1667  -fšd_šside_m­ -; - -1669 if( -max_Ëngth - =ð0è -»suÉ_sk³d -; - -1671 if( -¡ - =ð -NULL -) { - -1672 -¡ - = ( -INTEGER_t - *) - `CALLOC -(1, (*st)); - -1673 if( -¡ - =ð -NULL -) { - -1674  -»suÉ_çžed -; - -1678 if( -¥ecs -) { - -1679 -em­ - = -¥ecs --> -v®ue2’um -; - -1680 -em­_Ën - = -¥ecs --> -m­_couÁ -; - -1681 if( -¥ecs --> -¡riù_’um”©iÚ -) { - -1682 -fšd_šside_m­ - = -em­_Ën - > 0; - -1684 -fšd_šside_m­ - = -em­_Ën - ? - `a¢_¿ndom_b‘w“n -(0, 1) : 0; - -1687 -em­ - = 0; - -1688 -em­_Ën - = 0; - -1689 -fšd_šside_m­ - = 0; - -1692 if( -fšd_šside_m­ -) { - -1693 - `as£¹ -( -em­_Ën - > 0); - -1694 -v®ue - = -em­ -[ - `a¢_¿ndom_b‘w“n -(0, -em­_Ën - - 1)]. -Çt_v®ue -; - -1696 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -ù -; - -1698 cÚ¡  -v¬ŸÁs -[] = { - -1704 if( -¥ecs - && s³cs-> -f›ld_unsigÃd -) { - -1705 - `as£¹ -( -v¬ŸÁs -[18] == 0); - -1706 -v®ue - = -v¬ŸÁs -[ - `a¢_¿ndom_b‘w“n -( - -1707 18, ( -v¬ŸÁs -) / (variants[0]) - 1)]; - -1709 -v®ue - = -v¬ŸÁs -[ - `a¢_¿ndom_b‘w“n -( - -1710 0, ( -v¬ŸÁs -) / (variants[0]) - 1)]; - -1713 if(! -cÚ¡¿šts -ècÚ¡¿št ð& -td --> -’codšg_cÚ¡¿šts -; - -1714 -ù - = -cÚ¡¿šts - ? cÚ¡¿šts-> -³r_cÚ¡¿šts - : 0; - -1715 if( -ù - && (ù-> -v®ue -. -æags - & -APC_CONSTRAINED -)) { - -1716 if( -v®ue - < -ù -->v®ue. -low”_bound - || v®u> ct->v®ue. -uµ”_bound -) { - -1717 -v®ue - = - `a¢_¿ndom_b‘w“n -( -ù -->v®ue. -low”_bound -, - -1718 -ù --> -v®ue -. -uµ”_bound -); - -1723 if( - `a¢_imax2INTEGER -( -¡ -, -v®ue -)) { - -1724 if( -¡ - =ð* -¥Œ -) { - -1725 - `ASN_STRUCT_RESET -(* -td -, -¡ -); - -1727 - `ASN_STRUCT_FREE -(* -td -, -¡ -); - -1729  -»suÉ_çžed -; - -1731 * -¥Œ - = -¡ -; - -1732 -»suÉ_ok -. -Ëngth - = -¡ --> -size -; - -1733  -»suÉ_ok -; - -1735 - } -} - - @IndexToRFSP.c - -8  - ~"IndexToRFSP.h -" - -11 - $IndexToRFSP_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 1 && value <= 256)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_IndexToRFSP_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 8, 8, 1, 256 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_IndexToRFSP_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_IndexToRFSP - = { - -50 & -a¢_OP_N©iveIÁeg” -, - -51 -a¢_DEF_IndexToRFSP_gs_1 -, - -52 ( -a¢_DEF_IndexToRFSP_gs_1 -) - -53 /( -a¢_DEF_IndexToRFSP_gs_1 -[0]), - -54 -a¢_DEF_IndexToRFSP_gs_1 -, - -55 ( -a¢_DEF_IndexToRFSP_gs_1 -) - -56 /( -a¢_DEF_IndexToRFSP_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_IndexToRFSP_cÚ¡r_1 -, -IndexToRFSP_cÚ¡¿št - }, - - @Interface-MessageID.c - -8  - ~"IÁ”çû-Mes§geID.h -" - -14  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_mes§geTy³_cÚ¡r_3 - - gCC_NOTUSED - = { - -15 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 2, 2, 0, 2 } , - -16 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -19 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_mes§geTy³_v®ue2’um_3 -[] = { - -25 cÚ¡  - ga¢_MAP_mes§geTy³_’um2v®ue_3 -[] = { - -31 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_mes§geTy³_¥ecs_3 - = { - -32 -a¢_MAP_mes§geTy³_v®ue2’um_3 -, - -33 -a¢_MAP_mes§geTy³_’um2v®ue_3 -, - -40 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_mes§geTy³_gs_3 -[] = { - -41 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -42 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_mes§geTy³_3 - = { - -48 & -a¢_OP_N©iveEnum”©ed -, - -49 -a¢_DEF_mes§geTy³_gs_3 -, - -50 ( -a¢_DEF_mes§geTy³_gs_3 -) - -51 /( -a¢_DEF_mes§geTy³_gs_3 -[0]) - 1, - -52 -a¢_DEF_mes§geTy³_gs_3 -, - -53 ( -a¢_DEF_mes§geTy³_gs_3 -) - -54 /( -a¢_DEF_mes§geTy³_gs_3 -[0]), - -55 { 0, & -a¢_PER_ty³_mes§geTy³_cÚ¡r_3 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -57 & -a¢_SPC_mes§geTy³_¥ecs_3 - - -60  -a¢_TYPE_memb”_t - - ga¢_MBR_IÁ”çû_Mes§geID_1 -[] = { - -61 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çû_Mes§geID -, -š‹rçûProûdu»ID -), - -62 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -64 & -a¢_DEF_N©iveIÁeg” -, - -70 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çû_Mes§geID -, -mes§geTy³ -), - -71 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -73 & -a¢_DEF_mes§geTy³_3 -, - -80 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_IÁ”çû_Mes§geID_gs_1 -[] = { - -81 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -83 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_IÁ”çû_Mes§geID_g2–_1 -[] = { - -84 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -85 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -87  -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_IÁ”çû_Mes§geID_¥ecs_1 - = { - -88 ( -IÁ”çû_Mes§geID -), - -89 -off£tof -( -IÁ”çû_Mes§geID -, -_a¢_ùx -), - -90 -a¢_MAP_IÁ”çû_Mes§geID_g2–_1 -, - -95 -a¢_TYPE_desütÜ_t - - ga¢_DEF_IÁ”çû_Mes§geID - = { - -98 & -a¢_OP_SEQUENCE -, - -99 -a¢_DEF_IÁ”çû_Mes§geID_gs_1 -, - -100 ( -a¢_DEF_IÁ”çû_Mes§geID_gs_1 -) - -101 /( -a¢_DEF_IÁ”çû_Mes§geID_gs_1 -[0]), - -102 -a¢_DEF_IÁ”çû_Mes§geID_gs_1 -, - -103 ( -a¢_DEF_IÁ”çû_Mes§geID_gs_1 -) - -104 /( -a¢_DEF_IÁ”çû_Mes§geID_gs_1 -[0]), - -105 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -106 -a¢_MBR_IÁ”çû_Mes§geID_1 -, - -108 & -a¢_SPC_IÁ”çû_Mes§geID_¥ecs_1 - - - @InterfaceID-E1.c - -8  - ~"IÁ”çûID-E1.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_IÁ”çûID_E1_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çûID_E1 -, -glob®GNB_ID -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_Glob®GNB_ID -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çûID_E1 -, -gNB_CU_UP_ID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_GNB_CU_UP_ID -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_IÁ”çûID_E1_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_IÁ”çûID_E1_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_IÁ”çûID_E1_¥ecs_1 - = { - -38 ( -IÁ”çûID_E1 -), - -39 -off£tof -( -IÁ”çûID_E1 -, -_a¢_ùx -), - -40 -a¢_MAP_IÁ”çûID_E1_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_IÁ”çûID_E1 - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_IÁ”çûID_E1_gs_1 -, - -50 ( -a¢_DEF_IÁ”çûID_E1_gs_1 -) - -51 /( -a¢_DEF_IÁ”çûID_E1_gs_1 -[0]), - -52 -a¢_DEF_IÁ”çûID_E1_gs_1 -, - -53 ( -a¢_DEF_IÁ”çûID_E1_gs_1 -) - -54 /( -a¢_DEF_IÁ”çûID_E1_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_IÁ”çûID_E1_1 -, - -58 & -a¢_SPC_IÁ”çûID_E1_¥ecs_1 - - - @InterfaceID-F1.c - -8  - ~"IÁ”çûID-F1.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_IÁ”çûID_F1_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çûID_F1 -, -glob®GNB_ID -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_Glob®GNB_ID -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çûID_F1 -, -gNB_DU_ID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_GNB_DU_ID -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_IÁ”çûID_F1_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_IÁ”çûID_F1_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_IÁ”çûID_F1_¥ecs_1 - = { - -38 ( -IÁ”çûID_F1 -), - -39 -off£tof -( -IÁ”çûID_F1 -, -_a¢_ùx -), - -40 -a¢_MAP_IÁ”çûID_F1_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_IÁ”çûID_F1 - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_IÁ”çûID_F1_gs_1 -, - -50 ( -a¢_DEF_IÁ”çûID_F1_gs_1 -) - -51 /( -a¢_DEF_IÁ”çûID_F1_gs_1 -[0]), - -52 -a¢_DEF_IÁ”çûID_F1_gs_1 -, - -53 ( -a¢_DEF_IÁ”çûID_F1_gs_1 -) - -54 /( -a¢_DEF_IÁ”çûID_F1_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_IÁ”çûID_F1_1 -, - -58 & -a¢_SPC_IÁ”çûID_F1_¥ecs_1 - - - @InterfaceID-NG.c - -8  - ~"IÁ”çûID-NG.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_IÁ”çûID_NG_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çûID_NG -, -guami -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_GUAMI -, - -21 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_IÁ”çûID_NG_gs_1 -[] = { - -22 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -24 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_IÁ”çûID_NG_g2–_1 -[] = { - -25 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -27 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_IÁ”çûID_NG_¥ecs_1 - = { - -28 ( -IÁ”çûID_NG -), - -29 -off£tof -( -IÁ”çûID_NG -, -_a¢_ùx -), - -30 -a¢_MAP_IÁ”çûID_NG_g2–_1 -, - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_IÁ”çûID_NG - = { - -38 & -a¢_OP_SEQUENCE -, - -39 -a¢_DEF_IÁ”çûID_NG_gs_1 -, - -40 ( -a¢_DEF_IÁ”çûID_NG_gs_1 -) - -41 /( -a¢_DEF_IÁ”çûID_NG_gs_1 -[0]), - -42 -a¢_DEF_IÁ”çûID_NG_gs_1 -, - -43 ( -a¢_DEF_IÁ”çûID_NG_gs_1 -) - -44 /( -a¢_DEF_IÁ”çûID_NG_gs_1 -[0]), - -45 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -46 -a¢_MBR_IÁ”çûID_NG_1 -, - -48 & -a¢_SPC_IÁ”çûID_NG_¥ecs_1 - - - @InterfaceID-S1.c - -8  - ~"IÁ”çûID-S1.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_IÁ”çûID_S1_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çûID_S1 -, -gUMMEI -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_GUMMEI -, - -21 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_IÁ”çûID_S1_gs_1 -[] = { - -22 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -24 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_IÁ”çûID_S1_g2–_1 -[] = { - -25 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -27 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_IÁ”çûID_S1_¥ecs_1 - = { - -28 ( -IÁ”çûID_S1 -), - -29 -off£tof -( -IÁ”çûID_S1 -, -_a¢_ùx -), - -30 -a¢_MAP_IÁ”çûID_S1_g2–_1 -, - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_IÁ”çûID_S1 - = { - -38 & -a¢_OP_SEQUENCE -, - -39 -a¢_DEF_IÁ”çûID_S1_gs_1 -, - -40 ( -a¢_DEF_IÁ”çûID_S1_gs_1 -) - -41 /( -a¢_DEF_IÁ”çûID_S1_gs_1 -[0]), - -42 -a¢_DEF_IÁ”çûID_S1_gs_1 -, - -43 ( -a¢_DEF_IÁ”çûID_S1_gs_1 -) - -44 /( -a¢_DEF_IÁ”çûID_S1_gs_1 -[0]), - -45 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -46 -a¢_MBR_IÁ”çûID_S1_1 -, - -48 & -a¢_SPC_IÁ”çûID_S1_¥ecs_1 - - - @InterfaceID-W1.c - -8  - ~"IÁ”çûID-W1.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_IÁ”çûID_W1_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çûID_W1 -, -glob®_ng_eNB_ID -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_Glob®NgENB_ID -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çûID_W1 -, -ng_eNB_DU_ID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_NGENB_DU_ID -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_IÁ”çûID_W1_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_IÁ”çûID_W1_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_IÁ”çûID_W1_¥ecs_1 - = { - -38 ( -IÁ”çûID_W1 -), - -39 -off£tof -( -IÁ”çûID_W1 -, -_a¢_ùx -), - -40 -a¢_MAP_IÁ”çûID_W1_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_IÁ”çûID_W1 - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_IÁ”çûID_W1_gs_1 -, - -50 ( -a¢_DEF_IÁ”çûID_W1_gs_1 -) - -51 /( -a¢_DEF_IÁ”çûID_W1_gs_1 -[0]), - -52 -a¢_DEF_IÁ”çûID_W1_gs_1 -, - -53 ( -a¢_DEF_IÁ”çûID_W1_gs_1 -) - -54 /( -a¢_DEF_IÁ”çûID_W1_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_IÁ”çûID_W1_1 -, - -58 & -a¢_SPC_IÁ”çûID_W1_¥ecs_1 - - - @InterfaceID-X2.c - -8  - ~"IÁ”çûID-X2.h -" - -10  - ~"Glob®ENB-ID.h -" - -11  - ~"Glob®’GNB-ID.h -" - -12  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_nodeTy³_cÚ¡r_2 - - gCC_NOTUSED - = { - -13 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -14 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -17  -a¢_TYPE_memb”_t - - ga¢_MBR_nodeTy³_2 -[] = { - -18 { -ATF_POINTER -, 0, -off£tof -( -IÁ”çûID_X2__nodeTy³ -, -choiû -. -glob®_eNB_ID -), - -19 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -21 & -a¢_DEF_Glob®ENB_ID -, - -27 { -ATF_POINTER -, 0, -off£tof -( -IÁ”çûID_X2__nodeTy³ -, -choiû -. -glob®_’_gNB_ID -), - -28 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -30 & -a¢_DEF_Glob®’GNB_ID -, - -37 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_nodeTy³_g2–_2 -[] = { - -38 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -39 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -41  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_nodeTy³_¥ecs_2 - = { - -42 ( -IÁ”çûID_X2__nodeTy³ -), - -43 -off£tof -( -IÁ”çûID_X2__nodeTy³ -, -_a¢_ùx -), - -44 -off£tof -( -IÁ”çûID_X2__nodeTy³ -, -´e£Á -), - -45 ((( -IÁ”çûID_X2__nodeTy³ - *)0)-> -´e£Á -), - -46 -a¢_MAP_nodeTy³_g2–_2 -, - -52 -a¢_TYPE_desütÜ_t - - ga¢_DEF_nodeTy³_2 - = { - -55 & -a¢_OP_CHOICE -, - -60 { 0, & -a¢_PER_ty³_nodeTy³_cÚ¡r_2 -, -CHOICE_cÚ¡¿št - }, - -61 -a¢_MBR_nodeTy³_2 -, - -63 & -a¢_SPC_nodeTy³_¥ecs_2 - - -66 -a¢_TYPE_memb”_t - - ga¢_MBR_IÁ”çûID_X2_1 -[] = { - -67 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çûID_X2 -, -nodeTy³ -), - -68 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -70 & -a¢_DEF_nodeTy³_2 -, - -77 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_IÁ”çûID_X2_gs_1 -[] = { - -78 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -80 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_IÁ”çûID_X2_g2–_1 -[] = { - -81 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -83 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_IÁ”çûID_X2_¥ecs_1 - = { - -84 ( -IÁ”çûID_X2 -), - -85 -off£tof -( -IÁ”çûID_X2 -, -_a¢_ùx -), - -86 -a¢_MAP_IÁ”çûID_X2_g2–_1 -, - -91 -a¢_TYPE_desütÜ_t - - ga¢_DEF_IÁ”çûID_X2 - = { - -94 & -a¢_OP_SEQUENCE -, - -95 -a¢_DEF_IÁ”çûID_X2_gs_1 -, - -96 ( -a¢_DEF_IÁ”çûID_X2_gs_1 -) - -97 /( -a¢_DEF_IÁ”çûID_X2_gs_1 -[0]), - -98 -a¢_DEF_IÁ”çûID_X2_gs_1 -, - -99 ( -a¢_DEF_IÁ”çûID_X2_gs_1 -) - -100 /( -a¢_DEF_IÁ”çûID_X2_gs_1 -[0]), - -101 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -102 -a¢_MBR_IÁ”çûID_X2_1 -, - -104 & -a¢_SPC_IÁ”çûID_X2_¥ecs_1 - - - @InterfaceID-Xn.c - -8  - ~"IÁ”çûID-Xn.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_IÁ”çûID_Xn_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -IÁ”çûID_Xn -, -glob®_NG_RAN_ID -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_Glob®NGRANNodeID -, - -21 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_IÁ”çûID_Xn_gs_1 -[] = { - -22 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -24 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_IÁ”çûID_Xn_g2–_1 -[] = { - -25 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -27 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_IÁ”çûID_Xn_¥ecs_1 - = { - -28 ( -IÁ”çûID_Xn -), - -29 -off£tof -( -IÁ”çûID_Xn -, -_a¢_ùx -), - -30 -a¢_MAP_IÁ”çûID_Xn_g2–_1 -, - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_IÁ”çûID_Xn - = { - -38 & -a¢_OP_SEQUENCE -, - -39 -a¢_DEF_IÁ”çûID_Xn_gs_1 -, - -40 ( -a¢_DEF_IÁ”çûID_Xn_gs_1 -) - -41 /( -a¢_DEF_IÁ”çûID_Xn_gs_1 -[0]), - -42 -a¢_DEF_IÁ”çûID_Xn_gs_1 -, - -43 ( -a¢_DEF_IÁ”çûID_Xn_gs_1 -) - -44 /( -a¢_DEF_IÁ”çûID_Xn_gs_1 -[0]), - -45 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -46 -a¢_MBR_IÁ”çûID_Xn_1 -, - -48 & -a¢_SPC_IÁ”çûID_Xn_¥ecs_1 - - - @InterfaceIdentifier.c - -8  - ~"IÁ”çûId’tif›r.h -" - -10  - ~"IÁ”çûID-NG.h -" - -11  - ~"IÁ”çûID-Xn.h -" - -12  - ~"IÁ”çûID-F1.h -" - -13  - ~"IÁ”çûID-E1.h -" - -14  - ~"IÁ”çûID-S1.h -" - -15  - ~"IÁ”çûID-X2.h -" - -16  - ~"IÁ”çûID-W1.h -" - -17  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_IÁ”çûId’tif›r_cÚ¡r_1 - - gCC_NOTUSED - = { - -18 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 3, 3, 0, 6 } , - -19 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -22  -a¢_TYPE_memb”_t - - ga¢_MBR_IÁ”çûId’tif›r_1 -[] = { - -23 { -ATF_POINTER -, 0, -off£tof -( -IÁ”çûId’tif›r -, -choiû -. -nG -), - -24 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -26 & -a¢_DEF_IÁ”çûID_NG -, - -32 { -ATF_POINTER -, 0, -off£tof -( -IÁ”çûId’tif›r -, -choiû -. -xN -), - -33 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -35 & -a¢_DEF_IÁ”çûID_Xn -, - -41 { -ATF_POINTER -, 0, -off£tof -( -IÁ”çûId’tif›r -, -choiû -. -f1 -), - -42 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -44 & -a¢_DEF_IÁ”çûID_F1 -, - -50 { -ATF_POINTER -, 0, -off£tof -( -IÁ”çûId’tif›r -, -choiû -. -e1 -), - -51 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -53 & -a¢_DEF_IÁ”çûID_E1 -, - -59 { -ATF_POINTER -, 0, -off£tof -( -IÁ”çûId’tif›r -, -choiû -. -s1 -), - -60 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -62 & -a¢_DEF_IÁ”çûID_S1 -, - -68 { -ATF_POINTER -, 0, -off£tof -( -IÁ”çûId’tif›r -, -choiû -. -x2 -), - -69 ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), - -71 & -a¢_DEF_IÁ”çûID_X2 -, - -77 { -ATF_POINTER -, 0, -off£tof -( -IÁ”çûId’tif›r -, -choiû -. -w1 -), - -78 ( -ASN_TAG_CLASS_CONTEXT - | (6 << 2)), - -80 & -a¢_DEF_IÁ”çûID_W1 -, - -87 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_IÁ”çûId’tif›r_g2–_1 -[] = { - -88 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -89 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -90 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -91 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 }, - -92 { ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), 4, 0, 0 }, - -93 { ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), 5, 0, 0 }, - -94 { ( -ASN_TAG_CLASS_CONTEXT - | (6 << 2)), 6, 0, 0 } - -96  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_IÁ”çûId’tif›r_¥ecs_1 - = { - -97 ( -IÁ”çûId’tif›r -), - -98 -off£tof -( -IÁ”çûId’tif›r -, -_a¢_ùx -), - -99 -off£tof -( -IÁ”çûId’tif›r -, -´e£Á -), - -100 ((( -IÁ”çûId’tif›r - *)0)-> -´e£Á -), - -101 -a¢_MAP_IÁ”çûId’tif›r_g2–_1 -, - -106 -a¢_TYPE_desütÜ_t - - ga¢_DEF_IÁ”çûId’tif›r - = { - -109 & -a¢_OP_CHOICE -, - -114 { 0, & -a¢_PER_ty³_IÁ”çûId’tif›r_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -115 -a¢_MBR_IÁ”çûId’tif›r_1 -, - -117 & -a¢_SPC_IÁ”çûId’tif›r_¥ecs_1 - - - @InterfaceType.c - -8  - ~"IÁ”çûTy³.h -" - -14  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_IÁ”çûTy³_cÚ¡r_1 - - gCC_NOTUSED - = { - -15 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 3, 3, 0, 6 } , - -16 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -19 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_IÁ”çûTy³_v®ue2’um_1 -[] = { - -29 cÚ¡  - ga¢_MAP_IÁ”çûTy³_’um2v®ue_1 -[] = { - -39 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_IÁ”çûTy³_¥ecs_1 - = { - -40 -a¢_MAP_IÁ”çûTy³_v®ue2’um_1 -, - -41 -a¢_MAP_IÁ”çûTy³_’um2v®ue_1 -, - -48 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_IÁ”çûTy³_gs_1 -[] = { - -49 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -51 -a¢_TYPE_desütÜ_t - - ga¢_DEF_IÁ”çûTy³ - = { - -54 & -a¢_OP_N©iveEnum”©ed -, - -55 -a¢_DEF_IÁ”çûTy³_gs_1 -, - -56 ( -a¢_DEF_IÁ”çûTy³_gs_1 -) - -57 /( -a¢_DEF_IÁ”çûTy³_gs_1 -[0]), - -58 -a¢_DEF_IÁ”çûTy³_gs_1 -, - -59 ( -a¢_DEF_IÁ”çûTy³_gs_1 -) - -60 /( -a¢_DEF_IÁ”çûTy³_gs_1 -[0]), - -61 { 0, & -a¢_PER_ty³_IÁ”çûTy³_cÚ¡r_1 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -63 & -a¢_SPC_IÁ”çûTy³_¥ecs_1 - - - @LabelInfoItem.c - -8  - ~"Lab–InfoI‹m.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_Lab–InfoI‹m_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -Lab–InfoI‹m -, -m—sLab– -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_M—su»m’tLab– -, - -21 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_Lab–InfoI‹m_gs_1 -[] = { - -22 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -24 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_Lab–InfoI‹m_g2–_1 -[] = { - -25 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -27 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_Lab–InfoI‹m_¥ecs_1 - = { - -28 ( -Lab–InfoI‹m -), - -29 -off£tof -( -Lab–InfoI‹m -, -_a¢_ùx -), - -30 -a¢_MAP_Lab–InfoI‹m_g2–_1 -, - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Lab–InfoI‹m - = { - -38 & -a¢_OP_SEQUENCE -, - -39 -a¢_DEF_Lab–InfoI‹m_gs_1 -, - -40 ( -a¢_DEF_Lab–InfoI‹m_gs_1 -) - -41 /( -a¢_DEF_Lab–InfoI‹m_gs_1 -[0]), - -42 -a¢_DEF_Lab–InfoI‹m_gs_1 -, - -43 ( -a¢_DEF_Lab–InfoI‹m_gs_1 -) - -44 /( -a¢_DEF_Lab–InfoI‹m_gs_1 -[0]), - -45 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -46 -a¢_MBR_Lab–InfoI‹m_1 -, - -48 & -a¢_SPC_Lab–InfoI‹m_¥ecs_1 - - - @LabelInfoList.c - -8  - ~"Lab–InfoLi¡.h -" - -10  - ~"Lab–InfoI‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_Lab–InfoLi¡_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 31, -1, 1, 2147483647 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_Lab–InfoLi¡_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -18 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -20 & -a¢_DEF_Lab–InfoI‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_Lab–InfoLi¡_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_Lab–InfoLi¡_¥ecs_1 - = { - -31 ( -Lab–InfoLi¡ -), - -32 -off£tof -( -Lab–InfoLi¡ -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Lab–InfoLi¡ - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_Lab–InfoLi¡_gs_1 -, - -40 ( -a¢_DEF_Lab–InfoLi¡_gs_1 -) - -41 /( -a¢_DEF_Lab–InfoLi¡_gs_1 -[0]), - -42 -a¢_DEF_Lab–InfoLi¡_gs_1 -, - -43 ( -a¢_DEF_Lab–InfoLi¡_gs_1 -) - -44 /( -a¢_DEF_Lab–InfoLi¡_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_Lab–InfoLi¡_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_Lab–InfoLi¡_1 -, - -48 & -a¢_SPC_Lab–InfoLi¡_¥ecs_1 - - - @MME-Code.c - -8  - ~"MME-Code.h -" - -11 - $MME_Code_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 -size - = -¡ -->size; - -25 if(( -size - == 1)) { - -29 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -31 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -34 - } -} - -40 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_MME_Code_cÚ¡r_1 - - gCC_NOTUSED - = { - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -42 { -APC_CONSTRAINED -, 0, 0, 1, 1 } , - -45 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_MME_Code_gs_1 -[] = { - -46 ( -ASN_TAG_CLASS_UNIVERSAL - | (4 << 2)) - -48 -a¢_TYPE_desütÜ_t - - ga¢_DEF_MME_Code - = { - -51 & -a¢_OP_OCTET_STRING -, - -52 -a¢_DEF_MME_Code_gs_1 -, - -53 ( -a¢_DEF_MME_Code_gs_1 -) - -54 /( -a¢_DEF_MME_Code_gs_1 -[0]), - -55 -a¢_DEF_MME_Code_gs_1 -, - -56 ( -a¢_DEF_MME_Code_gs_1 -) - -57 /( -a¢_DEF_MME_Code_gs_1 -[0]), - -58 { 0, & -a¢_PER_ty³_MME_Code_cÚ¡r_1 -, -MME_Code_cÚ¡¿št - }, - -60 & -a¢_SPC_OCTET_STRING_¥ecs - - - @MME-Group-ID.c - -8  - ~"MME-Group-ID.h -" - -11 - $MME_Group_ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 -size - = -¡ -->size; - -25 if(( -size - == 2)) { - -29 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -31 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -34 - } -} - -40 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_MME_Group_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -42 { -APC_CONSTRAINED -, 0, 0, 2, 2 } , - -45 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_MME_Group_ID_gs_1 -[] = { - -46 ( -ASN_TAG_CLASS_UNIVERSAL - | (4 << 2)) - -48 -a¢_TYPE_desütÜ_t - - ga¢_DEF_MME_Group_ID - = { - -51 & -a¢_OP_OCTET_STRING -, - -52 -a¢_DEF_MME_Group_ID_gs_1 -, - -53 ( -a¢_DEF_MME_Group_ID_gs_1 -) - -54 /( -a¢_DEF_MME_Group_ID_gs_1 -[0]), - -55 -a¢_DEF_MME_Group_ID_gs_1 -, - -56 ( -a¢_DEF_MME_Group_ID_gs_1 -) - -57 /( -a¢_DEF_MME_Group_ID_gs_1 -[0]), - -58 { 0, & -a¢_PER_ty³_MME_Group_ID_cÚ¡r_1 -, -MME_Group_ID_cÚ¡¿št - }, - -60 & -a¢_SPC_OCTET_STRING_¥ecs - - - @MME-UE-S1AP-ID.c - -8  - ~"MME-UE-S1AP-ID.h -" - -11 - $MME_UE_S1AP_ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -14 if(! -¥Œ -) { - -15 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -17 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -24 - } -} - -30 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_MME_UE_S1AP_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -31 { -APC_CONSTRAINED -, 32, -1, 0, 4294967295 } , - -32 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -35 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_MME_UE_S1AP_ID_¥ecs_1 - = { - -40 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_MME_UE_S1AP_ID_gs_1 -[] = { - -41 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -43 -a¢_TYPE_desütÜ_t - - ga¢_DEF_MME_UE_S1AP_ID - = { - -46 & -a¢_OP_N©iveIÁeg” -, - -47 -a¢_DEF_MME_UE_S1AP_ID_gs_1 -, - -48 ( -a¢_DEF_MME_UE_S1AP_ID_gs_1 -) - -49 /( -a¢_DEF_MME_UE_S1AP_ID_gs_1 -[0]), - -50 -a¢_DEF_MME_UE_S1AP_ID_gs_1 -, - -51 ( -a¢_DEF_MME_UE_S1AP_ID_gs_1 -) - -52 /( -a¢_DEF_MME_UE_S1AP_ID_gs_1 -[0]), - -53 { 0, & -a¢_PER_ty³_MME_UE_S1AP_ID_cÚ¡r_1 -, -MME_UE_S1AP_ID_cÚ¡¿št - }, - -55 & -a¢_SPC_MME_UE_S1AP_ID_¥ecs_1 - - - @MatchingCondItem.c - -8  - ~"M©chšgCÚdI‹m.h -" - -10  - ~"M—su»m’tLab–.h -" - -11  - ~"Te¡CÚdInfo.h -" - -12 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M©chšgCÚdI‹m_cÚ¡r_1 - - gCC_NOTUSED - = { - -13 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -14 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -17 -a¢_TYPE_memb”_t - - ga¢_MBR_M©chšgCÚdI‹m_1 -[] = { - -18 { -ATF_POINTER -, 0, -off£tof -( -M©chšgCÚdI‹m -, -choiû -. -m—sLab– -), - -19 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -21 & -a¢_DEF_M—su»m’tLab– -, - -27 { -ATF_POINTER -, 0, -off£tof -( -M©chšgCÚdI‹m -, -choiû -. -‹¡CÚdInfo -), - -28 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -30 & -a¢_DEF_Te¡CÚdInfo -, - -37 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_M©chšgCÚdI‹m_g2–_1 -[] = { - -38 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -39 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -41 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_M©chšgCÚdI‹m_¥ecs_1 - = { - -42 ( -M©chšgCÚdI‹m -), - -43 -off£tof -( -M©chšgCÚdI‹m -, -_a¢_ùx -), - -44 -off£tof -( -M©chšgCÚdI‹m -, -´e£Á -), - -45 ((( -M©chšgCÚdI‹m - *)0)-> -´e£Á -), - -46 -a¢_MAP_M©chšgCÚdI‹m_g2–_1 -, - -51 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M©chšgCÚdI‹m - = { - -54 & -a¢_OP_CHOICE -, - -59 { 0, & -a¢_PER_ty³_M©chšgCÚdI‹m_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -60 -a¢_MBR_M©chšgCÚdI‹m_1 -, - -62 & -a¢_SPC_M©chšgCÚdI‹m_¥ecs_1 - - - @MatchingCondList.c - -8  - ~"M©chšgCÚdLi¡.h -" - -10  - ~"M©chšgCÚdI‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M©chšgCÚdLi¡_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 15, 15, 1, 32768 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_M©chšgCÚdLi¡_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -20 & -a¢_DEF_M©chšgCÚdI‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M©chšgCÚdLi¡_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_M©chšgCÚdLi¡_¥ecs_1 - = { - -31 ( -M©chšgCÚdLi¡ -), - -32 -off£tof -( -M©chšgCÚdLi¡ -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M©chšgCÚdLi¡ - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_M©chšgCÚdLi¡_gs_1 -, - -40 ( -a¢_DEF_M©chšgCÚdLi¡_gs_1 -) - -41 /( -a¢_DEF_M©chšgCÚdLi¡_gs_1 -[0]), - -42 -a¢_DEF_M©chšgCÚdLi¡_gs_1 -, - -43 ( -a¢_DEF_M©chšgCÚdLi¡_gs_1 -) - -44 /( -a¢_DEF_M©chšgCÚdLi¡_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_M©chšgCÚdLi¡_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_M©chšgCÚdLi¡_1 -, - -48 & -a¢_SPC_M©chšgCÚdLi¡_¥ecs_1 - - - @MatchingUEidItem.c - -8  - ~"M©chšgUEidI‹m.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_M©chšgUEidI‹m_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -M©chšgUEidI‹m -, -ueID -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_UEID -, - -21 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M©chšgUEidI‹m_gs_1 -[] = { - -22 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -24 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_M©chšgUEidI‹m_g2–_1 -[] = { - -25 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -27 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_M©chšgUEidI‹m_¥ecs_1 - = { - -28 ( -M©chšgUEidI‹m -), - -29 -off£tof -( -M©chšgUEidI‹m -, -_a¢_ùx -), - -30 -a¢_MAP_M©chšgUEidI‹m_g2–_1 -, - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M©chšgUEidI‹m - = { - -38 & -a¢_OP_SEQUENCE -, - -39 -a¢_DEF_M©chšgUEidI‹m_gs_1 -, - -40 ( -a¢_DEF_M©chšgUEidI‹m_gs_1 -) - -41 /( -a¢_DEF_M©chšgUEidI‹m_gs_1 -[0]), - -42 -a¢_DEF_M©chšgUEidI‹m_gs_1 -, - -43 ( -a¢_DEF_M©chšgUEidI‹m_gs_1 -) - -44 /( -a¢_DEF_M©chšgUEidI‹m_gs_1 -[0]), - -45 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -46 -a¢_MBR_M©chšgUEidI‹m_1 -, - -48 & -a¢_SPC_M©chšgUEidI‹m_¥ecs_1 - - - @MatchingUEidList.c - -8  - ~"M©chšgUEidLi¡.h -" - -10  - ~"M©chšgUEidI‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M©chšgUEidLi¡_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 16, 16, 1, 65535 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_M©chšgUEidLi¡_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -18 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -20 & -a¢_DEF_M©chšgUEidI‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M©chšgUEidLi¡_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_M©chšgUEidLi¡_¥ecs_1 - = { - -31 ( -M©chšgUEidLi¡ -), - -32 -off£tof -( -M©chšgUEidLi¡ -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M©chšgUEidLi¡ - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_M©chšgUEidLi¡_gs_1 -, - -40 ( -a¢_DEF_M©chšgUEidLi¡_gs_1 -) - -41 /( -a¢_DEF_M©chšgUEidLi¡_gs_1 -[0]), - -42 -a¢_DEF_M©chšgUEidLi¡_gs_1 -, - -43 ( -a¢_DEF_M©chšgUEidLi¡_gs_1 -) - -44 /( -a¢_DEF_M©chšgUEidLi¡_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_M©chšgUEidLi¡_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_M©chšgUEidLi¡_1 -, - -48 & -a¢_SPC_M©chšgUEidLi¡_¥ecs_1 - - - @MeasurementCondItem.c - -8  - ~"M—su»m’tCÚdI‹m.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tCÚdI‹m_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tCÚdI‹m -, -m—sTy³ -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_M—su»m’tTy³ -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tCÚdI‹m -, -m©chšgCÚd -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_M©chšgCÚdLi¡ -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tCÚdI‹m_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_M—su»m’tCÚdI‹m_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_M—su»m’tCÚdI‹m_¥ecs_1 - = { - -38 ( -M—su»m’tCÚdI‹m -), - -39 -off£tof -( -M—su»m’tCÚdI‹m -, -_a¢_ùx -), - -40 -a¢_MAP_M—su»m’tCÚdI‹m_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tCÚdI‹m - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_M—su»m’tCÚdI‹m_gs_1 -, - -50 ( -a¢_DEF_M—su»m’tCÚdI‹m_gs_1 -) - -51 /( -a¢_DEF_M—su»m’tCÚdI‹m_gs_1 -[0]), - -52 -a¢_DEF_M—su»m’tCÚdI‹m_gs_1 -, - -53 ( -a¢_DEF_M—su»m’tCÚdI‹m_gs_1 -) - -54 /( -a¢_DEF_M—su»m’tCÚdI‹m_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_M—su»m’tCÚdI‹m_1 -, - -58 & -a¢_SPC_M—su»m’tCÚdI‹m_¥ecs_1 - - - @MeasurementCondList.c - -8  - ~"M—su»m’tCÚdLi¡.h -" - -10  - ~"M—su»m’tCÚdI‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M—su»m’tCÚdLi¡_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 16, 16, 1, 65535 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tCÚdLi¡_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -18 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -20 & -a¢_DEF_M—su»m’tCÚdI‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tCÚdLi¡_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_M—su»m’tCÚdLi¡_¥ecs_1 - = { - -31 ( -M—su»m’tCÚdLi¡ -), - -32 -off£tof -( -M—su»m’tCÚdLi¡ -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tCÚdLi¡ - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_M—su»m’tCÚdLi¡_gs_1 -, - -40 ( -a¢_DEF_M—su»m’tCÚdLi¡_gs_1 -) - -41 /( -a¢_DEF_M—su»m’tCÚdLi¡_gs_1 -[0]), - -42 -a¢_DEF_M—su»m’tCÚdLi¡_gs_1 -, - -43 ( -a¢_DEF_M—su»m’tCÚdLi¡_gs_1 -) - -44 /( -a¢_DEF_M—su»m’tCÚdLi¡_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_M—su»m’tCÚdLi¡_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_M—su»m’tCÚdLi¡_1 -, - -48 & -a¢_SPC_M—su»m’tCÚdLi¡_¥ecs_1 - - - @MeasurementCondUEidItem.c - -8  - ~"M—su»m’tCÚdUEidI‹m.h -" - -10  - ~"M©chšgUEidLi¡.h -" - -11 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tCÚdUEidI‹m_1 -[] = { - -12 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tCÚdUEidI‹m -, -m—sTy³ -), - -13 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -15 & -a¢_DEF_M—su»m’tTy³ -, - -21 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tCÚdUEidI‹m -, -m©chšgCÚd -), - -22 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -24 & -a¢_DEF_M©chšgCÚdLi¡ -, - -30 { -ATF_POINTER -, 1, -off£tof -( -M—su»m’tCÚdUEidI‹m -, -m©chšgUEidLi¡ -), - -31 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -33 & -a¢_DEF_M©chšgUEidLi¡ -, - -40 cÚ¡  - ga¢_MAP_M—su»m’tCÚdUEidI‹m_oms_1 -[] = { 2 }; - -41 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tCÚdUEidI‹m_gs_1 -[] = { - -42 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -44 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_M—su»m’tCÚdUEidI‹m_g2–_1 -[] = { - -45 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -46 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -47 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -49 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_M—su»m’tCÚdUEidI‹m_¥ecs_1 - = { - -50 ( -M—su»m’tCÚdUEidI‹m -), - -51 -off£tof -( -M—su»m’tCÚdUEidI‹m -, -_a¢_ùx -), - -52 -a¢_MAP_M—su»m’tCÚdUEidI‹m_g2–_1 -, - -54 -a¢_MAP_M—su»m’tCÚdUEidI‹m_oms_1 -, - -58 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tCÚdUEidI‹m - = { - -61 & -a¢_OP_SEQUENCE -, - -62 -a¢_DEF_M—su»m’tCÚdUEidI‹m_gs_1 -, - -63 ( -a¢_DEF_M—su»m’tCÚdUEidI‹m_gs_1 -) - -64 /( -a¢_DEF_M—su»m’tCÚdUEidI‹m_gs_1 -[0]), - -65 -a¢_DEF_M—su»m’tCÚdUEidI‹m_gs_1 -, - -66 ( -a¢_DEF_M—su»m’tCÚdUEidI‹m_gs_1 -) - -67 /( -a¢_DEF_M—su»m’tCÚdUEidI‹m_gs_1 -[0]), - -68 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -69 -a¢_MBR_M—su»m’tCÚdUEidI‹m_1 -, - -71 & -a¢_SPC_M—su»m’tCÚdUEidI‹m_¥ecs_1 - - - @MeasurementCondUEidList.c - -8  - ~"M—su»m’tCÚdUEidLi¡.h -" - -10  - ~"M—su»m’tCÚdUEidI‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M—su»m’tCÚdUEidLi¡_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 16, 16, 1, 65535 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tCÚdUEidLi¡_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -18 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -20 & -a¢_DEF_M—su»m’tCÚdUEidI‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tCÚdUEidLi¡_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_M—su»m’tCÚdUEidLi¡_¥ecs_1 - = { - -31 ( -M—su»m’tCÚdUEidLi¡ -), - -32 -off£tof -( -M—su»m’tCÚdUEidLi¡ -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tCÚdUEidLi¡ - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_M—su»m’tCÚdUEidLi¡_gs_1 -, - -40 ( -a¢_DEF_M—su»m’tCÚdUEidLi¡_gs_1 -) - -41 /( -a¢_DEF_M—su»m’tCÚdUEidLi¡_gs_1 -[0]), - -42 -a¢_DEF_M—su»m’tCÚdUEidLi¡_gs_1 -, - -43 ( -a¢_DEF_M—su»m’tCÚdUEidLi¡_gs_1 -) - -44 /( -a¢_DEF_M—su»m’tCÚdUEidLi¡_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_M—su»m’tCÚdUEidLi¡_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_M—su»m’tCÚdUEidLi¡_1 -, - -48 & -a¢_SPC_M—su»m’tCÚdUEidLi¡_¥ecs_1 - - - @MeasurementData.c - -8  - ~"M—su»m’tD©a.h -" - -10  - ~"M—su»m’tD©aI‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M—su»m’tD©a_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 16, 16, 1, 65535 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tD©a_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -18 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -20 & -a¢_DEF_M—su»m’tD©aI‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tD©a_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_M—su»m’tD©a_¥ecs_1 - = { - -31 ( -M—su»m’tD©a -), - -32 -off£tof -( -M—su»m’tD©a -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tD©a - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_M—su»m’tD©a_gs_1 -, - -40 ( -a¢_DEF_M—su»m’tD©a_gs_1 -) - -41 /( -a¢_DEF_M—su»m’tD©a_gs_1 -[0]), - -42 -a¢_DEF_M—su»m’tD©a_gs_1 -, - -43 ( -a¢_DEF_M—su»m’tD©a_gs_1 -) - -44 /( -a¢_DEF_M—su»m’tD©a_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_M—su»m’tD©a_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_M—su»m’tD©a_1 -, - -48 & -a¢_SPC_M—su»m’tD©a_¥ecs_1 - - - @MeasurementDataItem.c - -8  - ~"M—su»m’tD©aI‹m.h -" - -14  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_šcom¶‘eFÏg_cÚ¡r_3 - - gCC_NOTUSED - = { - -15 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -16 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -19 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_šcom¶‘eFÏg_v®ue2’um_3 -[] = { - -23 cÚ¡  - ga¢_MAP_šcom¶‘eFÏg_’um2v®ue_3 -[] = { - -27 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_šcom¶‘eFÏg_¥ecs_3 - = { - -28 -a¢_MAP_šcom¶‘eFÏg_v®ue2’um_3 -, - -29 -a¢_MAP_šcom¶‘eFÏg_’um2v®ue_3 -, - -36 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_šcom¶‘eFÏg_gs_3 -[] = { - -37 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -38 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -41 -a¢_TYPE_desütÜ_t - - ga¢_DEF_šcom¶‘eFÏg_3 - = { - -44 & -a¢_OP_N©iveEnum”©ed -, - -45 -a¢_DEF_šcom¶‘eFÏg_gs_3 -, - -46 ( -a¢_DEF_šcom¶‘eFÏg_gs_3 -) - -47 /( -a¢_DEF_šcom¶‘eFÏg_gs_3 -[0]) - 1, - -48 -a¢_DEF_šcom¶‘eFÏg_gs_3 -, - -49 ( -a¢_DEF_šcom¶‘eFÏg_gs_3 -) - -50 /( -a¢_DEF_šcom¶‘eFÏg_gs_3 -[0]), - -51 { 0, & -a¢_PER_ty³_šcom¶‘eFÏg_cÚ¡r_3 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -53 & -a¢_SPC_šcom¶‘eFÏg_¥ecs_3 - - -56 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tD©aI‹m_1 -[] = { - -57 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tD©aI‹m -, -m—sRecÜd -), - -58 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -60 & -a¢_DEF_M—su»m’tRecÜd -, - -66 { -ATF_POINTER -, 1, -off£tof -( -M—su»m’tD©aI‹m -, -šcom¶‘eFÏg -), - -67 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -69 & -a¢_DEF_šcom¶‘eFÏg_3 -, - -76 cÚ¡  - ga¢_MAP_M—su»m’tD©aI‹m_oms_1 -[] = { 1 }; - -77 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tD©aI‹m_gs_1 -[] = { - -78 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -80 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_M—su»m’tD©aI‹m_g2–_1 -[] = { - -81 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -82 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -84 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_M—su»m’tD©aI‹m_¥ecs_1 - = { - -85 ( -M—su»m’tD©aI‹m -), - -86 -off£tof -( -M—su»m’tD©aI‹m -, -_a¢_ùx -), - -87 -a¢_MAP_M—su»m’tD©aI‹m_g2–_1 -, - -89 -a¢_MAP_M—su»m’tD©aI‹m_oms_1 -, - -93 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tD©aI‹m - = { - -96 & -a¢_OP_SEQUENCE -, - -97 -a¢_DEF_M—su»m’tD©aI‹m_gs_1 -, - -98 ( -a¢_DEF_M—su»m’tD©aI‹m_gs_1 -) - -99 /( -a¢_DEF_M—su»m’tD©aI‹m_gs_1 -[0]), - -100 -a¢_DEF_M—su»m’tD©aI‹m_gs_1 -, - -101 ( -a¢_DEF_M—su»m’tD©aI‹m_gs_1 -) - -102 /( -a¢_DEF_M—su»m’tD©aI‹m_gs_1 -[0]), - -103 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -104 -a¢_MBR_M—su»m’tD©aI‹m_1 -, - -106 & -a¢_SPC_M—su»m’tD©aI‹m_¥ecs_1 - - - @MeasurementInfo-Action-Item.c - -8  - ~"M—su»m’tInfo-AùiÚ-I‹m.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tInfo_AùiÚ_I‹m_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tInfo_AùiÚ_I‹m -, -m—sName -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_M—su»m’tTy³Name -, - -20 { -ATF_POINTER -, 1, -off£tof -( -M—su»m’tInfo_AùiÚ_I‹m -, -m—sID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_M—su»m’tTy³ID -, - -30 cÚ¡  - ga¢_MAP_M—su»m’tInfo_AùiÚ_I‹m_oms_1 -[] = { 1 }; - -31 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tInfo_AùiÚ_I‹m_gs_1 -[] = { - -32 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -34 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_M—su»m’tInfo_AùiÚ_I‹m_g2–_1 -[] = { - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -36 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -38 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_M—su»m’tInfo_AùiÚ_I‹m_¥ecs_1 - = { - -39 ( -M—su»m’tInfo_AùiÚ_I‹m -), - -40 -off£tof -( -M—su»m’tInfo_AùiÚ_I‹m -, -_a¢_ùx -), - -41 -a¢_MAP_M—su»m’tInfo_AùiÚ_I‹m_g2–_1 -, - -43 -a¢_MAP_M—su»m’tInfo_AùiÚ_I‹m_oms_1 -, - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tInfo_AùiÚ_I‹m - = { - -50 & -a¢_OP_SEQUENCE -, - -51 -a¢_DEF_M—su»m’tInfo_AùiÚ_I‹m_gs_1 -, - -52 ( -a¢_DEF_M—su»m’tInfo_AùiÚ_I‹m_gs_1 -) - -53 /( -a¢_DEF_M—su»m’tInfo_AùiÚ_I‹m_gs_1 -[0]), - -54 -a¢_DEF_M—su»m’tInfo_AùiÚ_I‹m_gs_1 -, - -55 ( -a¢_DEF_M—su»m’tInfo_AùiÚ_I‹m_gs_1 -) - -56 /( -a¢_DEF_M—su»m’tInfo_AùiÚ_I‹m_gs_1 -[0]), - -57 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -58 -a¢_MBR_M—su»m’tInfo_AùiÚ_I‹m_1 -, - -60 & -a¢_SPC_M—su»m’tInfo_AùiÚ_I‹m_¥ecs_1 - - - @MeasurementInfo-Action-List.c - -8  - ~"M—su»m’tInfo-AùiÚ-Li¡.h -" - -10  - ~"M—su»m’tInfo-AùiÚ-I‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M—su»m’tInfo_AùiÚ_Li¡_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 16, 16, 1, 65535 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tInfo_AùiÚ_Li¡_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -18 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -20 & -a¢_DEF_M—su»m’tInfo_AùiÚ_I‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tInfo_AùiÚ_Li¡_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_M—su»m’tInfo_AùiÚ_Li¡_¥ecs_1 - = { - -31 ( -M—su»m’tInfo_AùiÚ_Li¡ -), - -32 -off£tof -( -M—su»m’tInfo_AùiÚ_Li¡ -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tInfo_AùiÚ_Li¡ - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_M—su»m’tInfo_AùiÚ_Li¡_gs_1 -, - -40 ( -a¢_DEF_M—su»m’tInfo_AùiÚ_Li¡_gs_1 -) - -41 /( -a¢_DEF_M—su»m’tInfo_AùiÚ_Li¡_gs_1 -[0]), - -42 -a¢_DEF_M—su»m’tInfo_AùiÚ_Li¡_gs_1 -, - -43 ( -a¢_DEF_M—su»m’tInfo_AùiÚ_Li¡_gs_1 -) - -44 /( -a¢_DEF_M—su»m’tInfo_AùiÚ_Li¡_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_M—su»m’tInfo_AùiÚ_Li¡_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_M—su»m’tInfo_AùiÚ_Li¡_1 -, - -48 & -a¢_SPC_M—su»m’tInfo_AùiÚ_Li¡_¥ecs_1 - - - @MeasurementInfoItem.c - -8  - ~"M—su»m’tInfoI‹m.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tInfoI‹m_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tInfoI‹m -, -m—sTy³ -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_M—su»m’tTy³ -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tInfoI‹m -, -Ïb–InfoLi¡ -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_Lab–InfoLi¡ -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tInfoI‹m_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_M—su»m’tInfoI‹m_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_M—su»m’tInfoI‹m_¥ecs_1 - = { - -38 ( -M—su»m’tInfoI‹m -), - -39 -off£tof -( -M—su»m’tInfoI‹m -, -_a¢_ùx -), - -40 -a¢_MAP_M—su»m’tInfoI‹m_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tInfoI‹m - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_M—su»m’tInfoI‹m_gs_1 -, - -50 ( -a¢_DEF_M—su»m’tInfoI‹m_gs_1 -) - -51 /( -a¢_DEF_M—su»m’tInfoI‹m_gs_1 -[0]), - -52 -a¢_DEF_M—su»m’tInfoI‹m_gs_1 -, - -53 ( -a¢_DEF_M—su»m’tInfoI‹m_gs_1 -) - -54 /( -a¢_DEF_M—su»m’tInfoI‹m_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_M—su»m’tInfoI‹m_1 -, - -58 & -a¢_SPC_M—su»m’tInfoI‹m_¥ecs_1 - - - @MeasurementInfoList.c - -8  - ~"M—su»m’tInfoLi¡.h -" - -10  - ~"M—su»m’tInfoI‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M—su»m’tInfoLi¡_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 16, 16, 1, 65535 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tInfoLi¡_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -18 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -20 & -a¢_DEF_M—su»m’tInfoI‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tInfoLi¡_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_M—su»m’tInfoLi¡_¥ecs_1 - = { - -31 ( -M—su»m’tInfoLi¡ -), - -32 -off£tof -( -M—su»m’tInfoLi¡ -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tInfoLi¡ - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_M—su»m’tInfoLi¡_gs_1 -, - -40 ( -a¢_DEF_M—su»m’tInfoLi¡_gs_1 -) - -41 /( -a¢_DEF_M—su»m’tInfoLi¡_gs_1 -[0]), - -42 -a¢_DEF_M—su»m’tInfoLi¡_gs_1 -, - -43 ( -a¢_DEF_M—su»m’tInfoLi¡_gs_1 -) - -44 /( -a¢_DEF_M—su»m’tInfoLi¡_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_M—su»m’tInfoLi¡_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_M—su»m’tInfoLi¡_1 -, - -48 & -a¢_SPC_M—su»m’tInfoLi¡_¥ecs_1 - - - @MeasurementLabel.c - -8  - ~"M—su»m’tLab–.h -" - -10  - ~"S-NSSAI.h -" - -40 - $memb_aRPmax_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -41 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -42  -v®ue -; - -44 if(! -¥Œ -) { - -45 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -47 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -51 -v®ue - = *(cÚ¡ *) -¥Œ -; - -53 if(( -v®ue - >= 1 && value <= 15)) { - -57 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -59 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -62 - } -} - -65 - $memb_aRPmš_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -66 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -67  -v®ue -; - -69 if(! -¥Œ -) { - -70 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -72 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -76 -v®ue - = *(cÚ¡ *) -¥Œ -; - -78 if(( -v®ue - >= 1 && value <= 15)) { - -82 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -84 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -87 - } -} - -90 - $memb_b™¿‹Rªge_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -91 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -92  -v®ue -; - -94 if(! -¥Œ -) { - -95 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -97 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -101 -v®ue - = *(cÚ¡ *) -¥Œ -; - -103 if(( -v®ue - >= 1 && value <= 65535)) { - -107 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -109 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -112 - } -} - -115 - $memb_Ïy”MU_MIMO_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -116 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -117  -v®ue -; - -119 if(! -¥Œ -) { - -120 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -122 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -126 -v®ue - = *(cÚ¡ *) -¥Œ -; - -128 if(( -v®ue - >= 1 && value <= 65535)) { - -132 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -134 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -137 - } -} - -140 - $memb_di¡BšX_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -141 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -142  -v®ue -; - -144 if(! -¥Œ -) { - -145 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -147 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -151 -v®ue - = *(cÚ¡ *) -¥Œ -; - -153 if(( -v®ue - >= 1 && value <= 65535)) { - -157 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -159 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -162 - } -} - -165 - $memb_di¡BšY_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -166 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -167  -v®ue -; - -169 if(! -¥Œ -) { - -170 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -172 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -176 -v®ue - = *(cÚ¡ *) -¥Œ -; - -178 if(( -v®ue - >= 1 && value <= 65535)) { - -182 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -184 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -187 - } -} - -190 - $memb_di¡BšZ_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -191 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -192  -v®ue -; - -194 if(! -¥Œ -) { - -195 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -197 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -201 -v®ue - = *(cÚ¡ *) -¥Œ -; - -203 if(( -v®ue - >= 1 && value <= 65535)) { - -207 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -209 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -212 - } -} - -214  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_noLab–_cÚ¡r_2 - - gCC_NOTUSED - = { - -215 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -216 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -219  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_sUM_cÚ¡r_16 - - gCC_NOTUSED - = { - -220 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -221 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -224  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_´eLab–Ov”ride_cÚ¡r_22 - - gCC_NOTUSED - = { - -225 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -226 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -229  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_¡¬tEndInd_cÚ¡r_25 - - gCC_NOTUSED - = { - -230 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -231 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -234  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_mš_cÚ¡r_29 - - gCC_NOTUSED - = { - -235 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -236 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -239  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_max_cÚ¡r_32 - - gCC_NOTUSED - = { - -240 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -241 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -244  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_avg_cÚ¡r_35 - - gCC_NOTUSED - = { - -245 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -246 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -249  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_aRPmax_cÚ¡r_12 - - gCC_NOTUSED - = { - -250 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 4, 4, 1, 15 } , - -251 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -254  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_aRPmš_cÚ¡r_13 - - gCC_NOTUSED - = { - -255 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 4, 4, 1, 15 } , - -256 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -259  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_b™¿‹Rªge_cÚ¡r_14 - - gCC_NOTUSED - = { - -260 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 16, 16, 1, 65535 } , - -261 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -264  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_Ïy”MU_MIMO_cÚ¡r_15 - - gCC_NOTUSED - = { - -265 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 16, 16, 1, 65535 } , - -266 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -269  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_di¡BšX_cÚ¡r_19 - - gCC_NOTUSED - = { - -270 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 16, 16, 1, 65535 } , - -271 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -274  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_di¡BšY_cÚ¡r_20 - - gCC_NOTUSED - = { - -275 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 16, 16, 1, 65535 } , - -276 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -279  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_di¡BšZ_cÚ¡r_21 - - gCC_NOTUSED - = { - -280 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 16, 16, 1, 65535 } , - -281 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -284 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_noLab–_v®ue2’um_2 -[] = { - -288 cÚ¡  - ga¢_MAP_noLab–_’um2v®ue_2 -[] = { - -292 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_noLab–_¥ecs_2 - = { - -293 -a¢_MAP_noLab–_v®ue2’um_2 -, - -294 -a¢_MAP_noLab–_’um2v®ue_2 -, - -301 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_noLab–_gs_2 -[] = { - -302 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -303 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -306 -a¢_TYPE_desütÜ_t - - ga¢_DEF_noLab–_2 - = { - -309 & -a¢_OP_N©iveEnum”©ed -, - -310 -a¢_DEF_noLab–_gs_2 -, - -311 ( -a¢_DEF_noLab–_gs_2 -) - -312 /( -a¢_DEF_noLab–_gs_2 -[0]) - 1, - -313 -a¢_DEF_noLab–_gs_2 -, - -314 ( -a¢_DEF_noLab–_gs_2 -) - -315 /( -a¢_DEF_noLab–_gs_2 -[0]), - -316 { 0, & -a¢_PER_ty³_noLab–_cÚ¡r_2 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -318 & -a¢_SPC_noLab–_¥ecs_2 - - -321 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_sUM_v®ue2’um_16 -[] = { - -325 cÚ¡  - ga¢_MAP_sUM_’um2v®ue_16 -[] = { - -329 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_sUM_¥ecs_16 - = { - -330 -a¢_MAP_sUM_v®ue2’um_16 -, - -331 -a¢_MAP_sUM_’um2v®ue_16 -, - -338 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_sUM_gs_16 -[] = { - -339 ( -ASN_TAG_CLASS_CONTEXT - | (12 << 2)), - -340 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -343 -a¢_TYPE_desütÜ_t - - ga¢_DEF_sUM_16 - = { - -346 & -a¢_OP_N©iveEnum”©ed -, - -347 -a¢_DEF_sUM_gs_16 -, - -348 ( -a¢_DEF_sUM_gs_16 -) - -349 /( -a¢_DEF_sUM_gs_16 -[0]) - 1, - -350 -a¢_DEF_sUM_gs_16 -, - -351 ( -a¢_DEF_sUM_gs_16 -) - -352 /( -a¢_DEF_sUM_gs_16 -[0]), - -353 { 0, & -a¢_PER_ty³_sUM_cÚ¡r_16 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -355 & -a¢_SPC_sUM_¥ecs_16 - - -358 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_´eLab–Ov”ride_v®ue2’um_22 -[] = { - -362 cÚ¡  - ga¢_MAP_´eLab–Ov”ride_’um2v®ue_22 -[] = { - -366 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_´eLab–Ov”ride_¥ecs_22 - = { - -367 -a¢_MAP_´eLab–Ov”ride_v®ue2’um_22 -, - -368 -a¢_MAP_´eLab–Ov”ride_’um2v®ue_22 -, - -375 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_´eLab–Ov”ride_gs_22 -[] = { - -376 ( -ASN_TAG_CLASS_CONTEXT - | (16 << 2)), - -377 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -380 -a¢_TYPE_desütÜ_t - - ga¢_DEF_´eLab–Ov”ride_22 - = { - -383 & -a¢_OP_N©iveEnum”©ed -, - -384 -a¢_DEF_´eLab–Ov”ride_gs_22 -, - -385 ( -a¢_DEF_´eLab–Ov”ride_gs_22 -) - -386 /( -a¢_DEF_´eLab–Ov”ride_gs_22 -[0]) - 1, - -387 -a¢_DEF_´eLab–Ov”ride_gs_22 -, - -388 ( -a¢_DEF_´eLab–Ov”ride_gs_22 -) - -389 /( -a¢_DEF_´eLab–Ov”ride_gs_22 -[0]), - -390 { 0, & -a¢_PER_ty³_´eLab–Ov”ride_cÚ¡r_22 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -392 & -a¢_SPC_´eLab–Ov”ride_¥ecs_22 - - -395 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_¡¬tEndInd_v®ue2’um_25 -[] = { - -400 cÚ¡  - ga¢_MAP_¡¬tEndInd_’um2v®ue_25 -[] = { - -405 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_¡¬tEndInd_¥ecs_25 - = { - -406 -a¢_MAP_¡¬tEndInd_v®ue2’um_25 -, - -407 -a¢_MAP_¡¬tEndInd_’um2v®ue_25 -, - -414 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_¡¬tEndInd_gs_25 -[] = { - -415 ( -ASN_TAG_CLASS_CONTEXT - | (17 << 2)), - -416 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -419 -a¢_TYPE_desütÜ_t - - ga¢_DEF_¡¬tEndInd_25 - = { - -422 & -a¢_OP_N©iveEnum”©ed -, - -423 -a¢_DEF_¡¬tEndInd_gs_25 -, - -424 ( -a¢_DEF_¡¬tEndInd_gs_25 -) - -425 /( -a¢_DEF_¡¬tEndInd_gs_25 -[0]) - 1, - -426 -a¢_DEF_¡¬tEndInd_gs_25 -, - -427 ( -a¢_DEF_¡¬tEndInd_gs_25 -) - -428 /( -a¢_DEF_¡¬tEndInd_gs_25 -[0]), - -429 { 0, & -a¢_PER_ty³_¡¬tEndInd_cÚ¡r_25 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -431 & -a¢_SPC_¡¬tEndInd_¥ecs_25 - - -434 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_mš_v®ue2’um_29 -[] = { - -438 cÚ¡  - ga¢_MAP_mš_’um2v®ue_29 -[] = { - -442 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_mš_¥ecs_29 - = { - -443 -a¢_MAP_mš_v®ue2’um_29 -, - -444 -a¢_MAP_mš_’um2v®ue_29 -, - -451 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_mš_gs_29 -[] = { - -452 ( -ASN_TAG_CLASS_CONTEXT - | (18 << 2)), - -453 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -456 -a¢_TYPE_desütÜ_t - - ga¢_DEF_mš_29 - = { - -459 & -a¢_OP_N©iveEnum”©ed -, - -460 -a¢_DEF_mš_gs_29 -, - -461 ( -a¢_DEF_mš_gs_29 -) - -462 /( -a¢_DEF_mš_gs_29 -[0]) - 1, - -463 -a¢_DEF_mš_gs_29 -, - -464 ( -a¢_DEF_mš_gs_29 -) - -465 /( -a¢_DEF_mš_gs_29 -[0]), - -466 { 0, & -a¢_PER_ty³_mš_cÚ¡r_29 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -468 & -a¢_SPC_mš_¥ecs_29 - - -471 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_max_v®ue2’um_32 -[] = { - -475 cÚ¡  - ga¢_MAP_max_’um2v®ue_32 -[] = { - -479 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_max_¥ecs_32 - = { - -480 -a¢_MAP_max_v®ue2’um_32 -, - -481 -a¢_MAP_max_’um2v®ue_32 -, - -488 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_max_gs_32 -[] = { - -489 ( -ASN_TAG_CLASS_CONTEXT - | (19 << 2)), - -490 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -493 -a¢_TYPE_desütÜ_t - - ga¢_DEF_max_32 - = { - -496 & -a¢_OP_N©iveEnum”©ed -, - -497 -a¢_DEF_max_gs_32 -, - -498 ( -a¢_DEF_max_gs_32 -) - -499 /( -a¢_DEF_max_gs_32 -[0]) - 1, - -500 -a¢_DEF_max_gs_32 -, - -501 ( -a¢_DEF_max_gs_32 -) - -502 /( -a¢_DEF_max_gs_32 -[0]), - -503 { 0, & -a¢_PER_ty³_max_cÚ¡r_32 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -505 & -a¢_SPC_max_¥ecs_32 - - -508 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_avg_v®ue2’um_35 -[] = { - -512 cÚ¡  - ga¢_MAP_avg_’um2v®ue_35 -[] = { - -516 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_avg_¥ecs_35 - = { - -517 -a¢_MAP_avg_v®ue2’um_35 -, - -518 -a¢_MAP_avg_’um2v®ue_35 -, - -525 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_avg_gs_35 -[] = { - -526 ( -ASN_TAG_CLASS_CONTEXT - | (20 << 2)), - -527 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -530 -a¢_TYPE_desütÜ_t - - ga¢_DEF_avg_35 - = { - -533 & -a¢_OP_N©iveEnum”©ed -, - -534 -a¢_DEF_avg_gs_35 -, - -535 ( -a¢_DEF_avg_gs_35 -) - -536 /( -a¢_DEF_avg_gs_35 -[0]) - 1, - -537 -a¢_DEF_avg_gs_35 -, - -538 ( -a¢_DEF_avg_gs_35 -) - -539 /( -a¢_DEF_avg_gs_35 -[0]), - -540 { 0, & -a¢_PER_ty³_avg_cÚ¡r_35 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -542 & -a¢_SPC_avg_¥ecs_35 - - -545 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tLab–_1 -[] = { - -546 { -ATF_POINTER -, 21, -off£tof -( -M—su»m’tLab– -, -noLab– -), - -547 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -549 & -a¢_DEF_noLab–_2 -, - -555 { -ATF_POINTER -, 20, -off£tof -( -M—su»m’tLab– -, -¶mnID -), - -556 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -558 & -a¢_DEF_PLMNId’t™y -, - -564 { -ATF_POINTER -, 19, -off£tof -( -M—su»m’tLab– -, -¦iûID -), - -565 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -567 & -a¢_DEF_S_NSSAI -, - -573 { -ATF_POINTER -, 18, -off£tof -( -M—su»m’tLab– -, -fiveQI -), - -574 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -576 & -a¢_DEF_FiveQI -, - -582 { -ATF_POINTER -, 17, -off£tof -( -M—su»m’tLab– -, -qFI -), - -583 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -585 & -a¢_DEF_QosFlowId’tif›r -, - -591 { -ATF_POINTER -, 16, -off£tof -( -M—su»m’tLab– -, -qCI -), - -592 ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), - -594 & -a¢_DEF_QCI -, - -600 { -ATF_POINTER -, 15, -off£tof -( -M—su»m’tLab– -, -qCImax -), - -601 ( -ASN_TAG_CLASS_CONTEXT - | (6 << 2)), - -603 & -a¢_DEF_QCI -, - -609 { -ATF_POINTER -, 14, -off£tof -( -M—su»m’tLab– -, -qCImš -), - -610 ( -ASN_TAG_CLASS_CONTEXT - | (7 << 2)), - -612 & -a¢_DEF_QCI -, - -618 { -ATF_POINTER -, 13, -off£tof -( -M—su»m’tLab– -, -aRPmax -), - -619 ( -ASN_TAG_CLASS_CONTEXT - | (8 << 2)), - -621 & -a¢_DEF_N©iveIÁeg” -, - -623 { 0, & -a¢_PER_memb_aRPmax_cÚ¡r_12 -, -memb_aRPmax_cÚ¡¿št_1 - }, - -627 { -ATF_POINTER -, 12, -off£tof -( -M—su»m’tLab– -, -aRPmš -), - -628 ( -ASN_TAG_CLASS_CONTEXT - | (9 << 2)), - -630 & -a¢_DEF_N©iveIÁeg” -, - -632 { 0, & -a¢_PER_memb_aRPmš_cÚ¡r_13 -, -memb_aRPmš_cÚ¡¿št_1 - }, - -636 { -ATF_POINTER -, 11, -off£tof -( -M—su»m’tLab– -, -b™¿‹Rªge -), - -637 ( -ASN_TAG_CLASS_CONTEXT - | (10 << 2)), - -639 & -a¢_DEF_N©iveIÁeg” -, - -641 { 0, & -a¢_PER_memb_b™¿‹Rªge_cÚ¡r_14 -, -memb_b™¿‹Rªge_cÚ¡¿št_1 - }, - -645 { -ATF_POINTER -, 10, -off£tof -( -M—su»m’tLab– -, -Ïy”MU_MIMO -), - -646 ( -ASN_TAG_CLASS_CONTEXT - | (11 << 2)), - -648 & -a¢_DEF_N©iveIÁeg” -, - -650 { 0, & -a¢_PER_memb_Ïy”MU_MIMO_cÚ¡r_15 -, -memb_Ïy”MU_MIMO_cÚ¡¿št_1 - }, - -654 { -ATF_POINTER -, 9, -off£tof -( -M—su»m’tLab– -, -sUM -), - -655 ( -ASN_TAG_CLASS_CONTEXT - | (12 << 2)), - -657 & -a¢_DEF_sUM_16 -, - -663 { -ATF_POINTER -, 8, -off£tof -( -M—su»m’tLab– -, -di¡BšX -), - -664 ( -ASN_TAG_CLASS_CONTEXT - | (13 << 2)), - -666 & -a¢_DEF_N©iveIÁeg” -, - -668 { 0, & -a¢_PER_memb_di¡BšX_cÚ¡r_19 -, -memb_di¡BšX_cÚ¡¿št_1 - }, - -672 { -ATF_POINTER -, 7, -off£tof -( -M—su»m’tLab– -, -di¡BšY -), - -673 ( -ASN_TAG_CLASS_CONTEXT - | (14 << 2)), - -675 & -a¢_DEF_N©iveIÁeg” -, - -677 { 0, & -a¢_PER_memb_di¡BšY_cÚ¡r_20 -, -memb_di¡BšY_cÚ¡¿št_1 - }, - -681 { -ATF_POINTER -, 6, -off£tof -( -M—su»m’tLab– -, -di¡BšZ -), - -682 ( -ASN_TAG_CLASS_CONTEXT - | (15 << 2)), - -684 & -a¢_DEF_N©iveIÁeg” -, - -686 { 0, & -a¢_PER_memb_di¡BšZ_cÚ¡r_21 -, -memb_di¡BšZ_cÚ¡¿št_1 - }, - -690 { -ATF_POINTER -, 5, -off£tof -( -M—su»m’tLab– -, -´eLab–Ov”ride -), - -691 ( -ASN_TAG_CLASS_CONTEXT - | (16 << 2)), - -693 & -a¢_DEF_´eLab–Ov”ride_22 -, - -699 { -ATF_POINTER -, 4, -off£tof -( -M—su»m’tLab– -, -¡¬tEndInd -), - -700 ( -ASN_TAG_CLASS_CONTEXT - | (17 << 2)), - -702 & -a¢_DEF_¡¬tEndInd_25 -, - -708 { -ATF_POINTER -, 3, -off£tof -( -M—su»m’tLab– -, -mš -), - -709 ( -ASN_TAG_CLASS_CONTEXT - | (18 << 2)), - -711 & -a¢_DEF_mš_29 -, - -717 { -ATF_POINTER -, 2, -off£tof -( -M—su»m’tLab– -, -max -), - -718 ( -ASN_TAG_CLASS_CONTEXT - | (19 << 2)), - -720 & -a¢_DEF_max_32 -, - -726 { -ATF_POINTER -, 1, -off£tof -( -M—su»m’tLab– -, -avg -), - -727 ( -ASN_TAG_CLASS_CONTEXT - | (20 << 2)), - -729 & -a¢_DEF_avg_35 -, - -736 cÚ¡  - ga¢_MAP_M—su»m’tLab–_oms_1 -[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; - -737 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tLab–_gs_1 -[] = { - -738 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -740 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_M—su»m’tLab–_g2–_1 -[] = { - -741 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -742 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -743 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -744 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 }, - -745 { ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), 4, 0, 0 }, - -746 { ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), 5, 0, 0 }, - -747 { ( -ASN_TAG_CLASS_CONTEXT - | (6 << 2)), 6, 0, 0 }, - -748 { ( -ASN_TAG_CLASS_CONTEXT - | (7 << 2)), 7, 0, 0 }, - -749 { ( -ASN_TAG_CLASS_CONTEXT - | (8 << 2)), 8, 0, 0 }, - -750 { ( -ASN_TAG_CLASS_CONTEXT - | (9 << 2)), 9, 0, 0 }, - -751 { ( -ASN_TAG_CLASS_CONTEXT - | (10 << 2)), 10, 0, 0 }, - -752 { ( -ASN_TAG_CLASS_CONTEXT - | (11 << 2)), 11, 0, 0 }, - -753 { ( -ASN_TAG_CLASS_CONTEXT - | (12 << 2)), 12, 0, 0 }, - -754 { ( -ASN_TAG_CLASS_CONTEXT - | (13 << 2)), 13, 0, 0 }, - -755 { ( -ASN_TAG_CLASS_CONTEXT - | (14 << 2)), 14, 0, 0 }, - -756 { ( -ASN_TAG_CLASS_CONTEXT - | (15 << 2)), 15, 0, 0 }, - -757 { ( -ASN_TAG_CLASS_CONTEXT - | (16 << 2)), 16, 0, 0 }, - -758 { ( -ASN_TAG_CLASS_CONTEXT - | (17 << 2)), 17, 0, 0 }, - -759 { ( -ASN_TAG_CLASS_CONTEXT - | (18 << 2)), 18, 0, 0 }, - -760 { ( -ASN_TAG_CLASS_CONTEXT - | (19 << 2)), 19, 0, 0 }, - -761 { ( -ASN_TAG_CLASS_CONTEXT - | (20 << 2)), 20, 0, 0 } - -763 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_M—su»m’tLab–_¥ecs_1 - = { - -764 ( -M—su»m’tLab– -), - -765 -off£tof -( -M—su»m’tLab– -, -_a¢_ùx -), - -766 -a¢_MAP_M—su»m’tLab–_g2–_1 -, - -768 -a¢_MAP_M—su»m’tLab–_oms_1 -, - -772 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tLab– - = { - -775 & -a¢_OP_SEQUENCE -, - -776 -a¢_DEF_M—su»m’tLab–_gs_1 -, - -777 ( -a¢_DEF_M—su»m’tLab–_gs_1 -) - -778 /( -a¢_DEF_M—su»m’tLab–_gs_1 -[0]), - -779 -a¢_DEF_M—su»m’tLab–_gs_1 -, - -780 ( -a¢_DEF_M—su»m’tLab–_gs_1 -) - -781 /( -a¢_DEF_M—su»m’tLab–_gs_1 -[0]), - -782 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -783 -a¢_MBR_M—su»m’tLab–_1 -, - -785 & -a¢_SPC_M—su»m’tLab–_¥ecs_1 - - - @MeasurementRecord.c - -8  - ~"M—su»m’tRecÜd.h -" - -10  - ~"M—su»m’tRecÜdI‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M—su»m’tRecÜd_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 31, -1, 1, 2147483647 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tRecÜd_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -20 & -a¢_DEF_M—su»m’tRecÜdI‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tRecÜd_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_M—su»m’tRecÜd_¥ecs_1 - = { - -31 ( -M—su»m’tRecÜd -), - -32 -off£tof -( -M—su»m’tRecÜd -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tRecÜd - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_M—su»m’tRecÜd_gs_1 -, - -40 ( -a¢_DEF_M—su»m’tRecÜd_gs_1 -) - -41 /( -a¢_DEF_M—su»m’tRecÜd_gs_1 -[0]), - -42 -a¢_DEF_M—su»m’tRecÜd_gs_1 -, - -43 ( -a¢_DEF_M—su»m’tRecÜd_gs_1 -) - -44 /( -a¢_DEF_M—su»m’tRecÜd_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_M—su»m’tRecÜd_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_M—su»m’tRecÜd_1 -, - -48 & -a¢_SPC_M—su»m’tRecÜd_¥ecs_1 - - - @MeasurementRecordItem.c - -8  - ~"M—su»m’tRecÜdI‹m.h -" - -11 - $š‹g”_2_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -14 if(! -¥Œ -) { - -15 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -17 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -24 - } -} - -31 - $memb_š‹g”_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -32 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -34 if(! -¥Œ -) { - -35 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -37 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -44 - } -} - -46  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_š‹g”_cÚ¡r_2 - - gCC_NOTUSED - = { - -47 { -APC_CONSTRAINED -, 32, -1, 0, 4294967295 } , - -48 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -51  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_š‹g”_cÚ¡r_2 - - gCC_NOTUSED - = { - -52 { -APC_CONSTRAINED -, 32, -1, 0, 4294967295 } , - -53 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -56 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M—su»m’tRecÜdI‹m_cÚ¡r_1 - - gCC_NOTUSED - = { - -57 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 2, 2, 0, 2 } , - -58 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -61 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_š‹g”_¥ecs_2 - = { - -66 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_š‹g”_gs_2 -[] = { - -67 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -68 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -71 -a¢_TYPE_desütÜ_t - - ga¢_DEF_š‹g”_2 - = { - -74 & -a¢_OP_N©iveIÁeg” -, - -75 -a¢_DEF_š‹g”_gs_2 -, - -76 ( -a¢_DEF_š‹g”_gs_2 -) - -77 /( -a¢_DEF_š‹g”_gs_2 -[0]) - 1, - -78 -a¢_DEF_š‹g”_gs_2 -, - -79 ( -a¢_DEF_š‹g”_gs_2 -) - -80 /( -a¢_DEF_š‹g”_gs_2 -[0]), - -81 { 0, & -a¢_PER_ty³_š‹g”_cÚ¡r_2 -, -š‹g”_2_cÚ¡¿št - }, - -83 & -a¢_SPC_š‹g”_¥ecs_2 - - -86 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tRecÜdI‹m_1 -[] = { - -87 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tRecÜdI‹m -, -choiû -. -š‹g” -), - -88 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -90 & -a¢_DEF_š‹g”_2 -, - -92 { 0, & -a¢_PER_memb_š‹g”_cÚ¡r_2 -, -memb_š‹g”_cÚ¡¿št_1 - }, - -96 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tRecÜdI‹m -, -choiû -. -»® -), - -97 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -99 & -a¢_DEF_N©iveR—l -, - -105 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tRecÜdI‹m -, -choiû -. -noV®ue -), - -106 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -108 & -a¢_DEF_NULL -, - -115 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_M—su»m’tRecÜdI‹m_g2–_1 -[] = { - -116 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -117 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -118 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -120 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_M—su»m’tRecÜdI‹m_¥ecs_1 - = { - -121 ( -M—su»m’tRecÜdI‹m -), - -122 -off£tof -( -M—su»m’tRecÜdI‹m -, -_a¢_ùx -), - -123 -off£tof -( -M—su»m’tRecÜdI‹m -, -´e£Á -), - -124 ((( -M—su»m’tRecÜdI‹m - *)0)-> -´e£Á -), - -125 -a¢_MAP_M—su»m’tRecÜdI‹m_g2–_1 -, - -130 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tRecÜdI‹m - = { - -133 & -a¢_OP_CHOICE -, - -138 { 0, & -a¢_PER_ty³_M—su»m’tRecÜdI‹m_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -139 -a¢_MBR_M—su»m’tRecÜdI‹m_1 -, - -141 & -a¢_SPC_M—su»m’tRecÜdI‹m_¥ecs_1 - - - @MeasurementType.c - -8  - ~"M—su»m’tTy³.h -" - -10 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M—su»m’tTy³_cÚ¡r_1 - - gCC_NOTUSED - = { - -11 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -15 -a¢_TYPE_memb”_t - - ga¢_MBR_M—su»m’tTy³_1 -[] = { - -16 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tTy³ -, -choiû -. -m—sName -), - -17 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -19 & -a¢_DEF_M—su»m’tTy³Name -, - -25 { -ATF_NOFLAGS -, 0, -off£tof -( -M—su»m’tTy³ -, -choiû -. -m—sID -), - -26 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -28 & -a¢_DEF_M—su»m’tTy³ID -, - -35 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_M—su»m’tTy³_g2–_1 -[] = { - -36 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -37 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -39 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_M—su»m’tTy³_¥ecs_1 - = { - -40 ( -M—su»m’tTy³ -), - -41 -off£tof -( -M—su»m’tTy³ -, -_a¢_ùx -), - -42 -off£tof -( -M—su»m’tTy³ -, -´e£Á -), - -43 ((( -M—su»m’tTy³ - *)0)-> -´e£Á -), - -44 -a¢_MAP_M—su»m’tTy³_g2–_1 -, - -49 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tTy³ - = { - -52 & -a¢_OP_CHOICE -, - -57 { 0, & -a¢_PER_ty³_M—su»m’tTy³_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -58 -a¢_MBR_M—su»m’tTy³_1 -, - -60 & -a¢_SPC_M—su»m’tTy³_¥ecs_1 - - - @MeasurementTypeID.c - -8  - ~"M—su»m’tTy³ID.h -" - -11 - $M—su»m’tTy³ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 1 && value <= 65536)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M—su»m’tTy³ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 16, -1, 1, 65536 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tTy³ID_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tTy³ID - = { - -50 & -a¢_OP_N©iveIÁeg” -, - -51 -a¢_DEF_M—su»m’tTy³ID_gs_1 -, - -52 ( -a¢_DEF_M—su»m’tTy³ID_gs_1 -) - -53 /( -a¢_DEF_M—su»m’tTy³ID_gs_1 -[0]), - -54 -a¢_DEF_M—su»m’tTy³ID_gs_1 -, - -55 ( -a¢_DEF_M—su»m’tTy³ID_gs_1 -) - -56 /( -a¢_DEF_M—su»m’tTy³ID_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_M—su»m’tTy³ID_cÚ¡r_1 -, -M—su»m’tTy³ID_cÚ¡¿št - }, - - @MeasurementTypeName.c - -8  - ~"M—su»m’tTy³Name.h -" - -10 cÚ¡  - g³rm™‹d_®phab‘_bË_1 -[256] = { - -20 cÚ¡  - g³rm™‹d_®phab‘_code2v®ue_1 -[74] = { - -28  - $check_³rm™‹d_®phab‘_1 -(cÚ¡ * -¥Œ -) { - -29 cÚ¡ * -bË - = -³rm™‹d_®phab‘_bË_1 -; - -31 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -32 cÚ¡ -ušt8_t - * -ch - = -¡ --> -buf -; - -33 cÚ¡ -ušt8_t - * -’d - = -ch - + -¡ --> -size -; - -35 ; -ch - < -’d -; ch++) { - -36 -ušt8_t - -cv - = * -ch -; - -37 if(! -bË -[ -cv -])  -1; - -40 - } -} - -43 - $M—su»m’tTy³Name_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -44 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -45 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -46 -size_t - -size -; - -48 if(! -¥Œ -) { - -49 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -51 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -55 -size - = -¡ -->size; - -57 if(( -size - >= 1 && size <= 150) - -58 && ! - `check_³rm™‹d_®phab‘_1 -( -¡ -)) { - -62 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -64 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -67 - } -} - -69  - $a¢_PER_MAP_M—su»m’tTy³Name_1_v2c -( -v®ue -) { - -70 if( -v®ue - >ð( -³rm™‹d_®phab‘_bË_1 -)/(permitted_alphabet_table_1[0])) - -72  -³rm™‹d_®phab‘_bË_1 -[ -v®ue -] - 1; - -73 - } -} - -74  - $a¢_PER_MAP_M—su»m’tTy³Name_1_c2v -( -code -) { - -75 if( -code - >ð( -³rm™‹d_®phab‘_code2v®ue_1 -)/(permitted_alphabet_code2value_1[0])) - -77  -³rm™‹d_®phab‘_code2v®ue_1 -[ -code -]; - -78 - } -} - -83 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_M—su»m’tTy³Name_cÚ¡r_1 - - gCC_NOTUSED - = { - -84 { -APC_CONSTRAINED -, 7, 7, 32, 122 } , - -85 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 8, 8, 1, 150 } , - -86 -a¢_PER_MAP_M—su»m’tTy³Name_1_v2c -, - -87 -a¢_PER_MAP_M—su»m’tTy³Name_1_c2v - - -89 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_M—su»m’tTy³Name_gs_1 -[] = { - -90 ( -ASN_TAG_CLASS_UNIVERSAL - | (19 << 2)) - -92 -a¢_TYPE_desütÜ_t - - ga¢_DEF_M—su»m’tTy³Name - = { - -95 & -a¢_OP_PršbËSŒšg -, - -96 -a¢_DEF_M—su»m’tTy³Name_gs_1 -, - -97 ( -a¢_DEF_M—su»m’tTy³Name_gs_1 -) - -98 /( -a¢_DEF_M—su»m’tTy³Name_gs_1 -[0]), - -99 -a¢_DEF_M—su»m’tTy³Name_gs_1 -, - -100 ( -a¢_DEF_M—su»m’tTy³Name_gs_1 -) - -101 /( -a¢_DEF_M—su»m’tTy³Name_gs_1 -[0]), - -102 { 0, & -a¢_PER_ty³_M—su»m’tTy³Name_cÚ¡r_1 -, -M—su»m’tTy³Name_cÚ¡¿št - }, - - @NG-RANnodeUEXnAPID.c - -8  - ~"NG-RANnodeUEXnAPID.h -" - -11 - $NG_RANnodeUEXnAPID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -14 if(! -¥Œ -) { - -15 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -17 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -24 - } -} - -30 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_NG_RANnodeUEXnAPID_cÚ¡r_1 - - gCC_NOTUSED - = { - -31 { -APC_CONSTRAINED -, 32, -1, 0, 4294967295 } , - -32 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -35 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_NG_RANnodeUEXnAPID_¥ecs_1 - = { - -40 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NG_RANnodeUEXnAPID_gs_1 -[] = { - -41 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -43 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NG_RANnodeUEXnAPID - = { - -46 & -a¢_OP_N©iveIÁeg” -, - -47 -a¢_DEF_NG_RANnodeUEXnAPID_gs_1 -, - -48 ( -a¢_DEF_NG_RANnodeUEXnAPID_gs_1 -) - -49 /( -a¢_DEF_NG_RANnodeUEXnAPID_gs_1 -[0]), - -50 -a¢_DEF_NG_RANnodeUEXnAPID_gs_1 -, - -51 ( -a¢_DEF_NG_RANnodeUEXnAPID_gs_1 -) - -52 /( -a¢_DEF_NG_RANnodeUEXnAPID_gs_1 -[0]), - -53 { 0, & -a¢_PER_ty³_NG_RANnodeUEXnAPID_cÚ¡r_1 -, -NG_RANnodeUEXnAPID_cÚ¡¿št - }, - -55 & -a¢_SPC_NG_RANnodeUEXnAPID_¥ecs_1 - - - @NGENB-CU-UE-W1AP-ID.c - -8  - ~"NGENB-CU-UE-W1AP-ID.h -" - -11 - $NGENB_CU_UE_W1AP_ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -14 if(! -¥Œ -) { - -15 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -17 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -24 - } -} - -30 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_NGENB_CU_UE_W1AP_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -31 { -APC_CONSTRAINED -, 32, -1, 0, 4294967295 } , - -32 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -35 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_NGENB_CU_UE_W1AP_ID_¥ecs_1 - = { - -40 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NGENB_CU_UE_W1AP_ID_gs_1 -[] = { - -41 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -43 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NGENB_CU_UE_W1AP_ID - = { - -46 & -a¢_OP_N©iveIÁeg” -, - -47 -a¢_DEF_NGENB_CU_UE_W1AP_ID_gs_1 -, - -48 ( -a¢_DEF_NGENB_CU_UE_W1AP_ID_gs_1 -) - -49 /( -a¢_DEF_NGENB_CU_UE_W1AP_ID_gs_1 -[0]), - -50 -a¢_DEF_NGENB_CU_UE_W1AP_ID_gs_1 -, - -51 ( -a¢_DEF_NGENB_CU_UE_W1AP_ID_gs_1 -) - -52 /( -a¢_DEF_NGENB_CU_UE_W1AP_ID_gs_1 -[0]), - -53 { 0, & -a¢_PER_ty³_NGENB_CU_UE_W1AP_ID_cÚ¡r_1 -, -NGENB_CU_UE_W1AP_ID_cÚ¡¿št - }, - -55 & -a¢_SPC_NGENB_CU_UE_W1AP_ID_¥ecs_1 - - - @NGENB-DU-ID.c - -8  - ~"NGENB-DU-ID.h -" - -11 - $NGENB_DU_ID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -INTEGER_t - * -¡ - = (cÚ¡ INTEGER_ˆ*) -¥Œ -; - -14  -v®ue -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( - `a¢_INTEGER2lÚg -( -¡ -, & -v®ue -)) { - -24 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -26 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -30 if(( -v®ue - >= 0 && value <= 68719476735)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -45 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_NGENB_DU_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -46 { -APC_CONSTRAINED -, 36, -1, 0, 68719476735 } , - -47 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -50 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NGENB_DU_ID_gs_1 -[] = { - -51 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -53 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NGENB_DU_ID - = { - -56 & -a¢_OP_INTEGER -, - -57 -a¢_DEF_NGENB_DU_ID_gs_1 -, - -58 ( -a¢_DEF_NGENB_DU_ID_gs_1 -) - -59 /( -a¢_DEF_NGENB_DU_ID_gs_1 -[0]), - -60 -a¢_DEF_NGENB_DU_ID_gs_1 -, - -61 ( -a¢_DEF_NGENB_DU_ID_gs_1 -) - -62 /( -a¢_DEF_NGENB_DU_ID_gs_1 -[0]), - -63 { 0, & -a¢_PER_ty³_NGENB_DU_ID_cÚ¡r_1 -, -NGENB_DU_ID_cÚ¡¿št - }, - - @NR-ARFCN.c - -8  - ~"NR-ARFCN.h -" - -11 - $memb_nRARFCN_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 0 && value <= 3279165)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -35  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_nRARFCN_cÚ¡r_2 - - gCC_NOTUSED - = { - -36 { -APC_CONSTRAINED -, 22, -1, 0, 3279165 } , - -37 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -40 -a¢_TYPE_memb”_t - - ga¢_MBR_NR_ARFCN_1 -[] = { - -41 { -ATF_NOFLAGS -, 0, -off£tof -( -NR_ARFCN -, -nRARFCN -), - -42 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -44 & -a¢_DEF_N©iveIÁeg” -, - -46 { 0, & -a¢_PER_memb_nRARFCN_cÚ¡r_2 -, -memb_nRARFCN_cÚ¡¿št_1 - }, - -51 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NR_ARFCN_gs_1 -[] = { - -52 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -54 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_NR_ARFCN_g2–_1 -[] = { - -55 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -57 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_NR_ARFCN_¥ecs_1 - = { - -58 ( -NR_ARFCN -), - -59 -off£tof -( -NR_ARFCN -, -_a¢_ùx -), - -60 -a¢_MAP_NR_ARFCN_g2–_1 -, - -65 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NR_ARFCN - = { - -68 & -a¢_OP_SEQUENCE -, - -69 -a¢_DEF_NR_ARFCN_gs_1 -, - -70 ( -a¢_DEF_NR_ARFCN_gs_1 -) - -71 /( -a¢_DEF_NR_ARFCN_gs_1 -[0]), - -72 -a¢_DEF_NR_ARFCN_gs_1 -, - -73 ( -a¢_DEF_NR_ARFCN_gs_1 -) - -74 /( -a¢_DEF_NR_ARFCN_gs_1 -[0]), - -75 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -76 -a¢_MBR_NR_ARFCN_1 -, - -78 & -a¢_SPC_NR_ARFCN_¥ecs_1 - - - @NR-CGI.c - -8  - ~"NR-CGI.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_NR_CGI_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -NR_CGI -, -pLMNId’t™y -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_PLMNId’t™y -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -NR_CGI -, -nRC–lId’t™y -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_NRC–lId’t™y -, - -30 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NR_CGI_gs_1 -[] = { - -31 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -33 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_NR_CGI_g2–_1 -[] = { - -34 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -37 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_NR_CGI_¥ecs_1 - = { - -38 ( -NR_CGI -), - -39 -off£tof -( -NR_CGI -, -_a¢_ùx -), - -40 -a¢_MAP_NR_CGI_g2–_1 -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NR_CGI - = { - -48 & -a¢_OP_SEQUENCE -, - -49 -a¢_DEF_NR_CGI_gs_1 -, - -50 ( -a¢_DEF_NR_CGI_gs_1 -) - -51 /( -a¢_DEF_NR_CGI_gs_1 -[0]), - -52 -a¢_DEF_NR_CGI_gs_1 -, - -53 ( -a¢_DEF_NR_CGI_gs_1 -) - -54 /( -a¢_DEF_NR_CGI_gs_1 -[0]), - -55 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -56 -a¢_MBR_NR_CGI_1 -, - -58 & -a¢_SPC_NR_CGI_¥ecs_1 - - - @NR-PCI.c - -8  - ~"NR-PCI.h -" - -11 - $NR_PCI_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 0 && value <= 1007)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_NR_PCI_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED -, 10, 10, 0, 1007 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NR_PCI_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NR_PCI - = { - -50 & -a¢_OP_N©iveIÁeg” -, - -51 -a¢_DEF_NR_PCI_gs_1 -, - -52 ( -a¢_DEF_NR_PCI_gs_1 -) - -53 /( -a¢_DEF_NR_PCI_gs_1 -[0]), - -54 -a¢_DEF_NR_PCI_gs_1 -, - -55 ( -a¢_DEF_NR_PCI_gs_1 -) - -56 /( -a¢_DEF_NR_PCI_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_NR_PCI_cÚ¡r_1 -, -NR_PCI_cÚ¡¿št - }, - - @NRCellIdentity.c - -8  - ~"NRC–lId’t™y.h -" - -11 - $NRC–lId’t™y_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( -¡ --> -size - > 0) { - -25 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -27 -size - = 0; - -30 if(( -size - == 36)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -45 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_NRC–lId’t™y_cÚ¡r_1 - - gCC_NOTUSED - = { - -46 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -47 { -APC_CONSTRAINED -, 0, 0, 36, 36 } , - -50 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NRC–lId’t™y_gs_1 -[] = { - -51 ( -ASN_TAG_CLASS_UNIVERSAL - | (3 << 2)) - -53 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NRC–lId’t™y - = { - -56 & -a¢_OP_BIT_STRING -, - -57 -a¢_DEF_NRC–lId’t™y_gs_1 -, - -58 ( -a¢_DEF_NRC–lId’t™y_gs_1 -) - -59 /( -a¢_DEF_NRC–lId’t™y_gs_1 -[0]), - -60 -a¢_DEF_NRC–lId’t™y_gs_1 -, - -61 ( -a¢_DEF_NRC–lId’t™y_gs_1 -) - -62 /( -a¢_DEF_NRC–lId’t™y_gs_1 -[0]), - -63 { 0, & -a¢_PER_ty³_NRC–lId’t™y_cÚ¡r_1 -, -NRC–lId’t™y_cÚ¡¿št - }, - -65 & -a¢_SPC_BIT_STRING_¥ecs - - - @NRFrequencyBand-List.c - -8  - ~"NRF»qu’cyBªd-Li¡.h -" - -10  - ~"NRF»qu’cyBªdI‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_NRF»qu’cyBªd_Li¡_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 5, 5, 1, 32 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_NRF»qu’cyBªd_Li¡_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -18 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -20 & -a¢_DEF_NRF»qu’cyBªdI‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NRF»qu’cyBªd_Li¡_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_NRF»qu’cyBªd_Li¡_¥ecs_1 - = { - -31 ( -NRF»qu’cyBªd_Li¡ -), - -32 -off£tof -( -NRF»qu’cyBªd_Li¡ -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NRF»qu’cyBªd_Li¡ - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_NRF»qu’cyBªd_Li¡_gs_1 -, - -40 ( -a¢_DEF_NRF»qu’cyBªd_Li¡_gs_1 -) - -41 /( -a¢_DEF_NRF»qu’cyBªd_Li¡_gs_1 -[0]), - -42 -a¢_DEF_NRF»qu’cyBªd_Li¡_gs_1 -, - -43 ( -a¢_DEF_NRF»qu’cyBªd_Li¡_gs_1 -) - -44 /( -a¢_DEF_NRF»qu’cyBªd_Li¡_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_NRF»qu’cyBªd_Li¡_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_NRF»qu’cyBªd_Li¡_1 -, - -48 & -a¢_SPC_NRF»qu’cyBªd_Li¡_¥ecs_1 - - - @NRFrequencyBandItem.c - -8  - ~"NRF»qu’cyBªdI‹m.h -" - -11 - $memb_äeqBªdIndiÿtÜNr_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 1 && value <= 1024)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -35  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_äeqBªdIndiÿtÜNr_cÚ¡r_2 - - gCC_NOTUSED - = { - -36 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 10, 10, 1, 1024 } , - -37 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -40 -a¢_TYPE_memb”_t - - ga¢_MBR_NRF»qu’cyBªdI‹m_1 -[] = { - -41 { -ATF_NOFLAGS -, 0, -off£tof -( -NRF»qu’cyBªdI‹m -, -äeqBªdIndiÿtÜNr -), - -42 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -44 & -a¢_DEF_N©iveIÁeg” -, - -46 { 0, & -a¢_PER_memb_äeqBªdIndiÿtÜNr_cÚ¡r_2 -, -memb_äeqBªdIndiÿtÜNr_cÚ¡¿št_1 - }, - -50 { -ATF_NOFLAGS -, 0, -off£tof -( -NRF»qu’cyBªdI‹m -, -suµÜ‹dSULBªdLi¡ -), - -51 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -53 & -a¢_DEF_SuµÜ‹dSULBªdLi¡ -, - -60 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NRF»qu’cyBªdI‹m_gs_1 -[] = { - -61 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -63 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_NRF»qu’cyBªdI‹m_g2–_1 -[] = { - -64 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -65 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -67 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_NRF»qu’cyBªdI‹m_¥ecs_1 - = { - -68 ( -NRF»qu’cyBªdI‹m -), - -69 -off£tof -( -NRF»qu’cyBªdI‹m -, -_a¢_ùx -), - -70 -a¢_MAP_NRF»qu’cyBªdI‹m_g2–_1 -, - -75 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NRF»qu’cyBªdI‹m - = { - -78 & -a¢_OP_SEQUENCE -, - -79 -a¢_DEF_NRF»qu’cyBªdI‹m_gs_1 -, - -80 ( -a¢_DEF_NRF»qu’cyBªdI‹m_gs_1 -) - -81 /( -a¢_DEF_NRF»qu’cyBªdI‹m_gs_1 -[0]), - -82 -a¢_DEF_NRF»qu’cyBªdI‹m_gs_1 -, - -83 ( -a¢_DEF_NRF»qu’cyBªdI‹m_gs_1 -) - -84 /( -a¢_DEF_NRF»qu’cyBªdI‹m_gs_1 -[0]), - -85 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -86 -a¢_MBR_NRF»qu’cyBªdI‹m_1 -, - -88 & -a¢_SPC_NRF»qu’cyBªdI‹m_¥ecs_1 - - - @NRFrequencyInfo.c - -8  - ~"NRF»qu’cyInfo.h -" - -10  -a¢_TYPE_memb”_t - - ga¢_MBR_NRF»qu’cyInfo_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -NRF»qu’cyInfo -, -ÄARFCN -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_NR_ARFCN -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -NRF»qu’cyInfo -, -äequ’cyBªd_Li¡ -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_NRF»qu’cyBªd_Li¡ -, - -29 { -ATF_POINTER -, 1, -off£tof -( -NRF»qu’cyInfo -, -äequ’cyShiá7p5khz -), - -30 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -32 & -a¢_DEF_NRF»qu’cyShiá7p5khz -, - -39 cÚ¡  - ga¢_MAP_NRF»qu’cyInfo_oms_1 -[] = { 2 }; - -40 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NRF»qu’cyInfo_gs_1 -[] = { - -41 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -43 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_NRF»qu’cyInfo_g2–_1 -[] = { - -44 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -45 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -46 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -48  -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_NRF»qu’cyInfo_¥ecs_1 - = { - -49 ( -NRF»qu’cyInfo -), - -50 -off£tof -( -NRF»qu’cyInfo -, -_a¢_ùx -), - -51 -a¢_MAP_NRF»qu’cyInfo_g2–_1 -, - -53 -a¢_MAP_NRF»qu’cyInfo_oms_1 -, - -57 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NRF»qu’cyInfo - = { - -60 & -a¢_OP_SEQUENCE -, - -61 -a¢_DEF_NRF»qu’cyInfo_gs_1 -, - -62 ( -a¢_DEF_NRF»qu’cyInfo_gs_1 -) - -63 /( -a¢_DEF_NRF»qu’cyInfo_gs_1 -[0]), - -64 -a¢_DEF_NRF»qu’cyInfo_gs_1 -, - -65 ( -a¢_DEF_NRF»qu’cyInfo_gs_1 -) - -66 /( -a¢_DEF_NRF»qu’cyInfo_gs_1 -[0]), - -67 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -68 -a¢_MBR_NRF»qu’cyInfo_1 -, - -70 & -a¢_SPC_NRF»qu’cyInfo_¥ecs_1 - - - @NRFrequencyShift7p5khz.c - -8  - ~"NRF»qu’cyShiá7p5khz.h -" - -14 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_NRF»qu’cyShiá7p5khz_cÚ¡r_1 - - gCC_NOTUSED - = { - -15 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -16 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -19 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_NRF»qu’cyShiá7p5khz_v®ue2’um_1 -[] = { - -24 cÚ¡  - ga¢_MAP_NRF»qu’cyShiá7p5khz_’um2v®ue_1 -[] = { - -29 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_NRF»qu’cyShiá7p5khz_¥ecs_1 - = { - -30 -a¢_MAP_NRF»qu’cyShiá7p5khz_v®ue2’um_1 -, - -31 -a¢_MAP_NRF»qu’cyShiá7p5khz_’um2v®ue_1 -, - -38 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NRF»qu’cyShiá7p5khz_gs_1 -[] = { - -39 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -41 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NRF»qu’cyShiá7p5khz - = { - -44 & -a¢_OP_N©iveEnum”©ed -, - -45 -a¢_DEF_NRF»qu’cyShiá7p5khz_gs_1 -, - -46 ( -a¢_DEF_NRF»qu’cyShiá7p5khz_gs_1 -) - -47 /( -a¢_DEF_NRF»qu’cyShiá7p5khz_gs_1 -[0]), - -48 -a¢_DEF_NRF»qu’cyShiá7p5khz_gs_1 -, - -49 ( -a¢_DEF_NRF»qu’cyShiá7p5khz_gs_1 -) - -50 /( -a¢_DEF_NRF»qu’cyShiá7p5khz_gs_1 -[0]), - -51 { 0, & -a¢_PER_ty³_NRF»qu’cyShiá7p5khz_cÚ¡r_1 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -53 & -a¢_SPC_NRF»qu’cyShiá7p5khz_¥ecs_1 - - - @NULL.c - -5  - ~ - -6  - ~ - -7  - ~ - -8  - ~ - -13 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_NULL_gs -[] = { - -14 ( -ASN_TAG_CLASS_UNIVERSAL - | (5 << 2)) - -16 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_NULL - = { - -17 -BOOLEAN_ä“ -, - -18 -NULL_´št -, - -19 -NULL_com·» -, - -20 -BOOLEAN_decode_b” -, - -21 -NULL_’code_d” -, - -22 -NULL_decode_x” -, - -23 -NULL_’code_x” -, - -24 #ifdef -ASN_DISABLE_OER_SUPPORT - - -28 -NULL_decode_Ûr -, - -29 -NULL_’code_Ûr -, - -31 #ifdef -ASN_DISABLE_PER_SUPPORT - - -37 -NULL_decode_u³r -, - -38 -NULL_’code_u³r -, - -39 -NULL_decode_­” -, - -40 -NULL_’code_­” -, - -42 -NULL_¿ndom_fžl -, - -45 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NULL - = { - -48 & -a¢_OP_NULL -, - -49 -a¢_DEF_NULL_gs -, - -50 ( -a¢_DEF_NULL_gs -) / (asn_DEF_NULL_tags[0]), - -51 -a¢_DEF_NULL_gs -, - -52 ( -a¢_DEF_NULL_gs -) / (asn_DEF_NULL_tags[0]), - -53 { 0, 0, -a¢_g’”ic_no_cÚ¡¿št - }, - -58 -a¢_’c_rv®_t - - -59 - $NULL_’code_d” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -±r -,  -g_mode -, - -60 -b”_Žv_g_t - -g -, -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -61 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -63 -”v® -. -’coded - = - `d”_wr™e_gs -( -td -, 0, -g_mode -, 0, -g -, -cb -, -­p_key -); - -64 if( -”v® -. -’coded - == -1) { - -65 -”v® -. -çžed_ty³ - = -td -; - -66 -”v® -. -¡ruùu»_±r - = -±r -; - -69 - `ASN__ENCODED_OK -( -”v® -); - -70 - } -} - -72 -a¢_’c_rv®_t - - -73 - $NULL_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -74 -x”_’cod”_æags_e - -æags -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -75 * -­p_key -) { - -76 -a¢_’c_rv®_t - -” - = {0,0,0}; - -78 () -td -; - -79 () -¥Œ -; - -80 () -žev– -; - -81 () -æags -; - -82 () -cb -; - -83 () -­p_key -; - -86 -” -. -’coded - = 0; - -87 - `ASN__ENCODED_OK -( -” -); - -88 - } -} - -91  -x”_pbd_rv® - - -92 - $NULL__x”_body_decode -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -93 cÚ¡ * -chunk_buf -, -size_t - -chunk_size -) { - -94 () -td -; - -95 () -¥Œ -; - -96 () -chunk_buf -; - -101 if( -chunk_size -) - -102  -XPBD_BROKEN_ENCODING -; - -104  -XPBD_BODY_CONSUMED -; - -105 - } -} - -107 -a¢_dec_rv®_t - - -108 - $NULL_decode_x” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -109 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -110 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, -size_t - -size -) { - -111  - `x”_decode_´im™ive -( -Ýt_codec_ùx -, -td -, - -112 -¥Œ -, ( -NULL_t -), -Ýt_mÇme -, -buf_±r -, -size -, - -113 -NULL__x”_body_decode -); - -114 - } -} - -117 - $NULL_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -a -, cÚ¡ * -b -) { - -118 () -td -; - -119 () -a -; - -120 () -b -; - -122 - } -} - -125 - $NULL_´št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -126 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -127 () -td -; - -128 () -žev– -; - -130 if( -¥Œ -) { - -131  ( - `cb -("<´e£Á>", 9, -­p_key -) < 0) ? -1 : 0; - -133  ( - `cb -("", 8, -­p_key -) < 0) ? -1 : 0; - -135 - } -} - -137 #iâdeà -ASN_DISABLE_OER_SUPPORT - - -139 -a¢_dec_rv®_t - - -140 - $NULL_decode_Ûr -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -141 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -142 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -143 cÚ¡ * -±r -, -size_t - -size -) { - -144 -a¢_dec_rv®_t - -rv - = { -RC_OK -, 0}; - -145 () -Ýt_codec_ùx -; - -146 () -td -; - -147 () -cÚ¡¿šts -; - -148 () -±r -; - -149 () -size -; - -151 if(!* -¥Œ -) { - -152 * -¥Œ - = - `MALLOC -(( -NULL_t -)); - -153 if(* -¥Œ -) { - -154 *( -NULL_t - *)* -¥Œ - = 0; - -156 -ASN__DECODE_FAILED -; - -160  -rv -; - -161 - } -} - -163 -a¢_’c_rv®_t - - -164 - $NULL_’code_Ûr -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -165 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -166 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -167 -a¢_’c_rv®_t - -” - = {0,0,0}; - -169 () -td -; - -170 () -¥Œ -; - -171 () -cÚ¡¿šts -; - -172 () -cb -; - -173 () -­p_key -; - -175 -” -. -’coded - = 0; - -177 - `ASN__ENCODED_OK -( -” -); - -178 - } -} - -182 #iâdeà -ASN_DISABLE_PER_SUPPORT - - -184 -a¢_dec_rv®_t - - -185 - $NULL_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -186 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -187 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -188 -a¢_³r_d©a_t - * -pd -) { - -189 -a¢_dec_rv®_t - -rv -; - -191 () -Ýt_codec_ùx -; - -192 () -td -; - -193 () -cÚ¡¿šts -; - -194 () -pd -; - -196 if(!* -¥Œ -) { - -197 * -¥Œ - = - `MALLOC -(( -NULL_t -)); - -198 if(* -¥Œ -) { - -199 *( -NULL_t - *)* -¥Œ - = 0; - -201 -ASN__DECODE_FAILED -; - -209 -rv -. -code - = -RC_OK -; - -210 -rv -. -cÚsumed - = 0; - -211  -rv -; - -212 - } -} - -214 -a¢_’c_rv®_t - - -215 - $NULL_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -216 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -217 -a¢_³r_ou_t - * -po -) { - -218 -a¢_’c_rv®_t - -” - = {0,0,0}; - -220 () -td -; - -221 () -cÚ¡¿šts -; - -222 () -¥Œ -; - -223 () -po -; - -225 -” -. -’coded - = 0; - -226 - `ASN__ENCODED_OK -( -” -); - -227 - } -} - -229 -a¢_dec_rv®_t - - -230 - $NULL_decode_­” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -231 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -232 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -233 -a¢_dec_rv®_t - -rv - = { -RC_OK -, 0}; - -235 () -Ýt_codec_ùx -; - -236 () -td -; - -237 () -cÚ¡¿šts -; - -238 () -pd -; - -240 if(!* -¥Œ -) { - -241 * -¥Œ - = - `MALLOC -(( -NULL_t -)); - -242 if(* -¥Œ -) { - -243 *( -NULL_t - *)* -¥Œ - = 0; - -245 -ASN__DECODE_FAILED -; - -253 -rv -. -code - = -RC_OK -; - -254 -rv -. -cÚsumed - = 0; - -255  -rv -; - -256 - } -} - -259 -a¢_’c_rv®_t - - -260 - $NULL_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -261 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -262 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -263 -a¢_’c_rv®_t - -” - = {0,0,0}; - -265 () -td -; - -266 () -cÚ¡¿šts -; - -267 () -¥Œ -; - -268 () -po -; - -270 -” -. -’coded - = 0; - -271 - `ASN__ENCODED_OK -( -” -); - -272 - } -} - -276 -a¢_¿ndom_fžl_»suÉ_t - - -277 - $NULL_¿ndom_fžl -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -278 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡r -, - -279 -size_t - -max_Ëngth -) { - -280 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_ok - = { -ARFILL_OK -, 1}; - -281 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_çžed - = { -ARFILL_FAILED -, 0}; - -282 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_sk³d - = { -ARFILL_SKIPPED -, 0}; - -283 -NULL_t - * -¡ - = * -¥Œ -; - -285 () -td -; - -286 () -cÚ¡r -; - -288 if( -max_Ëngth - =ð0è -»suÉ_sk³d -; - -290 if( -¡ - =ð -NULL -) { - -291 -¡ - = ( -NULL_t - *)(* -¥Œ - = - `CALLOC -(1, (*st))); - -292 if( -¡ - =ð -NULL -) { - -293  -»suÉ_çžed -; - -297  -»suÉ_ok -; - -298 - } -} - - @NativeEnumerated.c - -12  - ~ - -13  - ~ - -18 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_N©iveEnum”©ed_gs -[] = { - -19 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -21 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_N©iveEnum”©ed - = { - -22 -N©iveIÁeg”_ä“ -, - -23 -N©iveIÁeg”_´št -, - -24 -N©iveIÁeg”_com·» -, - -25 -N©iveIÁeg”_decode_b” -, - -26 -N©iveIÁeg”_’code_d” -, - -27 -N©iveIÁeg”_decode_x” -, - -28 -N©iveEnum”©ed_’code_x” -, - -29 #ifdef -ASN_DISABLE_OER_SUPPORT - - -33 -N©iveEnum”©ed_decode_Ûr -, - -34 -N©iveEnum”©ed_’code_Ûr -, - -36 #ifdef -ASN_DISABLE_PER_SUPPORT - - -42 -N©iveEnum”©ed_decode_u³r -, - -43 -N©iveEnum”©ed_’code_u³r -, - -44 -N©iveEnum”©ed_decode_­” -, - -45 -N©iveEnum”©ed_’code_­” -, - -47 -N©iveEnum”©ed_¿ndom_fžl -, - -50 -a¢_TYPE_desütÜ_t - - ga¢_DEF_N©iveEnum”©ed - = { - -53 & -a¢_OP_N©iveEnum”©ed -, - -54 -a¢_DEF_N©iveEnum”©ed_gs -, - -55 ( -a¢_DEF_N©iveEnum”©ed_gs -) / (asn_DEF_NativeEnumerated_tags[0]), - -56 -a¢_DEF_N©iveEnum”©ed_gs -, - -57 ( -a¢_DEF_N©iveEnum”©ed_gs -) / (asn_DEF_NativeEnumerated_tags[0]), - -58 { 0, 0, -a¢_g’”ic_no_cÚ¡¿št - }, - -63 -a¢_’c_rv®_t - - -64 - $N©iveEnum”©ed_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -65  -žev– -, -x”_’cod”_æags_e - -æags -, - -66 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -67 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -68 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -69 -a¢_’c_rv®_t - -” - = {0,0,0}; - -70 cÚ¡ * -Çtive - = (cÚ¡ *) -¥Œ -; - -71 cÚ¡ -a¢_INTEGER_’um_m­_t - * -– -; - -73 () -žev– -; - -74 () -æags -; - -76 if(! -Çtive -è -ASN__ENCODE_FAILED -; - -78 -– - = - `INTEGER_m­_v®ue2’um -( -¥ecs -, * -Çtive -); - -79 if( -– -) { - -80 -” -. -’coded - = - -81 - `a¢__fÜm©_to_ÿÎback -( -cb -, -­p_key -, "<%s/>", -– --> -’um_Çme -); - -82 if( -” -. -’coded - < 0è -ASN__ENCODE_FAILED -; - -83 - `ASN__ENCODED_OK -( -” -); - -85 - `ASN_DEBUG -( - -88 -ASN__ENCODE_FAILED -; - -90 - } -} - -92 -a¢_dec_rv®_t - - -93 - $N©iveEnum”©ed_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -94 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -95 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -96 ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -97 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics -; - -98 -a¢_dec_rv®_t - -rv® - = { -RC_OK -, 0 }; - -99 * -Çtive - = (*)* -¥Œ -; - -100 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù - = -NULL -; - -101  -v®ue -; - -103 () -Ýt_codec_ùx -; - -105 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -v®ue -; - -106 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -107 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -v®ue -; - -108 -ASN__DECODE_FAILED -; - -109 if(! -¥ecs -è -ASN__DECODE_FAILED -; - -111 if(! -Çtive -) { - -112 -Çtive - = (*)(* -¥Œ - = - `CALLOC -(1, (*native))); - -113 if(! -Çtive -è -ASN__DECODE_FAILED -; - -116 - `ASN_DEBUG -("Decodšg % a N©iveEnum”©ed", -td --> -Çme -); - -118 if( -ù - && ct-> -æags - & -APC_EXTENSIBLE -) { - -119  -šext - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -120 if( -šext - < 0è -ASN__DECODE_STARVED -; - -121 if( -šext -è -ù - = 0; - -124 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -125 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, -ù --> -¿nge_b™s -); - -126 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -127 if( -v®ue - >ð( -¥ecs --> -ex‹nsiÚ - - -128 ? -¥ecs --> -ex‹nsiÚ - - 1 : s³cs-> -m­_couÁ -)) - -129 -ASN__DECODE_FAILED -; - -131 if(! -¥ecs --> -ex‹nsiÚ -) - -132 -ASN__DECODE_FAILED -; - -136 -v®ue - = - `u³r_g‘_n¢nwn -( -pd -); - -137 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -138 -v®ue - +ð -¥ecs --> -ex‹nsiÚ - - 1; - -139 if( -v®ue - >ð -¥ecs --> -m­_couÁ -) - -140 -ASN__DECODE_FAILED -; - -143 * -Çtive - = -¥ecs --> -v®ue2’um -[ -v®ue -]. -Çt_v®ue -; - -144 - `ASN_DEBUG -("Decoded % ð%ld", -td --> -Çme -, * -Çtive -); - -146  -rv® -; - -147 - } -} - -150 - $N©iveEnum”©ed__com·r_v®ue2’um -(cÚ¡ * -­ -, cÚ¡ * -bp -) { - -151 cÚ¡ -a¢_INTEGER_’um_m­_t - * -a - = -­ -; - -152 cÚ¡ -a¢_INTEGER_’um_m­_t - * -b - = -bp -; - -153 if( -a --> -Çt_v®ue - =ð -b -->nat_value) - -155 if( -a --> -Çt_v®ue - < -b -->nat_value) - -158 - } -} - -160 -a¢_’c_rv®_t - - -161 - $N©iveEnum”©ed_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -162 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -163 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -164 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -165 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -166 -a¢_’c_rv®_t - -” - = {0,0,0}; - -167  -Çtive -, -v®ue -; - -168 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù - = -NULL -; - -169  -šext - = 0; - -170 -a¢_INTEGER_’um_m­_t - -key -; - -171 cÚ¡ -a¢_INTEGER_’um_m­_t - * -kf -; - -173 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -174 if(! -¥ecs -è -ASN__ENCODE_FAILED -; - -176 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -v®ue -; - -177 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -178 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -v®ue -; - -179 -ASN__ENCODE_FAILED -; - -181 - `ASN_DEBUG -("Encodšg % a N©iveEnum”©ed", -td --> -Çme -); - -183 -” -. -’coded - = 0; - -185 -Çtive - = *(cÚ¡ *) -¥Œ -; - -187 -key -. -Çt_v®ue - = -Çtive -; - -188 -kf - = - `b£¬ch -(& -key -, -¥ecs --> -v®ue2’um -, s³cs-> -m­_couÁ -, - -189 ( -key -), -N©iveEnum”©ed__com·r_v®ue2’um -); - -190 if(! -kf -) { - -191 - `ASN_DEBUG -("Nؖem’ˆcÜ»¥Úd tØ%ld", -Çtive -); - -192 -ASN__ENCODE_FAILED -; - -194 -v®ue - = -kf - - -¥ecs --> -v®ue2’um -; - -196 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -197  -cmpW™h - = -¥ecs --> -ex‹nsiÚ - - -198 ? -¥ecs --> -ex‹nsiÚ - - 1 : s³cs-> -m­_couÁ -; - -199 if( -v®ue - >ð -cmpW™h -) - -200 -šext - = 1; - -202 if( -ù - && ct-> -æags - & -APC_EXTENSIBLE -) { - -203 if( - `³r_put_ãw_b™s -( -po -, -šext -, 1)) - -204 -ASN__ENCODE_FAILED -; - -205 if( -šext -è -ù - = 0; - -206 } if( -šext -) { - -207 -ASN__ENCODE_FAILED -; - -210 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -211 if( - `³r_put_ãw_b™s -( -po -, -v®ue -, -ù --> -¿nge_b™s -)) - -212 -ASN__ENCODE_FAILED -; - -213 - `ASN__ENCODED_OK -( -” -); - -216 if(! -¥ecs --> -ex‹nsiÚ -) - -217 -ASN__ENCODE_FAILED -; - -222 - `ASN_DEBUG -("value = %ld,ƒxt = %d, inext = %d,„es = %ld", - -223 -v®ue -, -¥ecs --> -ex‹nsiÚ -, -šext -, - -224 -v®ue - - ( -šext - ? ( -¥ecs --> -ex‹nsiÚ - - 1) : 0)); - -225 if( - `u³r_put_n¢nwn -( -po -, -v®ue - - ( -šext - ? ( -¥ecs --> -ex‹nsiÚ - - 1) : 0))) - -226 -ASN__ENCODE_FAILED -; - -228 - `ASN__ENCODED_OK -( -” -); - -229 - } -} - -231 -a¢_dec_rv®_t - - -232 - $N©iveEnum”©ed_decode_­” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -233 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -234 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -235 ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -236 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_INTEGER_¥ecifics_ˆ*) -td --> -¥ecifics -; - -237 -a¢_dec_rv®_t - -rv® - = { -RC_OK -, 0 }; - -238 * -Çtive - = (*)* -¥Œ -; - -239 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù - = -NULL -; - -240  -v®ue -; - -242 () -Ýt_codec_ùx -; - -244 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -v®ue -; - -245 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -246 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -v®ue -; - -247 -ASN__DECODE_FAILED -; - -248 if(! -¥ecs -è -ASN__DECODE_FAILED -; - -250 if(! -Çtive -) { - -251 -Çtive - = (*)(* -¥Œ - = - `CALLOC -(1, (*native))); - -252 if(! -Çtive -è -ASN__DECODE_FAILED -; - -255 - `ASN_DEBUG -("Decodšg % a N©iveEnum”©ed", -td --> -Çme -); - -257 if( -ù - && ct-> -æags - & -APC_EXTENSIBLE -) { - -258  -šext - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -259 if( -šext - < 0è -ASN__DECODE_STARVED -; - -260 if( -šext -è -ù - = 0; - -264 if( -ù - && ct-> -uµ”_bound - >= 255) { - -265  -·ddšg - = 0; - -266 -·ddšg - = (8 - ( -pd --> -moved - % 8)) % 8; - -267 - `ASN_DEBUG -("FÜ N©iveEnum”©ed %s,off£tð%lu Paddšg b™ ð%d", -td --> -Çme -, -pd --> -moved -, -·ddšg -); - -268 - `ASN_DEBUG -("FÜ N©iveEnum”©ed %s, uµ” bound = %lu", -td --> -Çme -, -ù --> -uµ”_bound -); - -269 if( -·ddšg - > 0) - -270 - `³r_g‘_ãw_b™s -( -pd -, -·ddšg -); - -273 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -274 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, -ù --> -¿nge_b™s -); - -275 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -276 if( -v®ue - >ð( -¥ecs --> -ex‹nsiÚ - - -277 ? -¥ecs --> -ex‹nsiÚ - - 1 : s³cs-> -m­_couÁ -)) - -278 -ASN__DECODE_FAILED -; - -280 if(! -¥ecs --> -ex‹nsiÚ -) - -281 -ASN__DECODE_FAILED -; - -285 -v®ue - = - `u³r_g‘_n¢nwn -( -pd -); - -286 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -287 -v®ue - +ð -¥ecs --> -ex‹nsiÚ - - 1; - -288 if( -v®ue - >ð -¥ecs --> -m­_couÁ -) - -289 -ASN__DECODE_FAILED -; - -292 * -Çtive - = -¥ecs --> -v®ue2’um -[ -v®ue -]. -Çt_v®ue -; - -293 - `ASN_DEBUG -("Decoded % ð%ld", -td --> -Çme -, * -Çtive -); - -295  -rv® -; - -296 - } -} - -298 -a¢_’c_rv®_t - - -299 - $N©iveEnum”©ed_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -300 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -301 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -302 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_INTEGER_¥ecifics_ˆ*) -td --> -¥ecifics -; - -303 -a¢_’c_rv®_t - -” - = {0,0,0}; - -304  -Çtive -, -v®ue -; - -305 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù - = -NULL -; - -306  -šext - = 0; - -307 -a¢_INTEGER_’um_m­_t - -key -; - -308 -a¢_INTEGER_’um_m­_t - * -kf -; - -310 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -311 if(! -¥ecs -è -ASN__ENCODE_FAILED -; - -313 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -v®ue -; - -314 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -315 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -v®ue -; - -316 -ASN__ENCODE_FAILED -; - -318 - `ASN_DEBUG -("Encodšg % a N©iveEnum”©ed", -td --> -Çme -); - -320 -” -. -’coded - = 0; - -322 -Çtive - = *(cÚ¡ *) -¥Œ -; - -323 if( -Çtive - < 0è -ASN__ENCODE_FAILED -; - -325 -key -. -Çt_v®ue - = -Çtive -; - -326 -kf - = - `b£¬ch -(& -key -, -¥ecs --> -v®ue2’um -, s³cs-> -m­_couÁ -, - -327 ( -key -), -N©iveEnum”©ed__com·r_v®ue2’um -); - -328 if(! -kf -) { - -329 - `ASN_DEBUG -("Nؖem’ˆcÜ»¥Úd tØ%ld", -Çtive -); - -330 -ASN__ENCODE_FAILED -; - -332 -v®ue - = -kf - - -¥ecs --> -v®ue2’um -; - -334 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -335  -cmpW™h - = -¥ecs --> -ex‹nsiÚ - - -336 ? -¥ecs --> -ex‹nsiÚ - - 1 : s³cs-> -m­_couÁ -; - -337 if( -v®ue - >ð -cmpW™h -) - -338 -šext - = 1; - -340 if( -ù - && ct-> -æags - & -APC_EXTENSIBLE -) { - -341 if( - `³r_put_ãw_b™s -( -po -, -šext -, 1)) - -342 -ASN__ENCODE_FAILED -; - -343 if( -šext -è -ù - = 0; - -344 } if( -šext -) { - -345 -ASN__ENCODE_FAILED -; - -348 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -349 if( - `³r_put_ãw_b™s -( -po -, -v®ue -, -ù --> -¿nge_b™s -)) - -350 -ASN__ENCODE_FAILED -; - -351 - `ASN__ENCODED_OK -( -” -); - -354 if(! -¥ecs --> -ex‹nsiÚ -) - -355 -ASN__ENCODE_FAILED -; - -360 - `ASN_DEBUG -("value = %ld,ƒxt = %d, inext = %d,„es = %ld", - -361 -v®ue -, -¥ecs --> -ex‹nsiÚ -, -šext -, - -362 -v®ue - - ( -šext - ? ( -¥ecs --> -ex‹nsiÚ - - 1) : 0)); - -363 if( - `u³r_put_n¢nwn -( -po -, -v®ue - - ( -šext - ? ( -¥ecs --> -ex‹nsiÚ - - 1) : 0))) - -364 -ASN__ENCODE_FAILED -; - -366 - `ASN__ENCODED_OK -( -” -); - -367 - } -} - - @NativeInteger.c - -13  - ~ - -14  - ~ - -19 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_N©iveIÁeg”_gs -[] = { - -20 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -22 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_N©iveIÁeg” - = { - -23 -N©iveIÁeg”_ä“ -, - -24 -N©iveIÁeg”_´št -, - -25 -N©iveIÁeg”_com·» -, - -26 -N©iveIÁeg”_decode_b” -, - -27 -N©iveIÁeg”_’code_d” -, - -28 -N©iveIÁeg”_decode_x” -, - -29 -N©iveIÁeg”_’code_x” -, - -30 #ifdef -ASN_DISABLE_OER_SUPPORT - - -34 -N©iveIÁeg”_decode_Ûr -, - -35 -N©iveIÁeg”_’code_Ûr -, - -37 #ifdef -ASN_DISABLE_PER_SUPPORT - - -43 -N©iveIÁeg”_decode_u³r -, - -44 -N©iveIÁeg”_’code_u³r -, - -45 -N©iveIÁeg”_decode_­” -, - -46 -N©iveIÁeg”_’code_­” -, - -48 -N©iveIÁeg”_¿ndom_fžl -, - -51 -a¢_TYPE_desütÜ_t - - ga¢_DEF_N©iveIÁeg” - = { - -54 & -a¢_OP_N©iveIÁeg” -, - -55 -a¢_DEF_N©iveIÁeg”_gs -, - -56 ( -a¢_DEF_N©iveIÁeg”_gs -) / (asn_DEF_NativeInteger_tags[0]), - -57 -a¢_DEF_N©iveIÁeg”_gs -, - -58 ( -a¢_DEF_N©iveIÁeg”_gs -) / (asn_DEF_NativeInteger_tags[0]), - -59 { 0, 0, -a¢_g’”ic_no_cÚ¡¿št - }, - -67 -a¢_dec_rv®_t - - -68 - $N©iveIÁeg”_decode_b” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -69 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -nšt_±r -, - -70 cÚ¡ * -buf_±r -, -size_t - -size -,  -g_mode -) { - -71 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -72 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -73 * -Çtive - = (*)* -nšt_±r -; - -74 -a¢_dec_rv®_t - -rv® -; - -75 -b”_Žv_Ën_t - -Ëngth -; - -80 if( -Çtive - =ð -NULL -) { - -81 -Çtive - = (*)(* -nšt_±r - = - `CALLOC -(1, (*native))); - -82 if( -Çtive - =ð -NULL -) { - -83 -rv® -. -code - = -RC_FAIL -; - -84 -rv® -. -cÚsumed - = 0; - -85  -rv® -; - -89 - `ASN_DEBUG -("Decoding %s‡s INTEGER (tm=%d)", - -90 -td --> -Çme -, -g_mode -); - -95 -rv® - = - `b”_check_gs -( -Ýt_codec_ùx -, -td -, 0, -buf_±r -, -size -, - -96 -g_mode -, 0, & -Ëngth -, 0); - -97 if( -rv® -. -code - !ð -RC_OK -) - -98  -rv® -; - -100 - `ASN_DEBUG -("% Ëngth i %d by‹s", -td --> -Çme -, () -Ëngth -); - -105 -buf_±r - = ((cÚ¡ *)buf_±rè+ -rv® -. -cÚsumed -; - -106 -size - -ð -rv® -. -cÚsumed -; - -107 if( -Ëngth - > ( -b”_Žv_Ën_t -) -size -) { - -108 -rv® -. -code - = -RC_WMORE -; - -109 -rv® -. -cÚsumed - = 0; - -110  -rv® -; - -119 -INTEGER_t - -tmp -; - -121 cÚ¡ * -cÚ¡buf -; - -122 * -nÚcÚ¡buf -; - -123 } -uncÚ¡_buf -; - -124  -l -; - -126 -uncÚ¡_buf -. -cÚ¡buf - = -buf_±r -; - -127 -tmp -. -buf - = ( -ušt8_t - *) -uncÚ¡_buf -. -nÚcÚ¡buf -; - -128 -tmp -. -size - = -Ëngth -; - -130 if(( -¥ecs -&&¥ecs-> -f›ld_unsigÃd -) - -131 ? - `a¢_INTEGER2ulÚg -(& -tmp -, (*)& -l -) - -132 : - `a¢_INTEGER2lÚg -(& -tmp -, & -l -)) { - -133 -rv® -. -code - = -RC_FAIL -; - -134 -rv® -. -cÚsumed - = 0; - -135  -rv® -; - -138 * -Çtive - = -l -; - -141 -rv® -. -code - = -RC_OK -; - -142 -rv® -. -cÚsumed - +ð -Ëngth -; - -144 - `ASN_DEBUG -("Took %ld/%ld bytesoƒncode %s (%ld)", - -145 () -rv® -. -cÚsumed -, () -Ëngth -, -td --> -Çme -, ()* -Çtive -); - -147  -rv® -; - -148 - } -} - -153 -a¢_’c_rv®_t - - -154 - $N©iveIÁeg”_’code_d” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -sd -, cÚ¡ * -±r -, - -155  -g_mode -, -b”_Žv_g_t - -g -, - -156 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -157  -Çtive - = *(cÚ¡ *) -±r -; - -158 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -159 -INTEGER_t - -tmp -; - -161 #ifdef -WORDS_BIGENDIAN - - -163 -tmp -. -buf - = ( -ušt8_t - *)& -Çtive -; - -164 -tmp -. -size - = ( -Çtive -); - -167 -ušt8_t - -buf -[( -Çtive -)]; - -168 -ušt8_t - * -p -; - -171  -p - = -buf - + (bufè- 1;… >ðbuf;…--, -Çtive - >>= 8) - -172 * -p - = ( -ušt8_t -) -Çtive -; - -174 -tmp -. -buf - = buf; - -175 -tmp -. -size - = ( -buf -); - -179 -”v® - = - `INTEGER_’code_d” -( -sd -, & -tmp -, -g_mode -, -g -, -cb -, -­p_key -); - -180 if( -”v® -. -¡ruùu»_±r - =ð& -tmp -) { - -181 -”v® -. -¡ruùu»_±r - = -±r -; - -183  -”v® -; - -184 - } -} - -189 -a¢_dec_rv®_t - - -190 - $N©iveIÁeg”_decode_x” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -191 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -192 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, - -193 -size_t - -size -) { - -194 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -195 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -196 -a¢_dec_rv®_t - -rv® -; - -197 -INTEGER_t - -¡ -; - -198 * -¡_±r - = (*)& -¡ -; - -199 * -Çtive - = (*)* -¥Œ -; - -201 if(! -Çtive -) { - -202 -Çtive - = (*)(* -¥Œ - = - `CALLOC -(1, (*native))); - -203 if(! -Çtive -è -ASN__DECODE_FAILED -; - -206 - `mem£t -(& -¡ -, 0, (st)); - -207 -rv® - = - `INTEGER_decode_x” -( -Ýt_codec_ùx -, -td -, & -¡_±r -, - -208 -Ýt_mÇme -, -buf_±r -, -size -); - -209 if( -rv® -. -code - =ð -RC_OK -) { - -210  -l -; - -211 if(( -¥ecs -&&¥ecs-> -f›ld_unsigÃd -) - -212 ? - `a¢_INTEGER2ulÚg -(& -¡ -, (*)& -l -) - -213 : - `a¢_INTEGER2lÚg -(& -¡ -, & -l -)) { - -214 -rv® -. -code - = -RC_FAIL -; - -215 -rv® -. -cÚsumed - = 0; - -217 * -Çtive - = -l -; - -225 -rv® -. -cÚsumed - = 0; - -227 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_INTEGER -, & -¡ -); - -228  -rv® -; - -229 - } -} - -232 -a¢_’c_rv®_t - - -233 - $N©iveIÁeg”_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -234  -žev– -, -x”_’cod”_æags_e - -æags -, - -235 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -236 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -237 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -238  -sü©ch -[32]; - -239 -a¢_’c_rv®_t - -” - = {0,0,0}; - -240 cÚ¡ * -Çtive - = (cÚ¡ *) -¥Œ -; - -242 () -žev– -; - -243 () -æags -; - -245 if(! -Çtive -è -ASN__ENCODE_FAILED -; - -247 -” -. -’coded - = - `¢´štf -( -sü©ch -, (scratch), - -248 ( -¥ecs - && s³cs-> -f›ld_unsigÃd -) - -249 ? "%lu" : "%ld", * -Çtive -); - -250 if( -” -. -’coded - <ð0 || ( -size_t -ër.’coded >ð( -sü©ch -) - -251 || - `cb -( -sü©ch -, -” -. -’coded -, -­p_key -) < 0) - -252 -ASN__ENCODE_FAILED -; - -254 - `ASN__ENCODED_OK -( -” -); - -255 - } -} - -257 #iâdeà -ASN_DISABLE_PER_SUPPORT - - -259 -a¢_dec_rv®_t - - -260 - $N©iveIÁeg”_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -261 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -262 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -263 -a¢_³r_d©a_t - * -pd -) { - -264 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -265 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -266 -a¢_dec_rv®_t - -rv® -; - -267 * -Çtive - = (*)* -¥Œ -; - -268 -INTEGER_t - -tmpšt -; - -269 * -tmpšŒ - = & -tmpšt -; - -271 () -Ýt_codec_ùx -; - -272 - `ASN_DEBUG -("Decodšg N©iveIÁeg” % (UPER)", -td --> -Çme -); - -274 if(! -Çtive -) { - -275 -Çtive - = (*)(* -¥Œ - = - `CALLOC -(1, (*native))); - -276 if(! -Çtive -è -ASN__DECODE_FAILED -; - -279 - `mem£t -(& -tmpšt -, 0, mpint); - -280 -rv® - = - `INTEGER_decode_u³r -( -Ýt_codec_ùx -, -td -, -cÚ¡¿šts -, - -281 & -tmpšŒ -, -pd -); - -282 if( -rv® -. -code - =ð -RC_OK -) { - -283 if(( -¥ecs -&&¥ecs-> -f›ld_unsigÃd -) - -284 ? - `a¢_INTEGER2ulÚg -(& -tmpšt -, (*) -Çtive -) - -285 : - `a¢_INTEGER2lÚg -(& -tmpšt -, -Çtive -)) - -286 -rv® -. -code - = -RC_FAIL -; - -288 - `ASN_DEBUG -("NativeInteger %s got value %ld", - -289 -td --> -Çme -, * -Çtive -); - -291 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_INTEGER -, & -tmpšt -); - -293  -rv® -; - -294 - } -} - -296 -a¢_’c_rv®_t - - -297 - $N©iveIÁeg”_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -298 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -299 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -300 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -301 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -302 -a¢_’c_rv®_t - -” - = {0,0,0}; - -303  -Çtive -; - -304 -INTEGER_t - -tmpšt -; - -306 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -308 -Çtive - = *(cÚ¡ *) -¥Œ -; - -310 - `ASN_DEBUG -("Encodšg N©iveIÁeg” % %ld (UPER)", -td --> -Çme -, -Çtive -); - -312 - `mem£t -(& -tmpšt -, 0, (tmpint)); - -313 if(( -¥ecs -&&¥ecs-> -f›ld_unsigÃd -) - -314 ? - `a¢_ulÚg2INTEGER -(& -tmpšt -, -Çtive -) - -315 : - `a¢_lÚg2INTEGER -(& -tmpšt -, -Çtive -)) - -316 -ASN__ENCODE_FAILED -; - -317 -” - = - `INTEGER_’code_u³r -( -td -, -cÚ¡¿šts -, & -tmpšt -, -po -); - -318 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_INTEGER -, & -tmpšt -); - -319  -” -; - -320 - } -} - -322 -a¢_dec_rv®_t - - -323 - $N©iveIÁeg”_decode_­” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -324 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -325 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -327 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_INTEGER_¥ecifics_ˆ*) -td --> -¥ecifics -; - -328 -a¢_dec_rv®_t - -rv® -; - -329 * -Çtive - = (*)* -¥Œ -; - -330 -INTEGER_t - -tmpšt -; - -331 * -tmpšŒ - = & -tmpšt -; - -333 () -Ýt_codec_ùx -; - -334 - `ASN_DEBUG -("Decodšg N©iveIÁeg” % (APER)", -td --> -Çme -); - -336 if(! -Çtive -) { - -337 -Çtive - = (*)(* -¥Œ - = - `CALLOC -(1, (*native))); - -338 if(! -Çtive -è -ASN__DECODE_FAILED -; - -341 - `mem£t -(& -tmpšt -, 0, mpint); - -342 -rv® - = - `INTEGER_decode_­” -( -Ýt_codec_ùx -, -td -, -cÚ¡¿šts -, - -343 & -tmpšŒ -, -pd -); - -344 if( -rv® -. -code - =ð -RC_OK -) { - -345 if(( -¥ecs -&&¥ecs-> -f›ld_unsigÃd -) - -346 ? - `a¢_INTEGER2ulÚg -(& -tmpšt -, (*) -Çtive -) - -347 : - `a¢_INTEGER2lÚg -(& -tmpšt -, -Çtive -)) - -348 -rv® -. -code - = -RC_FAIL -; - -350 - `ASN_DEBUG -("NativeInteger %s got value %ld", - -351 -td --> -Çme -, * -Çtive -); - -353 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_INTEGER -, & -tmpšt -); - -355  -rv® -; - -356 - } -} - -358 -a¢_’c_rv®_t - - -359 - $N©iveIÁeg”_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -360 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -361 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -363 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_INTEGER_¥ecifics_ˆ*) -td --> -¥ecifics -; - -364 -a¢_’c_rv®_t - -” - = {0,0,0}; - -365  -Çtive -; - -366 -INTEGER_t - -tmpšt -; - -368 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -370 -Çtive - = *(cÚ¡ *) -¥Œ -; - -372 - `ASN_DEBUG -("Encodšg N©iveIÁeg” % %ld (APER)", -td --> -Çme -, -Çtive -); - -374 - `mem£t -(& -tmpšt -, 0, (tmpint)); - -375 if(( -¥ecs -&&¥ecs-> -f›ld_unsigÃd -) - -376 ? - `a¢_ulÚg2INTEGER -(& -tmpšt -, () -Çtive -) - -377 : - `a¢_lÚg2INTEGER -(& -tmpšt -, -Çtive -)) - -378 -ASN__ENCODE_FAILED -; - -379 -” - = - `INTEGER_’code_­” -( -td -, -cÚ¡¿šts -, & -tmpšt -, -po -); - -380 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_INTEGER -, & -tmpšt -); - -381  -” -; - -382 - } -} - -390 - $N©iveIÁeg”_´št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -391  -žev– -, -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -392 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -393 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -394 cÚ¡ * -Çtive - = (cÚ¡ *) -¥Œ -; - -395  -sü©ch -[32]; - -396  -»t -; - -398 () -td -; - -399 () -žev– -; - -401 if( -Çtive -) { - -402  -v®ue - = * -Çtive -; - -403 -»t - = - `¢´štf -( -sü©ch -, (scratch), - -404 ( -¥ecs - && s³cs-> -f›ld_unsigÃd -è? "%lu" : "%ld", -v®ue -); - -405 - `as£¹ -( -»t - > 0 && ( -size_t -ì‘ < ( -sü©ch -)); - -406 if( - `cb -( -sü©ch -, -»t -, -­p_key -) < 0)  -1; - -407 if( -¥ecs - && ( -v®ue - >ð0 || !¥ecs-> -f›ld_unsigÃd -)) { - -408 cÚ¡ -a¢_INTEGER_’um_m­_t - * -– - = - -409 - `INTEGER_m­_v®ue2’um -( -¥ecs -, -v®ue -); - -410 if( -– -) { - -411 if( - `cb -(" (", 2, -­p_key -) < 0)  -1; - -412 if( - `cb -( -– --> -’um_Çme -,ƒl-> -’um_Ën -, -­p_key -) < 0)  -1; - -413 if( - `cb -(")", 1, -­p_key -) < 0)  -1; - -418  ( - `cb -("", 8, -­p_key -) < 0) ? -1 : 0; - -420 - } -} - -423 - $N©iveIÁeg”_ä“ -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -±r -, - -424 -a¢_¡ruù_ä“_m‘hod - -m‘hod -) { - -425 if(! -td - || ! -±r -) - -428 - `ASN_DEBUG -("Freeing %s‡s INTEGER (%d, %p, Native)", - -429 -td --> -Çme -, -m‘hod -, -±r -); - -431  -m‘hod -) { - -432  -ASFM_FREE_EVERYTHING -: - -433 - `FREEMEM -( -±r -); - -435  -ASFM_FREE_UNDERLYING -: - -437  -ASFM_FREE_UNDERLYING_AND_RESET -: - -438 - `mem£t -( -±r -, 0, ()); - -441 - } -} - -444 - $N©iveIÁeg”_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -­Œ -, cÚ¡ * -b±r -) { - -445 () -td -; - -447 if( -­Œ - && -b±r -) { - -448 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -449 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -450 if( -¥ecs - && s³cs-> -f›ld_unsigÃd -) { - -451 cÚ¡ * -a - = -­Œ -; - -452 cÚ¡ * -b - = -b±r -; - -453 if(* -a - < * -b -) { - -455 } if(* -a - > * -b -) { - -461 cÚ¡ * -a - = -­Œ -; - -462 cÚ¡ * -b - = -b±r -; - -463 if(* -a - < * -b -) { - -465 } if(* -a - > * -b -) { - -471 } if(! -­Œ -) { - -476 - } -} - -478 -a¢_¿ndom_fžl_»suÉ_t - - -479 - $N©iveIÁeg”_¿ndom_fžl -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -480 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -481 -size_t - -max_Ëngth -) { - -482 cÚ¡ -a¢_INTEGER_¥ecifics_t - * -¥ecs - = - -483 (cÚ¡ -a¢_INTEGER_¥ecifics_t - *) -td --> -¥ecifics -; - -484 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_ok - = { -ARFILL_OK -, 1}; - -485 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_çžed - = { -ARFILL_FAILED -, 0}; - -486 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_sk³d - = { -ARFILL_SKIPPED -, 0}; - -487 * -¡ - = * -¥Œ -; - -488 cÚ¡ -a¢_INTEGER_’um_m­_t - * -em­ -; - -489 -size_t - -em­_Ën -; - -490 -štmax_t - -v®ue -; - -491  -fšd_šside_m­ -; - -493 if( -max_Ëngth - =ð0è -»suÉ_sk³d -; - -495 if( -¡ - =ð -NULL -) { - -496 -¡ - = (*) - `CALLOC -(1, (*st)); - -497 if( -¡ - =ð -NULL -) { - -498  -»suÉ_çžed -; - -502 if( -¥ecs -) { - -503 -em­ - = -¥ecs --> -v®ue2’um -; - -504 -em­_Ën - = -¥ecs --> -m­_couÁ -; - -505 if( -¥ecs --> -¡riù_’um”©iÚ -) { - -506 -fšd_šside_m­ - = -em­_Ën - > 0; - -508 -fšd_šside_m­ - = -em­_Ën - ? - `a¢_¿ndom_b‘w“n -(0, 1) : 0; - -511 -em­ - = 0; - -512 -em­_Ën - = 0; - -513 -fšd_šside_m­ - = 0; - -516 if( -fšd_šside_m­ -) { - -517 - `as£¹ -( -em­_Ën - > 0); - -518 -v®ue - = -em­ -[ - `a¢_¿ndom_b‘w“n -(0, -em­_Ën - - 1)]. -Çt_v®ue -; - -520 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -ù -; - -522 cÚ¡  -v¬ŸÁs -[] = { - -528 if( -¥ecs - && s³cs-> -f›ld_unsigÃd -) { - -529 - `as£¹ -( -v¬ŸÁs -[18] == 0); - -530 -v®ue - = -v¬ŸÁs -[ - `a¢_¿ndom_b‘w“n -( - -531 18, ( -v¬ŸÁs -) / (variants[0]) - 1)]; - -533 -v®ue - = -v¬ŸÁs -[ - `a¢_¿ndom_b‘w“n -( - -534 0, ( -v¬ŸÁs -) / (variants[0]) - 1)]; - -537 if(! -cÚ¡¿šts -ècÚ¡¿št ð& -td --> -’codšg_cÚ¡¿šts -; - -538 -ù - = -cÚ¡¿šts - ? cÚ¡¿šts-> -³r_cÚ¡¿šts - : 0; - -539 if( -ù - && (ù-> -v®ue -. -æags - & -APC_CONSTRAINED -)) { - -540 if( -v®ue - < -ù -->v®ue. -low”_bound - || v®u> ct->v®ue. -uµ”_bound -) { - -541 -v®ue - = - `a¢_¿ndom_b‘w“n -( -ù -->v®ue. -low”_bound -, - -542 -ù --> -v®ue -. -uµ”_bound -); - -547 * -¥Œ - = -¡ -; - -548 * -¡ - = -v®ue -; - -549  -»suÉ_ok -; - -550 - } -} - - @NativeReal.c - -12  - ~ - -13  - ~ - -14  - ~ - -15  - ~ - -16  - ~ - -17  - ~<æßt.h -> - -19 #ià -defšed -( -__þªg__ -) - -27 #´agm¨ -þªg - -dŸgno¡ic - -push - - -28 #´agm¨ -þªg - -dŸgno¡ic - -ignÜed - "-Wc11-extensions" - -29  - $a¢_i¢ª -( -d -) { - -30  - `i¢ª -( -d -); - -31 - } -} - -32 #´agm¨ -þªg - -dŸgno¡ic - -pÝ - - -34  - #a¢_i¢ª -( -v -è - `i¢ª -(v) - - ) - -40 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_N©iveR—l_gs -[] = { - -41 ( -ASN_TAG_CLASS_UNIVERSAL - | (9 << 2)) - -43 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_N©iveR—l - = { - -44 -N©iveR—l_ä“ -, - -45 -N©iveR—l_´št -, - -46 -N©iveR—l_com·» -, - -47 -N©iveR—l_decode_b” -, - -48 -N©iveR—l_’code_d” -, - -49 -N©iveR—l_decode_x” -, - -50 -N©iveR—l_’code_x” -, - -51 #ifdef -ASN_DISABLE_OER_SUPPORT - - -55 -N©iveR—l_decode_Ûr -, - -56 -N©iveR—l_’code_Ûr -, - -58 #ifdef -ASN_DISABLE_PER_SUPPORT - - -64 -N©iveR—l_decode_u³r -, - -65 -N©iveR—l_’code_u³r -, - -66 -N©iveR—l_decode_­” -, - -67 -N©iveR—l_’code_­” -, - -69 -N©iveR—l_¿ndom_fžl -, - -72 -a¢_TYPE_desütÜ_t - - ga¢_DEF_N©iveR—l - = { - -75 & -a¢_OP_N©iveR—l -, - -76 -a¢_DEF_N©iveR—l_gs -, - -77 ( -a¢_DEF_N©iveR—l_gs -) / (asn_DEF_NativeReal_tags[0]), - -78 -a¢_DEF_N©iveR—l_gs -, - -79 ( -a¢_DEF_N©iveR—l_gs -) / (asn_DEF_NativeReal_tags[0]), - -80 { 0, 0, -a¢_g’”ic_no_cÚ¡¿št - }, - -85  -size_t - -N©iveR—l__æßt_size -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -); - -86  -N©iveR—l__g‘_doubË -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -87 cÚ¡ * -±r -); - -88  -ssize_t - -N©iveR—l__£t -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -89  -d -); - -94 -a¢_dec_rv®_t - - -95 - $N©iveR—l_decode_b” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -96 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -97 cÚ¡ * -buf_±r -, -size_t - -size -,  -g_mode -) { - -98 -a¢_dec_rv®_t - -rv® -; - -99 -b”_Žv_Ën_t - -Ëngth -; - -101 - `ASN_DEBUG -("Decodšg % a REAL (tm=%d)", -td --> -Çme -, -g_mode -); - -106 -rv® - = - `b”_check_gs -( -Ýt_codec_ùx -, -td -, 0, -buf_±r -, -size -, -g_mode -, 0, - -107 & -Ëngth -, 0); - -108 if( -rv® -. -code - !ð -RC_OK -) „val; - -109 - `as£¹ -( -Ëngth - >= 0); - -111 - `ASN_DEBUG -("% Ëngth i %d by‹s", -td --> -Çme -, () -Ëngth -); - -116 -buf_±r - = ((cÚ¡ *)buf_±rè+ -rv® -. -cÚsumed -; - -117 -size - -ð -rv® -. -cÚsumed -; - -118 if( -Ëngth - > ( -b”_Žv_Ën_t -) -size -) { - -119 -rv® -. -code - = -RC_WMORE -; - -120 -rv® -. -cÚsumed - = 0; - -121  -rv® -; - -130 -ušt8_t - -sü©ch -[24]; - -131 -REAL_t - -tmp -; - -132  -d -; - -133  -»t -; - -135 if(( -size_t -) -Ëngth - < ( -sü©ch -)) { - -136 -tmp -. -buf - = -sü©ch -; - -137 -tmp -. -size - = -Ëngth -; - -140 -tmp -. -buf - = - `CALLOC -(1, -Ëngth - + 1); - -141 -tmp -. -size - = -Ëngth -; - -142 if(! -tmp -. -buf -) { - -143 -rv® -. -code - = -RC_FAIL -; - -144 -rv® -. -cÚsumed - = 0; - -145  -rv® -; - -149 - `memýy -( -tmp -. -buf -, -buf_±r -, -Ëngth -); - -150 -tmp -. -buf -[ -Ëngth -] = '\0'; - -152 -»t - = - `a¢_REAL2doubË -(& -tmp -, & -d -); - -153 if( -tmp -. -buf - !ð -sü©ch -è - `FREEMEM -(tmp.buf); - -154 if( -»t -) { - -155 -rv® -. -code - = -RC_FAIL -; - -156 -rv® -. -cÚsumed - = 0; - -157  -rv® -; - -160 if( - `N©iveR—l__£t -( -td -, -¥Œ -, -d -) < 0) - -161 -ASN__DECODE_FAILED -; - -164 -rv® -. -code - = -RC_OK -; - -165 -rv® -. -cÚsumed - +ð -Ëngth -; - -167 - `ASN_DEBUG -("Took %ld/%ld by‹ tؒcod%s", () -rv® -. -cÚsumed -, - -168 () -Ëngth -, -td --> -Çme -); - -170  -rv® -; - -171 - } -} - -176 -a¢_’c_rv®_t - - -177 - $N©iveR—l_’code_d” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -178  -g_mode -, -b”_Žv_g_t - -g -, - -179 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -180  -d - = - `N©iveR—l__g‘_doubË -( -td -, -¥Œ -); - -181 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -182 -REAL_t - -tmp -; - -185 - `mem£t -(& -tmp -, 0, (tmp)); - -187 if( - `a¢_doubË2REAL -(& -tmp -, -d -)) - -188 -ASN__ENCODE_FAILED -; - -191 -”v® - = - `d”_’code_´im™ive -( -td -, & -tmp -, -g_mode -, -g -, -cb -, -­p_key -); - -192 if( -”v® -. -’coded - == -1) { - -193 - `as£¹ -( -”v® -. -¡ruùu»_±r - =ð& -tmp -); - -194 -”v® -. -¡ruùu»_±r - = -¥Œ -; - -198 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_REAL -, & -tmp -); - -200  -”v® -; - -201 - } -} - -203 #iâdeà -ASN_DISABLE_PER_SUPPORT - - -208 -a¢_dec_rv®_t - - -209 - $N©iveR—l_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -210 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -211 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -212 -a¢_³r_d©a_t - * -pd -) { - -213 -a¢_dec_rv®_t - -rv® -; - -214  -d -; - -215 -REAL_t - -tmp -; - -216 * -±mp - = & -tmp -; - -217  -»t -; - -219 () -cÚ¡¿šts -; - -221 - `mem£t -(& -tmp -, 0, (tmp)); - -222 -rv® - = - `OCTET_STRING_decode_u³r -( -Ýt_codec_ùx -, & -a¢_DEF_REAL -, - -223 -NULL -, & -±mp -, -pd -); - -224 if( -rv® -. -code - !ð -RC_OK -) { - -225 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_REAL -, & -tmp -); - -226  -rv® -; - -229 -»t - = - `a¢_REAL2doubË -(& -tmp -, & -d -); - -230 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_REAL -, & -tmp -); - -231 if( -»t -è -ASN__DECODE_FAILED -; - -233 if( - `N©iveR—l__£t -( -td -, -¥Œ -, -d -) < 0 ) - -234 -ASN__DECODE_FAILED -; - -236  -rv® -; - -237 - } -} - -242 -a¢_’c_rv®_t - - -243 - $N©iveR—l_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -244 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -245 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -246  -d - = - `N©iveR—l__g‘_doubË -( -td -, -¥Œ -); - -247 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -248 -REAL_t - -tmp -; - -250 () -cÚ¡¿šts -; - -253 - `mem£t -(& -tmp -, 0, (tmp)); - -255 if( - `a¢_doubË2REAL -(& -tmp -, -d -)) - -256 -ASN__ENCODE_FAILED -; - -259 -”v® - = - `OCTET_STRING_’code_u³r -(& -a¢_DEF_REAL -, -NULL -, & -tmp -, -po -); - -260 if( -”v® -. -’coded - == -1) - -261 -”v® -. -¡ruùu»_±r - = -¥Œ -; - -264 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_REAL -, & -tmp -); - -266  -”v® -; - -267 - } -} - -270 -a¢_dec_rv®_t - - -271 - $N©iveR—l_decode_­” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -272 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -273 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -274 ** -dbl_±r -, -a¢_³r_d©a_t - * -pd -) { - -275 * -Dbl - = (*)* -dbl_±r -; - -276 -a¢_dec_rv®_t - -rv® -; - -277 -REAL_t - -tmp -; - -278 * -±mp - = & -tmp -; - -279  -»t -; - -281 () -cÚ¡¿šts -; - -286 if( -Dbl - =ð -NULL -) { - -287 * -dbl_±r - = - `CALLOC -(1, (* -Dbl -)); - -288 -Dbl - = (*)* -dbl_±r -; - -289 if( -Dbl - =ð -NULL -) - -290 -ASN__DECODE_FAILED -; - -293 - `mem£t -(& -tmp -, 0, (tmp)); - -294 -rv® - = - `OCTET_STRING_decode_­” -( -Ýt_codec_ùx -, -td -, -NULL -, - -295 & -±mp -, -pd -); - -296 if( -rv® -. -code - !ð -RC_OK -) { - -297 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_REAL -, & -tmp -); - -298  -rv® -; - -301 -»t - = - `a¢_REAL2doubË -(& -tmp -, -Dbl -); - -302 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_REAL -, & -tmp -); - -303 if( -»t -è -ASN__DECODE_FAILED -; - -305  -rv® -; - -306 - } -} - -308 -a¢_’c_rv®_t - - -309 - $N©iveR—l_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -310 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -311 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -312  -Dbl - = *(cÚ¡ *) -¥Œ -; - -313 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -314 -REAL_t - -tmp -; - -316 () -cÚ¡¿šts -; - -319 - `mem£t -(& -tmp -, 0, (tmp)); - -321 if( - `a¢_doubË2REAL -(& -tmp -, -Dbl -)) - -322 -ASN__ENCODE_FAILED -; - -325 -”v® - = - `OCTET_STRING_’code_­” -( -td -, -NULL -, & -tmp -, -po -); - -326 if( -”v® -. -’coded - == -1) - -327 -”v® -. -¡ruùu»_±r - = -¥Œ -; - -330 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_REAL -, & -tmp -); - -332  -”v® -; - -333 - } -} - -337 #iâdeà -ASN_DISABLE_OER_SUPPORT - - -344 - $N©iveR—l__ÃtwÜk_sw­ -( -size_t - -æßt_size -, cÚ¡ * -¤ý -, -ušt8_t - * -d¡ -) { - -345 cÚ¡ -ušt8_t - * -¤c - = -¤ý -; - -346  -‹¡ - = -0.0; - -347  -æßt_big_’dŸn - = *(cÚ¡ *)& -‹¡ - != 0; - -349 cÚ¡  -sizeof_doubË_is_8_a -[()-7] -CC_NOTUSED -; - -350 cÚ¡  -sizeof_doubË_is_8_b -[9-()] -CC_NOTUSED -; - -352 cÚ¡  -sizeof_æßt_is_4_a -[()-3] -CC_NOTUSED -; - -353 cÚ¡  -sizeof_æßt_is_4_b -[5-()] -CC_NOTUSED -; - -355  -æßt_size -) { - -357 - `as£¹ -(() == 8); - -358 if( -æßt_big_’dŸn -) { - -359 -d¡ -[0] = -¤c -[0]; - -360 -d¡ -[1] = -¤c -[1]; - -361 -d¡ -[2] = -¤c -[2]; - -362 -d¡ -[3] = -¤c -[3]; - -363 -d¡ -[4] = -¤c -[4]; - -364 -d¡ -[5] = -¤c -[5]; - -365 -d¡ -[6] = -¤c -[6]; - -366 -d¡ -[7] = -¤c -[7]; - -368 -d¡ -[0] = -¤c -[7]; - -369 -d¡ -[1] = -¤c -[6]; - -370 -d¡ -[2] = -¤c -[5]; - -371 -d¡ -[3] = -¤c -[4]; - -372 -d¡ -[4] = -¤c -[3]; - -373 -d¡ -[5] = -¤c -[2]; - -374 -d¡ -[6] = -¤c -[1]; - -375 -d¡ -[7] = -¤c -[0]; - -379 - `as£¹ -(() == 4); - -380 if( -æßt_big_’dŸn -) { - -381 -d¡ -[0] = -¤c -[0]; - -382 -d¡ -[1] = -¤c -[1]; - -383 -d¡ -[2] = -¤c -[2]; - -384 -d¡ -[3] = -¤c -[3]; - -386 -d¡ -[0] = -¤c -[3]; - -387 -d¡ -[1] = -¤c -[2]; - -388 -d¡ -[2] = -¤c -[1]; - -389 -d¡ -[3] = -¤c -[0]; - -393 - } -} - -398 -a¢_’c_rv®_t - - -399 - $N©iveR—l_’code_Ûr -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -400 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -401 cÚ¡ * -¥Œ -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -402 * -­p_key -) { - -403 -a¢_’c_rv®_t - -” - = {0, 0, 0}; - -405 if(! -cÚ¡¿šts -ècÚ¡¿št ð -td --> -’codšg_cÚ¡¿šts -. -Ûr_cÚ¡¿šts -; - -406 if( -cÚ¡¿šts - && cÚ¡¿šts-> -v®ue -. -width - != 0) { - -408 -ušt8_t - -sü©ch -[()]; - -409 cÚ¡ -a¢_N©iveR—l_¥ecifics_t - * -¥ecs - = - -410 (cÚ¡ -a¢_N©iveR—l_¥ecifics_t - *) -td --> -¥ecifics -; - -411 -size_t - -wœe_size - = -cÚ¡¿šts --> -v®ue -. -width -; - -413 if( -¥ecs - ? ( -wœe_size - =ð¥ecs-> -æßt_size -) - -414 : ( -wœe_size - == ())) { - -420 - `as£¹ -(( -wœe_size - == ()) - -421 || ( -¥ecs - && s³cs-> -æßt_size - =ð -wœe_size -)); - -422 -ASN__ENCODE_FAILED -; - -429 - `N©iveR—l__ÃtwÜk_sw­ -( -wœe_size -, -¥Œ -, -sü©ch -); - -430 if( - `cb -( -sü©ch -, -wœe_size -, -­p_key -) < 0) { - -431 -ASN__ENCODE_FAILED -; - -433 -” -. -’coded - = -wœe_size -; - -434 - `ASN__ENCODED_OK -( -” -); - -437  -d - = - `N©iveR—l__g‘_doubË -( -td -, -¥Œ -); - -438 -ssize_t - -Ën_Ën -; - -439 -REAL_t - -tmp -; - -442 - `mem£t -(& -tmp -, 0, (tmp)); - -444 if( - `a¢_doubË2REAL -(& -tmp -, -d -)) { - -445 -ASN__ENCODE_FAILED -; - -449 -Ën_Ën - = - `Ûr_£rŸlize_Ëngth -( -tmp -. -size -, -cb -, -­p_key -); - -450 if( -Ën_Ën - < 0 || - `cb -( -tmp -. -buf -,mp. -size -, -­p_key -) < 0) { - -451 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_REAL -, & -tmp -); - -452 -ASN__ENCODE_FAILED -; - -454 -” -. -’coded - = -Ën_Ën - + -tmp -. -size -; - -455 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_REAL -, & -tmp -); - -456 - `ASN__ENCODED_OK -( -” -); - -459 - } -} - -461 -a¢_dec_rv®_t - - -462 - $N©iveR—l_decode_Ûr -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -463 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -464 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -465 cÚ¡ * -±r -, -size_t - -size -) { - -466 -a¢_dec_rv®_t - -ok - = { -RC_OK -, 0}; - -467  -d -; - -468 -ssize_t - -Ën_Ën -; - -469 -size_t - -»®_body_Ën -; - -471 () -Ýt_codec_ùx -; - -473 if(! -cÚ¡¿šts -ècÚ¡¿št ð -td --> -’codšg_cÚ¡¿šts -. -Ûr_cÚ¡¿šts -; - -474 if( -cÚ¡¿šts - && cÚ¡¿šts-> -v®ue -. -width - != 0) { - -476 -ušt8_t - -sü©ch -[()]; - -477 -size_t - -wœe_size - = -cÚ¡¿šts --> -v®ue -. -width -; - -479 if( -size - < -wœe_size -) - -480 -ASN__DECODE_STARVED -; - -486 - `N©iveR—l__ÃtwÜk_sw­ -( -wœe_size -, -±r -, -sü©ch -); - -489  -wœe_size -) { - -492  -tmp -; - -493 - `memýy -(& -tmp -, -sü©ch -, ()); - -494 if( - `N©iveR—l__£t -( -td -, -¥Œ -, -tmp -) < 0) - -495 -ASN__DECODE_FAILED -; - -500  -tmp -; - -501 - `memýy -(& -tmp -, -sü©ch -, ()); - -502 if( - `N©iveR—l__£t -( -td -, -¥Œ -, -tmp -) < 0) - -503 -ASN__DECODE_FAILED -; - -507 -ASN__DECODE_FAILED -; - -510 -ok -. -cÚsumed - = -wœe_size -; - -511  -ok -; - -514 -Ën_Ën - = - `Ûr_ãtch_Ëngth -( -±r -, -size -, & -»®_body_Ën -); - -515 if( -Ën_Ën - < 0è -ASN__DECODE_FAILED -; - -516 if( -Ën_Ën - =ð0è -ASN__DECODE_STARVED -; - -518 -±r - = (cÚ¡ *íŒ + -Ën_Ën -; - -519 -size - -ð -Ën_Ën -; - -521 if( -»®_body_Ën - > -size -è -ASN__DECODE_STARVED -; - -524 -ušt8_t - -sü©ch -[24]; - -525 -REAL_t - -tmp -; - -526  -»t -; - -528 if( -»®_body_Ën - < ( -sü©ch -)) { - -529 -tmp -. -buf - = -sü©ch -; - -530 -tmp -. -size - = -»®_body_Ën -; - -533 -tmp -. -buf - = - `CALLOC -(1, -»®_body_Ën - + 1); - -534 -tmp -. -size - = -»®_body_Ën -; - -535 if(! -tmp -. -buf -) { - -536 -ASN__DECODE_FAILED -; - -540 - `memýy -( -tmp -. -buf -, -±r -, -»®_body_Ën -); - -541 -tmp -. -buf -[ -»®_body_Ën -] = '\0'; - -543 -»t - = - `a¢_REAL2doubË -(& -tmp -, & -d -); - -544 if( -tmp -. -buf - !ð -sü©ch -è - `FREEMEM -(tmp.buf); - -545 if( -»t -) { - -546 - `ASN_DEBUG -("REAL decoded iÀ%" -ASN_PRI_SIZE - " bytes, but can't convert double", - -547 -»®_body_Ën -); - -548 -ASN__DECODE_FAILED -; - -552 if( - `N©iveR—l__£t -( -td -, -¥Œ -, -d -) < 0) - -553 -ASN__DECODE_FAILED -; - -555 -ok -. -cÚsumed - = -Ën_Ën - + -»®_body_Ën -; - -556  -ok -; - -557 - } -} - -564 -a¢_dec_rv®_t - - -565 - $N©iveR—l_decode_x” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -566 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -567 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, -size_t - -size -) { - -568 -a¢_dec_rv®_t - -rv® -; - -569 -REAL_t - -¡ - = { 0, 0 }; - -570 -REAL_t - * -¡p - = & -¡ -; - -572 -rv® - = - `REAL_decode_x” -( -Ýt_codec_ùx -, -td -, (**)& -¡p -, -Ýt_mÇme -, - -573 -buf_±r -, -size -); - -574 if( -rv® -. -code - =ð -RC_OK -) { - -575  -d -; - -576 if( - `a¢_REAL2doubË -(& -¡ -, & -d -è|| - `N©iveR—l__£t -( -td -, -¥Œ -, d) < 0) { - -577 -rv® -. -code - = -RC_FAIL -; - -578 -rv® -. -cÚsumed - = 0; - -582 -rv® -. -cÚsumed - = 0; - -584 - `ASN_STRUCT_FREE_CONTENTS_ONLY -( -a¢_DEF_REAL -, & -¡ -); - -585  -rv® -; - -586 - } -} - -588 -a¢_’c_rv®_t - - -589 - $N©iveR—l_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -590  -žev– -, -x”_’cod”_æags_e - -æags -, - -591 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -592  -d - = - `N©iveR—l__g‘_doubË -( -td -, -¥Œ -); - -593 -a¢_’c_rv®_t - -” - = {0,0,0}; - -595 () -žev– -; - -597 -” -. -’coded - = - `REAL__dump -( -d -, -æags - & -XER_F_CANONICAL -, -cb -, -­p_key -); - -598 if( -” -. -’coded - < 0è -ASN__ENCODE_FAILED -; - -600 - `ASN__ENCODED_OK -( -” -); - -601 - } -} - -607 - $N©iveR—l_´št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -608 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -609 () -žev– -; - -611 if( -¥Œ -) { - -612  -d - = - `N©iveR—l__g‘_doubË -( -td -, -¥Œ -); - -613  ( - `REAL__dump -( -d -, 0, -cb -, -­p_key -) < 0) ? -1 : 0; - -615  ( - `cb -("", 8, -­p_key -) < 0) ? -1 : 0; - -617 - } -} - -620 - $N©iveR—l_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -­Œ -, - -621 cÚ¡ * -b±r -) { - -623 if( -­Œ - && -b±r -) { - -624  -a - = - `N©iveR—l__g‘_doubË -( -td -, -­Œ -); - -625  -b - = - `N©iveR—l__g‘_doubË -( -td -, -b±r -); - -628 if( - `a¢_i¢ª -( -a -)) { - -629 if( - `a¢_i¢ª -( -b -)) { - -634 } if( - `a¢_i¢ª -( -b -)) { - -638 if( -a - < -b -) { - -640 } if( -a - > -b -) { - -645 } if(! -­Œ -) { - -650 - } -} - -653 - $N©iveR—l_ä“ -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -±r -, - -654 -a¢_¡ruù_ä“_m‘hod - -m‘hod -) { - -655 if(! -td - || ! -±r -) - -658 - `ASN_DEBUG -("Freeing %s‡s REAL (%d, %p, Native)", - -659 -td --> -Çme -, -m‘hod -, -±r -); - -661  -m‘hod -) { - -662  -ASFM_FREE_EVERYTHING -: - -663 - `FREEMEM -( -±r -); - -665  -ASFM_FREE_UNDERLYING -: - -667  -ASFM_FREE_UNDERLYING_AND_RESET -: { - -668 cÚ¡ -a¢_N©iveR—l_¥ecifics_t - * -¥ecs -; - -669 -size_t - -æßt_size -; - -670 -¥ecs - = (cÚ¡ -a¢_N©iveR—l_¥ecifics_t - *) -td --> -¥ecifics -; - -671 -æßt_size - = -¥ecs - ? specs->float_size : (); - -672 - `mem£t -( -±r -, 0, -æßt_size -); - -675 - } -} - -677 -a¢_¿ndom_fžl_»suÉ_t - - -678 - $N©iveR—l_¿ndom_fžl -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -679 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -680 -size_t - -max_Ëngth -) { - -681 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_ok - = { -ARFILL_OK -, 0}; - -682 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_çžed - = { -ARFILL_FAILED -, 0}; - -683 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_sk³d - = { -ARFILL_SKIPPED -, 0}; - -684 #iâdeà -INFINITY - - -685  - #INFINITY - (1.0/0.0) - - ) - -687 #iâdeà -NAN - - -688  - #NAN - (0.0/0.0) - - ) - -690 cÚ¡  -doubË_v®ues -[] = { - -691 - -M_E -, M_E, - -M_PI -, M_PI, - -699 - -DBL_MIN -, DBL_MIN, - -700 - -DBL_MAX -, DBL_MAX, - -701 #ifdeà -DBL_TRUE_MIN - - -702 - -DBL_TRUE_MIN -, DBL_TRUE_MIN - -705 cÚ¡  -æßt_v®ues -[] = { - -706 0, -0.0, -1, 1, - -M_E -, M_E, -3.14, 3.14, - -M_PI -, M_PI, -255, 255, - -707 - -FLT_MIN -, FLT_MIN, - -708 - -FLT_MAX -, FLT_MAX, - -709 #ifdeà -FLT_TRUE_MIN - - -710 - -FLT_TRUE_MIN -, FLT_TRUE_MIN, - -712 -INFINITY -, -INFINITY, -NAN - - -714 -ssize_t - -æßt_£t_size - = - `N©iveR—l__æßt_size -( -td -); - -715 cÚ¡ -size_t - -n_doubËs - = ( -doubË_v®ues -) / (double_values[0]); - -716 cÚ¡ -size_t - -n_æßts - = ( -æßt_v®ues -) / (float_values[0]); - -717  -d -; - -719 () -cÚ¡¿šts -; - -721 if( -max_Ëngth - =ð0è -»suÉ_sk³d -; - -723 if( -æßt_£t_size - =ð(è&& - `a¢_¿ndom_b‘w“n -(0, 1) == 0) { - -724 -d - = -doubË_v®ues -[ - `a¢_¿ndom_b‘w“n -(0, -n_doubËs - - 1)]; - -726 -d - = -æßt_v®ues -[ - `a¢_¿ndom_b‘w“n -(0, -n_æßts - - 1)]; - -729 if( - `N©iveR—l__£t -( -td -, -¥Œ -, -d -) < 0) { - -730  -»suÉ_çžed -; - -733 -»suÉ_ok -. -Ëngth - = -æßt_£t_size -; - -734  -»suÉ_ok -; - -735 - } -} - -742  -size_t - - -743 - $N©iveR—l__æßt_size -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -) { - -744 cÚ¡ -a¢_N©iveR—l_¥ecifics_t - * -¥ecs - = - -745 (cÚ¡ -a¢_N©iveR—l_¥ecifics_t - *) -td --> -¥ecifics -; - -746  -¥ecs - ? s³cs-> -æßt_size - : (); - -747 - } -} - -750 - $N©iveR—l__g‘_doubË -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -±r -) { - -751 -size_t - -æßt_size - = - `N©iveR—l__æßt_size -( -td -); - -752 if( -æßt_size - == ()) { - -753  *(cÚ¡ *) -±r -; - -755  *(cÚ¡ *) -±r -; - -757 - } -} - -759  -ssize_t - - -760 - $N©iveR—l__£t -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -,  -d -) { - -761 -size_t - -æßt_size - = - `N©iveR—l__æßt_size -( -td -); - -762 * -Çtive -; - -764 if(!( -Çtive - = * -¥Œ -)) { - -765 -Çtive - = (* -¥Œ - = - `CALLOC -(1, -æßt_size -)); - -766 if(! -Çtive -) { - -771 if( -æßt_size - == ()) { - -772 if( - `a¢_doubË2æßt -( -d -, (*) -Çtive -)) { - -776 *(*) -Çtive - = -d -; - -779  -æßt_size -; - -780 - } -} - - @NgENB-ID.c - -8  - ~"NgENB-ID.h -" - -11 - $memb_maüoNgENB_ID_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 if( -¡ --> -size - > 0) { - -25 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -27 -size - = 0; - -30 if(( -size - == 20)) { - -34 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -36 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -39 - } -} - -42 - $memb_shÜtMaüoNgENB_ID_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -43 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -44 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -45 -size_t - -size -; - -47 if(! -¥Œ -) { - -48 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -50 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -54 if( -¡ --> -size - > 0) { - -56 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -58 -size - = 0; - -61 if(( -size - == 18)) { - -65 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -67 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -70 - } -} - -73 - $memb_lÚgMaüoNgENB_ID_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -74 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -75 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -76 -size_t - -size -; - -78 if(! -¥Œ -) { - -79 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -81 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -85 if( -¡ --> -size - > 0) { - -87 -size - = 8 * -¡ -->siz- (¡-> -b™s_unu£d - & 0x07); - -89 -size - = 0; - -92 if(( -size - == 21)) { - -96 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -98 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -101 - } -} - -103  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_maüoNgENB_ID_cÚ¡r_2 - - gCC_NOTUSED - = { - -104 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -105 { -APC_CONSTRAINED -, 0, 0, 20, 20 } , - -108  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_shÜtMaüoNgENB_ID_cÚ¡r_3 - - gCC_NOTUSED - = { - -109 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -110 { -APC_CONSTRAINED -, 0, 0, 18, 18 } , - -113  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_lÚgMaüoNgENB_ID_cÚ¡r_4 - - gCC_NOTUSED - = { - -114 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -115 { -APC_CONSTRAINED -, 0, 0, 21, 21 } , - -118 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_NgENB_ID_cÚ¡r_1 - - gCC_NOTUSED - = { - -119 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 2, 2, 0, 2 } , - -120 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -123 -a¢_TYPE_memb”_t - - ga¢_MBR_NgENB_ID_1 -[] = { - -124 { -ATF_NOFLAGS -, 0, -off£tof -( -NgENB_ID -, -choiû -. -maüoNgENB_ID -), - -125 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -127 & -a¢_DEF_BIT_STRING -, - -129 { 0, & -a¢_PER_memb_maüoNgENB_ID_cÚ¡r_2 -, -memb_maüoNgENB_ID_cÚ¡¿št_1 - }, - -133 { -ATF_NOFLAGS -, 0, -off£tof -( -NgENB_ID -, -choiû -. -shÜtMaüoNgENB_ID -), - -134 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -136 & -a¢_DEF_BIT_STRING -, - -138 { 0, & -a¢_PER_memb_shÜtMaüoNgENB_ID_cÚ¡r_3 -, -memb_shÜtMaüoNgENB_ID_cÚ¡¿št_1 - }, - -142 { -ATF_NOFLAGS -, 0, -off£tof -( -NgENB_ID -, -choiû -. -lÚgMaüoNgENB_ID -), - -143 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -145 & -a¢_DEF_BIT_STRING -, - -147 { 0, & -a¢_PER_memb_lÚgMaüoNgENB_ID_cÚ¡r_4 -, -memb_lÚgMaüoNgENB_ID_cÚ¡¿št_1 - }, - -152 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_NgENB_ID_g2–_1 -[] = { - -153 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -154 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -155 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -157 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_NgENB_ID_¥ecs_1 - = { - -158 ( -NgENB_ID -), - -159 -off£tof -( -NgENB_ID -, -_a¢_ùx -), - -160 -off£tof -( -NgENB_ID -, -´e£Á -), - -161 ((( -NgENB_ID - *)0)-> -´e£Á -), - -162 -a¢_MAP_NgENB_ID_g2–_1 -, - -167 -a¢_TYPE_desütÜ_t - - ga¢_DEF_NgENB_ID - = { - -170 & -a¢_OP_CHOICE -, - -175 { 0, & -a¢_PER_ty³_NgENB_ID_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -176 -a¢_MBR_NgENB_ID_1 -, - -178 & -a¢_SPC_NgENB_ID_¥ecs_1 - - - @OCTET_STRING.c - -6  - ~ - -7  - ~ - -8  - ~ - -9  - ~<”ºo.h -> - -14 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_OCTET_STRING_gs -[] = { - -15 ( -ASN_TAG_CLASS_UNIVERSAL - | (4 << 2)) - -17 -a¢_OCTET_STRING_¥ecifics_t - - ga¢_SPC_OCTET_STRING_¥ecs - = { - -18 ( -OCTET_STRING_t -), - -19 -off£tof -( -OCTET_STRING_t -, -_a¢_ùx -), - -20 -ASN_OSUBV_STR - - -23 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_OCTET_STRING - = { - -24 -OCTET_STRING_ä“ -, - -25 -OCTET_STRING_´št -, - -26 -OCTET_STRING_com·» -, - -27 -OCTET_STRING_decode_b” -, - -28 -OCTET_STRING_’code_d” -, - -29 -OCTET_STRING_decode_x”_hex -, - -30 -OCTET_STRING_’code_x” -, - -31 #ifdef -ASN_DISABLE_OER_SUPPORT - - -35 -OCTET_STRING_decode_Ûr -, - -36 -OCTET_STRING_’code_Ûr -, - -38 #ifdef -ASN_DISABLE_PER_SUPPORT - - -44 -OCTET_STRING_decode_u³r -, - -45 -OCTET_STRING_’code_u³r -, - -46 -OCTET_STRING_decode_­” -, - -47 -OCTET_STRING_’code_­” -, - -49 -OCTET_STRING_¿ndom_fžl -, - -52 -a¢_TYPE_desütÜ_t - - ga¢_DEF_OCTET_STRING - = { - -55 & -a¢_OP_OCTET_STRING -, - -56 -a¢_DEF_OCTET_STRING_gs -, - -57 ( -a¢_DEF_OCTET_STRING_gs -) - -58 / ( -a¢_DEF_OCTET_STRING_gs -[0]), - -59 -a¢_DEF_OCTET_STRING_gs -, - -60 ( -a¢_DEF_OCTET_STRING_gs -) - -61 / ( -a¢_DEF_OCTET_STRING_gs -[0]), - -62 { 0, 0, -a¢_g’”ic_no_cÚ¡¿št - }, - -64 & -a¢_SPC_OCTET_STRING_¥ecs - - -67 #undeà -_CH_PHASE - - -68 #undeà -NEXT_PHASE - - -69 #undeà -PREV_PHASE - - -70  - #_CH_PHASE -( -ùx -, -šc -) do { \ - -71 if( -ùx --> -pha£ - == 0) \ - -72 -ùx --> -cڋxt - = 0; \ - -73 -ùx --> -pha£ - +ð -šc -; \ - -74 } 0) - - ) - -75  - #NEXT_PHASE -( -ùx -è - `_CH_PHASE -(ùx, +1) - - ) - -76  - #PREV_PHASE -( -ùx -è - `_CH_PHASE -(ùx, -1) - - ) - -78 #undeà -ADVANCE - - -79  - #ADVANCE -( -num_by‹s -) do { \ - -80 -size_t - -num - = ( -num_by‹s -); \ - -81 -buf_±r - = ((cÚ¡ *)buf_±rè+ -num -; \ - -82 -size - -ð -num -; \ - -83 -cÚsumed_my£lf - +ð -num -; \ - -84 } 0) - - ) - -86 #undeà -RETURN - - -87  - #RETURN -( -_code -) do { \ - -88 -a¢_dec_rv®_t - -tm´v® -; \ - -89 -tm´v® -. -code - = -_code -; \ - -90 -tm´v® -. -cÚsumed - = -cÚsumed_my£lf -; \ - -91  -tm´v® -; \ - -92 } 0) - - ) - -94 #undeà -APPEND - - -95  - #APPEND -( -buåŒ -, -bufsize -) do { \ - -96 -size_t - -_bs - = ( -bufsize -); \ - -97 -size_t - -_ns - = -ùx --> -cڋxt -; \ - -98 -size_t - -_es - = -¡ --> -size - + -_bs -; \ - -100 if(() -_es - < 0è - `RETURN -( -RC_FAIL -); \ - -101 if( -_ns - <ð -_es -) { \ - -102 * -±r -; \ - -104 dØ{ -_ns - = _ns ? _ns << 1 : 16; } \ - -105  -_ns - <ð -_es -); \ - -107 if(() -_ns - < 0è - `RETURN -( -RC_FAIL -); \ - -108 -±r - = - `REALLOC -( -¡ --> -buf -, -_ns -); \ - -109 if( -±r -) { \ - -110 -¡ --> -buf - = ( -ušt8_t - *) -±r -; \ - -111 -ùx --> -cڋxt - = -_ns -; \ - -113 - `RETURN -( -RC_FAIL -); \ - -115 - `ASN_DEBUG -("R—Îoÿtšg iÁØ%ld", () -_ns -); \ - -117 - `memýy -( -¡ --> -buf - + st-> -size -, -buåŒ -, -_bs -); \ - -119 -¡ --> -buf -[ -_es -] = '\0'; \ - -120 -¡ --> -size - = -_es -; \ - -121 } 0) - - ) - -129  - s_¡ack_– - { - -130 -b”_Žv_Ën_t - - mËá -; - -131 -b”_Žv_Ën_t - - mgÙ -; - -132  - mcÚt_Ëv– -; - -133  - mwªt_nuÎs -; - -134  - mb™s_chݳd -; - -135 -b”_Žv_g_t - - mg -; - -136  -_¡ack_– - * - m´ev -; - -137  -_¡ack_– - * - mÃxt -; - -139  - s_¡ack - { - -140  -_¡ack_– - * - mž -; - -141  -_¡ack_– - * - mcur_±r -; - -144  -_¡ack_– - * - -145 - $OS__add_¡ack_– -( -_¡ack - * -¡ -) { - -146  -_¡ack_– - * -Ãl -; - -151 if( -¡ --> -cur_±r - && st->cur_±r-> -Ãxt -) { - -152 -Ãl - = -¡ --> -cur_±r --> -Ãxt -; - -153 -Ãl --> -b™s_chݳd - = 0; - -154 -Ãl --> -gÙ - = 0; - -157 -Ãl - = ( -_¡ack_– - *) - `CALLOC -(1, (_stack_el)); - -158 if( -Ãl - =ð -NULL -) - -159  -NULL -; - -161 if( -¡ --> -ž -) { - -163 -Ãl --> -cÚt_Ëv– - = -¡ --> -ž -->cont_level + 1; - -164 -¡ --> -ž --> -Ãxt - = -Ãl -; - -166 -Ãl --> -´ev - = -¡ --> -ž -; - -167 -¡ --> -ž - = -Ãl -; - -170 -¡ --> -cur_±r - = -Ãl -; - -172  -Ãl -; - -173 - } -} - -175  -_¡ack - * - -176 - $_Ãw_¡ack -() { - -177  ( -_¡ack - *) - `CALLOC -(1, (_stack)); - -178 - } -} - -183 -a¢_dec_rv®_t - - -184 - $OCTET_STRING_decode_b” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -185 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -186 cÚ¡ * -buf_±r -, -size_t - -size -,  -g_mode -) { - -187 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics - - -188 ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *) -td --> -¥ecifics - - -189 : & -a¢_SPC_OCTET_STRING_¥ecs -; - -190 -BIT_STRING_t - * -¡ - = (BIT_STRING_ˆ*)* -¥Œ -; - -191 -a¢_dec_rv®_t - -rv® -; - -192 -a¢_¡ruù_ùx_t - * -ùx -; - -193 -ssize_t - -cÚsumed_my£lf - = 0; - -194  -_¡ack - * -¡ck -; - -195  -_¡ack_– - * -£l - = 0; - -196  -Žv_cÚ¡r -; - -197 -a¢_OS_Subv¬ŸÁ - -ty³_v¬ŸÁ - = -¥ecs --> -subv¬ŸÁ -; - -199 - `ASN_DEBUG -("Decoding %s‡s %s (frame %ld)", - -200 -td --> -Çme -, - -201 ( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_STR -) ? - -203 () -size -); - -208 if( -¡ - =ð -NULL -) { - -209 -¡ - = ( -BIT_STRING_t - *)(* -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -)); - -210 if( -¡ - =ð -NULL -è - `RETURN -( -RC_FAIL -); - -214 -ùx - = ( -a¢_¡ruù_ùx_t - *)((*) -¡ - + -¥ecs --> -ùx_off£t -); - -216  -ùx --> -pha£ -) { - -221 -rv® - = - `b”_check_gs -( -Ýt_codec_ùx -, -td -, -ùx -, - -222 -buf_±r -, -size -, -g_mode -, -1, - -223 & -ùx --> -Ëá -, & -Žv_cÚ¡r -); - -224 if( -rv® -. -code - !ð -RC_OK -) - -225  -rv® -; - -227 if( -Žv_cÚ¡r -) { - -231 -ùx --> -±r - = - `_Ãw_¡ack -(); - -232 if(! -ùx --> -±r -) { - -233 - `RETURN -( -RC_FAIL -); - -239 - `_CH_PHASE -( -ùx -, 3); - -240 if( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_ANY - && -g_mode - != 1) - -241 - `APPEND -( -buf_±r -, -rv® -. -cÚsumed -); - -242 - `ADVANCE -( -rv® -. -cÚsumed -); - -243  -pha£3 -; - -246 - `NEXT_PHASE -( -ùx -); - -249 -pha£1 -: - -253 -¡ck - = ( -_¡ack - *) -ùx --> -±r -; - -254 -£l - = -¡ck --> -cur_±r -; - -256 -b”_Žv_g_t - -Žv_g -; - -257 -b”_Žv_Ën_t - -Žv_Ën -; - -258 -b”_Žv_g_t - -ex³ùed_g -; - -259 -ssize_t - -Ž -, -Î -, -Žvl -; - -261 -size_t - -Leá - = ((! -£l -||(size_t)£l-> -Ëá - >ð -size -) - -262 ? -size -:( -size_t -) -£l --> -Ëá -); - -265 - `ASN_DEBUG -("%p, s->l=%ld, s->wn=%ld, s->g=%ld\n", (*) -£l -, - -266 ()( -£l -?£l-> -Ëá -:0), - -267 ()( -£l -?£l-> -wªt_nuÎs -:0), - -268 ()( -£l -?£l-> -gÙ -:0) - -270 if( -£l - && s–-> -Ëá - <ð0 && s–-> -wªt_nuÎs - == 0) { - -271 if( -£l --> -´ev -) { - -272  -_¡ack_– - * -´ev - = -£l -->prev; - -273 if( -´ev --> -Ëá - != -1) { - -274 if( -´ev --> -Ëá - < -£l --> -gÙ -) - -275 - `RETURN -( -RC_FAIL -); - -276 -´ev --> -Ëá - -ð -£l --> -gÙ -; - -278 -´ev --> -gÙ - +ð -£l -->got; - -279 -£l - = -¡ck --> -cur_±r - = -´ev -; - -280 if(! -£l -) ; - -281 -Žv_cÚ¡r - = 1; - -284 -£l - = -¡ck --> -cur_±r - = 0; - -289 -Ž - = - `b”_ãtch_g -( -buf_±r -, -Leá -, & -Žv_g -); - -290 - `ASN_DEBUG -("fetchag(size=%ld,L=%ld), %sstack,†eft=%ld, wn=%ld,l=%ld", - -291 () -size -, () -Leá -, -£l -?"":"!", - -292 ()( -£l -?£l-> -Ëá -:0), - -293 ()( -£l -?£l-> -wªt_nuÎs -:0), - -294 () -Ž -); - -295  -Ž -) { - -296 -1: - `RETURN -( -RC_FAIL -); - -297 0: - `RETURN -( -RC_WMORE -); - -300 -Žv_cÚ¡r - = - `BER_TLV_CONSTRUCTED -( -buf_±r -); - -302 -Î - = - `b”_ãtch_Ëngth -( -Žv_cÚ¡r -, - -303 (cÚ¡ *) -buf_±r - + -Ž -, -Leá - -l,& -Žv_Ën -); - -304 - `ASN_DEBUG -("Gotag=%s,c=%d,†eft=%ld,l=%ld,†en=%ld,†l=%ld", - -305 - `b”_Žv_g_¡ršg -( -Žv_g -), -Žv_cÚ¡r -, - -306 () -Leá -, () -Ž -, () -Žv_Ën -, () -Î -); - -307  -Î -) { - -308 -1: - `RETURN -( -RC_FAIL -); - -309 0: - `RETURN -( -RC_WMORE -); - -312 if( -£l - && s–-> -wªt_nuÎs - - -313 && ((cÚ¡ -ušt8_t - *) -buf_±r -)[0] == 0 - -314 && ((cÚ¡ -ušt8_t - *) -buf_±r -)[1] == 0) - -317 - `ASN_DEBUG -("E© EOC; wn=%d--", -£l --> -wªt_nuÎs -); - -319 if( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_ANY - - -320 && ( -g_mode - !ð1 || -£l --> -cÚt_Ëv– -)) - -321 - `APPEND -("\0\0", 2); - -323 - `ADVANCE -(2); - -324 -£l --> -gÙ - += 2; - -325 if( -£l --> -Ëá - != -1) { - -326 -£l --> -Ëá - -= 2; - -329 -£l --> -wªt_nuÎs ---; - -330 if( -£l --> -wªt_nuÎs - == 0) { - -332 -£l --> -Ëá - = 0; - -333 -Žv_cÚ¡r - = 1; - -343  -ty³_v¬ŸÁ -) { - -344  -ASN_OSUBV_BIT -: - -347  -ASN_OSUBV_STR -: - -349 if( -£l -) { - -350  -Ëv– - = -£l --> -cÚt_Ëv– -; - -351 if( -Ëv– - < -td --> -®l_gs_couÁ -) { - -352 -ex³ùed_g - = -td --> -®l_gs -[ -Ëv– -]; - -354 } if( -td --> -®l_gs_couÁ -) { - -355 -ex³ùed_g - = -td --> -®l_gs - - -356 [ -td --> -®l_gs_couÁ - - 1]; - -362  -ASN_OSUBV_ANY -: - -363 -ex³ùed_g - = -Žv_g -; - -368 if( -Žv_g - !ð -ex³ùed_g -) { - -369  -buf -[2][32]; - -370 - `b”_Žv_g_¢´št -( -Žv_g -, - -371 -buf -[0], (buf[0])); - -372 - `b”_Žv_g_¢´št -( -td --> -gs -[td-> -gs_couÁ --1], - -373 -buf -[1], (buf[1])); - -374 - `ASN_DEBUG -("Tag does‚ot matchƒxpectation: %s != %s", - -375 -buf -[0], buf[1]); - -376 - `RETURN -( -RC_FAIL -); - -379 -Žvl - = -Ž - + -Î -; - -380 if(( -Žv_Ën - + -Žvl -) < 0) { - -382 - `ASN_DEBUG -("TLVƒncoding +†ength (%ld) isoo big", - -383 () -Žv_Ën -); - -384 - `RETURN -( -RC_FAIL -); - -390 -£l - = - `OS__add_¡ack_– -( -¡ck -); - -391 if(! -£l -è - `RETURN -( -RC_FAIL -); - -393 -£l --> -g - = -Žv_g -; - -395 -£l --> -wªt_nuÎs - = ( -Žv_Ën -==-1); - -396 if( -£l --> -´ev - && s–->´ev-> -Ëá - != -1) { - -398 if( -£l --> -´ev --> -Ëá - < -Žvl - + ( -Žv_Ën -==-1?0:tlv_len)) - -399 - `RETURN -( -RC_FAIL -); - -400 if( -Žv_Ën - == -1) - -401 -£l --> -Ëá - = s–-> -´ev -->Ëá - -Žvl -; - -403 -£l --> -Ëá - = -Žv_Ën -; - -405 -£l --> -Ëá - = -Žv_Ën -; - -407 if( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_ANY - - -408 && ( -g_mode - !ð1 || -£l --> -cÚt_Ëv– -)) - -409 - `APPEND -( -buf_±r -, -Žvl -); - -410 -£l --> -gÙ - +ð -Žvl -; - -411 - `ADVANCE -( -Žvl -); - -413 - `ASN_DEBUG -("+EXPECT2 got=%ld†eft=%ld, wn=%d, clvl=%u", - -414 () -£l --> -gÙ -, ()£l-> -Ëá -, - -415 -£l --> -wªt_nuÎs -, s–-> -cÚt_Ëv– -); - -417 }  -Žv_cÚ¡r -); - -418 if( -£l - =ð -NULL -) { - -420 - `ASN_DEBUG -("Phase out"); - -421 - `_CH_PHASE -( -ùx -, +3); - -425 - `NEXT_PHASE -( -ùx -); - -428 -¡ck - = ( -_¡ack - *) -ùx --> -±r -; - -429 -£l - = -¡ck --> -cur_±r -; - -430 - `ASN_DEBUG -("Phase 2: Need %ld bytes, size=%ld,‡lrg=%ld, wn=%d", - -431 () -£l --> -Ëá -, () -size -, ()£l-> -gÙ -, - -432 -£l --> -wªt_nuÎs -); - -434 -b”_Žv_Ën_t - -Ën -; - -436 - `as£¹ -( -£l --> -Ëá - >= 0); - -438 -Ën - = (( -b”_Žv_Ën_t -) -size - < -£l --> -Ëá -) - -439 ? ( -b”_Žv_Ën_t -) -size - : -£l --> -Ëá -; - -440 if( -Ën - > 0) { - -441 if( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_BIT - - -442 && -£l --> -b™s_chݳd - == 0) { - -444 -¡ --> -b™s_unu£d - = *(cÚ¡ -ušt8_t - *) -buf_±r -; - -445 - `APPEND -(((cÚ¡ *) -buf_±r -+1), ( -Ën - - 1)); - -446 -£l --> -b™s_chݳd - = 1; - -448 - `APPEND -( -buf_±r -, -Ën -); - -450 - `ADVANCE -( -Ën -); - -451 -£l --> -Ëá - -ð -Ën -; - -452 -£l --> -gÙ - +ð -Ën -; - -455 if( -£l --> -Ëá -) { - -456 - `ASN_DEBUG -("OS†eft %ld, size = %ld, wn=%d\n", - -457 () -£l --> -Ëá -, () -size -, s–-> -wªt_nuÎs -); - -458 - `RETURN -( -RC_WMORE -); - -461 - `PREV_PHASE -( -ùx -); - -462  -pha£1 -; - -466 -pha£3 -: - -470 - `as£¹ -( -ùx --> -Ëá - >= 0); - -472 if( -size - < ( -size_t -) -ùx --> -Ëá -) { - -473 if(! -size -è - `RETURN -( -RC_WMORE -); - -474 if( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_BIT - && ! -ùx --> -cڋxt -) { - -475 -¡ --> -b™s_unu£d - = *(cÚ¡ -ušt8_t - *) -buf_±r -; - -476 -ùx --> -Ëá ---; - -477 - `ADVANCE -(1); - -479 - `APPEND -( -buf_±r -, -size -); - -480 - `as£¹ -( -ùx --> -cڋxt - > 0); - -481 -ùx --> -Ëá - -ð -size -; - -482 - `ADVANCE -( -size -); - -483 - `RETURN -( -RC_WMORE -); - -485 if( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_BIT - - -486 && ! -ùx --> -cڋxt - && ctx-> -Ëá -) { - -487 -¡ --> -b™s_unu£d - = *(cÚ¡ -ušt8_t - *) -buf_±r -; - -488 -ùx --> -Ëá ---; - -489 - `ADVANCE -(1); - -491 - `APPEND -( -buf_±r -, -ùx --> -Ëá -); - -492 - `ADVANCE -( -ùx --> -Ëá -); - -493 -ùx --> -Ëá - = 0; - -495 - `NEXT_PHASE -( -ùx -); - -500 if( -£l -) { - -501 - `ASN_DEBUG -("3sel…=%p, wn=%d,†=%ld, g=%ld, size=%ld", - -502 (*) -£l --> -´ev -, s–-> -wªt_nuÎs -, - -503 () -£l --> -Ëá -, ()£l-> -gÙ -, () -size -); - -504 if( -£l --> -´ev - || s–-> -wªt_nuÎs - > 1 || s–-> -Ëá - > 0) { - -505 - `RETURN -( -RC_WMORE -); - -512 if( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_BIT -) { - -513 if( -¡ --> -size -) { - -514 if( -¡ --> -b™s_unu£d - < 0 || st->bits_unused > 7) { - -515 - `RETURN -( -RC_FAIL -); - -518 -¡ --> -buf -[¡-> -size --1] &ð0xfà<< st-> -b™s_unu£d -; - -520 if( -¡ --> -b™s_unu£d -) { - -521 - `RETURN -( -RC_FAIL -); - -526 - `ASN_DEBUG -("Took %ld bytesoƒncode %s: [%s]:%ld", - -527 () -cÚsumed_my£lf -, -td --> -Çme -, - -528 ( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_STR -è? (*) -¡ --> -buf - : "", - -529 () -¡ --> -size -); - -532 - `RETURN -( -RC_OK -); - -533 - } -} - -538 -a¢_’c_rv®_t - - -539 - $OCTET_STRING_’code_d” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -540  -g_mode -, -b”_Žv_g_t - -g -, - -541 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -542 -a¢_’c_rv®_t - -” - = { 0, 0, 0 }; - -543 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics - - -544 ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *) -td --> -¥ecifics - - -545 : & -a¢_SPC_OCTET_STRING_¥ecs -; - -546 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -547 -a¢_OS_Subv¬ŸÁ - -ty³_v¬ŸÁ - = -¥ecs --> -subv¬ŸÁ -; - -548  -fix_Ï¡_by‹ - = 0; - -550 - `ASN_DEBUG -("%s %s‡s OCTET STRING", - -551 -cb -?"E¡im©šg":"Encodšg", -td --> -Çme -); - -556 if( -ty³_v¬ŸÁ - !ð -ASN_OSUBV_ANY - || -g_mode - == 1) { - -557 -” -. -’coded - = - `d”_wr™e_gs -( -td -, - -558 ( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_BIT -è+ -¡ --> -size -, - -559 -g_mode -, -ty³_v¬ŸÁ - =ð -ASN_OSUBV_ANY -, -g -, - -560 -cb -, -­p_key -); - -561 if( -” -. -’coded - == -1) { - -562 -” -. -çžed_ty³ - = -td -; - -563 -” -. -¡ruùu»_±r - = -¥Œ -; - -564  -” -; - -568 - `as£¹ -( -ty³_v¬ŸÁ - !ð -ASN_OSUBV_ANY - || -g_mode - != -1); - -569 -” -. -’coded - = 0; - -572 if(! -cb -) { - -573 -” -. -’coded - +ð( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_BIT -è+ -¡ --> -size -; - -574 - `ASN__ENCODED_OK -( -” -); - -580 if( -ty³_v¬ŸÁ - =ð -ASN_OSUBV_BIT -) { - -581 -ušt8_t - -b - = -¡ --> -b™s_unu£d - & 0x07; - -582 if( -b - && -¡ --> -size -è -fix_Ï¡_by‹ - = 1; - -583 - `ASN__CALLBACK -(& -b -, 1); - -587 - `ASN__CALLBACK -( -¡ --> -buf -, st-> -size - - -fix_Ï¡_by‹ -); - -590 if( -fix_Ï¡_by‹ -) { - -591 -ušt8_t - -b - = -¡ --> -buf -[¡-> -size --1] & (0xfà<< st-> -b™s_unu£d -); - -592 - `ASN__CALLBACK -(& -b -, 1); - -595 - `ASN__ENCODED_OK -( -” -); - -596 -cb_çžed -: - -597 -ASN__ENCODE_FAILED -; - -598 - } -} - -600 -a¢_’c_rv®_t - - -601 - $OCTET_STRING_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -602  -žev– -, -x”_’cod”_æags_e - -æags -, - -603 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -604 cÚ¡ * cÚ¡ -h2c - = "0123456789ABCDEF"; - -605 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -606 -a¢_’c_rv®_t - -” - = { 0, 0, 0 }; - -607  -sü©ch -[16 * 3 + 4]; - -608 * -p - = -sü©ch -; - -609 -ušt8_t - * -buf -; - -610 -ušt8_t - * -’d -; - -611 -size_t - -i -; - -613 if(! -¡ - || (!¡-> -buf - && st-> -size -)) - -614 -ASN__ENCODE_FAILED -; - -616 -” -. -’coded - = 0; - -621 -buf - = -¡ -->buf; - -622 -’d - = -buf - + -¡ --> -size -; - -623 if( -æags - & -XER_F_CANONICAL -) { - -624 * -sûnd - = -sü©ch - + ((scratch) - 2); - -625 ; -buf - < -’d -; buf++) { - -626 if( -p - >ð -sûnd -) { - -627 - `ASN__CALLBACK -( -sü©ch -, -p - - scratch); - -628 -p - = -sü©ch -; - -630 * -p -++ = -h2c -[(* -buf - >> 4) & 0x0F]; - -631 * -p -++ = -h2c -[* -buf - & 0x0F]; - -634 - `ASN__CALLBACK -( -sü©ch -, -p --scratch); - -636  -i - = 0; -buf - < -’d -; buf++, i++) { - -637 if(!( -i - % 16è&& (˜|| -¡ --> -size - > 16)) { - -638 - `ASN__CALLBACK -( -sü©ch -, -p --scratch); - -639 -p - = -sü©ch -; - -640 - `ASN__TEXT_INDENT -(1, -žev– -); - -642 * -p -++ = -h2c -[(* -buf - >> 4) & 0x0F]; - -643 * -p -++ = -h2c -[* -buf - & 0x0F]; - -644 * -p -++ = 0x20; - -646 if( -p - - -sü©ch -) { - -647 -p ---; - -648 - `ASN__CALLBACK -( -sü©ch -, -p --scratch); - -649 if( -¡ --> -size - > 16) - -650 - `ASN__TEXT_INDENT -(1, -žev– --1); - -654 - `ASN__ENCODED_OK -( -” -); - -655 -cb_çžed -: - -656 -ASN__ENCODE_FAILED -; - -657 - } -} - -659 cÚ¡  - sOCTET_STRING__x”_esÿ³_bË_s - { - -660 cÚ¡ * - m¡ršg -; - -661  - msize -; - -662 } - gOCTET_STRING__x”_esÿ³_bË -[] = { - -663  - #OSXET -( -s -è{ s, (sè- 1 } - - ) - -664 -OSXET -("\074\156\165\154\057\076"), - -665 -OSXET -("\074\163\157\150\057\076"), - -666 -OSXET -("\074\163\164\170\057\076"), - -667 -OSXET -("\074\145\164\170\057\076"), - -668 -OSXET -("\074\145\157\164\057\076"), - -669 -OSXET -("\074\145\156\161\057\076"), - -670 -OSXET -("\074\141\143\153\057\076"), - -671 -OSXET -("\074\142\145\154\057\076"), - -672 -OSXET -("\074\142\163\057\076"), - -673 -OSXET -("\011"), - -674 -OSXET -("\012"), - -675 -OSXET -("\074\166\164\057\076"), - -676 -OSXET -("\074\146\146\057\076"), - -677 -OSXET -("\015"), - -678 -OSXET -("\074\163\157\057\076"), - -679 -OSXET -("\074\163\151\057\076"), - -680 -OSXET -("\074\144\154\145\057\076"), - -681 -OSXET -("\074\144\143\061\057\076"), - -682 -OSXET -("\074\144\143\062\057\076"), - -683 -OSXET -("\074\144\143\063\057\076"), - -684 -OSXET -("\074\144\143\064\057\076"), - -685 -OSXET -("\074\156\141\153\057\076"), - -686 -OSXET -("\074\163\171\156\057\076"), - -687 -OSXET -("\074\145\164\142\057\076"), - -688 -OSXET -("\074\143\141\156\057\076"), - -689 -OSXET -("\074\145\155\057\076"), - -690 -OSXET -("\074\163\165\142\057\076"), - -691 -OSXET -("\074\145\163\143\057\076"), - -692 -OSXET -("\074\151\163\064\057\076"), - -693 -OSXET -("\074\151\163\063\057\076"), - -694 -OSXET -("\074\151\163\062\057\076"), - -695 -OSXET -("\074\151\163\061\057\076"), - -702 -OSXET -("\046\141\155\160\073"), - -707 -OSXET -("\046\154\164\073"), - -709 -OSXET -("\046\147\164\073"), - -713 - $OS__check_esÿ³d_cڌÞ_ch¬ -(cÚ¡ * -buf -,  -size -) { - -714 -size_t - -i -; - -721  -i - = 0; i < 32 ; i++) { - -722 cÚ¡  -OCTET_STRING__x”_esÿ³_bË_s - * -– -; - -723 -– - = & -OCTET_STRING__x”_esÿ³_bË -[ -i -]; - -724 if( -– --> -size - =ðsiz&& - `memcmp -( -buf -,ƒl-> -¡ršg -, size) == 0) - -725  -i -; - -728 - } -} - -731 - $OCTET_STRING__hªdË_cڌÞ_ch¬s -(* -¡ruù_±r -, cÚ¡ * -chunk_buf -, -size_t - -chunk_size -) { - -737  -cڌÞ_ch¬ - = - `OS__check_esÿ³d_cڌÞ_ch¬ -( -chunk_buf -, -chunk_size -); - -738 if( -cڌÞ_ch¬ - >= 0) { - -739 -OCTET_STRING_t - * -¡ - = (OCTET_STRING_ˆ*) -¡ruù_±r -; - -740 * -p - = - `REALLOC -( -¡ --> -buf -, st-> -size - + 2); - -741 if( -p -) { - -742 -¡ --> -buf - = ( -ušt8_t - *) -p -; - -743 -¡ --> -buf -[¡-> -size -++] = -cڌÞ_ch¬ -; - -744 -¡ --> -buf -[¡-> -size -] = '\0'; - -750 - } -} - -752 -a¢_’c_rv®_t - - -753 - $OCTET_STRING_’code_x”_utf8 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -754  -žev– -, -x”_’cod”_æags_e - -æags -, - -755 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -756 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -757 -a¢_’c_rv®_t - -” - = { 0, 0, 0 }; - -758 -ušt8_t - * -buf -, * -’d -; - -759 -ušt8_t - * -ss -; - -760 -ssize_t - -’coded_Ën - = 0; - -762 () -žev– -; - -763 () -æags -; - -765 if(! -¡ - || (!¡-> -buf - && st-> -size -)) - -766 -ASN__ENCODE_FAILED -; - -768 -buf - = -¡ -->buf; - -769 -’d - = -buf - + -¡ --> -size -; - -770  -ss - = -buf -; buà< -’d -; buf++) { - -771  -ch - = * -buf -; - -772  -s_Ën -; - -777 if( -ch - < ( -OCTET_STRING__x”_esÿ³_bË -) - -778 /( -OCTET_STRING__x”_esÿ³_bË -[0]) - -779 && ( -s_Ën - = -OCTET_STRING__x”_esÿ³_bË -[ -ch -]. -size -)) { - -780 if((( -buf - - -ss -è&& - `cb -(ss, buà- ss, -­p_key -) < 0) - -781 || - `cb -( -OCTET_STRING__x”_esÿ³_bË -[ -ch -]. -¡ršg -, -s_Ën -, - -782 -­p_key -) < 0) - -783 -ASN__ENCODE_FAILED -; - -784 -’coded_Ën - +ð( -buf - - -ss -è+ -s_Ën -; - -785 -ss - = -buf - + 1; - -789 -’coded_Ën - +ð( -buf - - -ss -); - -790 if(( -buf - - -ss -è&& - `cb -(ss, buà- ss, -­p_key -) < 0) - -791 -ASN__ENCODE_FAILED -; - -793 -” -. -’coded - = -’coded_Ën -; - -794 - `ASN__ENCODED_OK -( -” -); - -795 - } -} - -800  -ssize_t - - $OCTET_STRING__cÚv”t_hexadecim® -(* -¥Œ -, cÚ¡ * -chunk_buf -, -size_t - -chunk_size -,  -have_mÜe -) { - -801 -OCTET_STRING_t - * -¡ - = (OCTET_STRING_ˆ*) -¥Œ -; - -802 cÚ¡ * -chunk_¡Ý - = (cÚ¡ *) -chunk_buf -; - -803 cÚ¡ * -p - = -chunk_¡Ý -; - -804 cÚ¡ * -³nd - = -p - + -chunk_size -; - -805  -þv - = 0; - -806  -h®f - = 0; - -807 -ušt8_t - * -buf -; - -810 -size_t - -Ãw_size - = -¡ --> -size - + ( -chunk_size - + 1) / 2; - -811 * -Ō - = - `REALLOC -( -¡ --> -buf -, -Ãw_size - + 1); - -812 if(! -Ō -)  -1; - -813 -¡ --> -buf - = ( -ušt8_t - *) -Ō -; - -814 -buf - = -¡ -->buà+ st-> -size -; - -821 ; -p - < -³nd -;…++) { - -822  -ch - = *(cÚ¡ *) -p -; - -823  -ch -) { - -830 -þv - = (þv << 4è+ ( -ch - - 0x30); - -834 -þv - = (þv << 4è+ ( -ch - - 0x41 + 10); - -838 -þv - = (þv << 4è+ ( -ch - - 0x61 + 10); - -841 * -buf - = 0; - -844 if( -h®f -++) { - -845 -h®f - = 0; - -846 * -buf -++ = -þv -; - -847 -chunk_¡Ý - = -p - + 1; - -854 if( -h®f -) { - -855 if( -have_mÜe -) { - -860 * -buf -++ = -þv - << 4; - -861 -chunk_¡Ý - = -p -; - -864 -chunk_¡Ý - = -p -; - -867 -¡ --> -size - = -buf - - st->buf; - -868 - `as£¹ -( -¡ --> -size - <ð -Ãw_size -); - -869 -¡ --> -buf -[¡-> -size -] = 0; - -871  ( -chunk_¡Ý - - (cÚ¡ *) -chunk_buf -); - -872 - } -} - -877  -ssize_t - - $OCTET_STRING__cÚv”t_bš¬y -(* -¥Œ -, cÚ¡ * -chunk_buf -, -size_t - -chunk_size -,  -have_mÜe -) { - -878 -BIT_STRING_t - * -¡ - = (BIT_STRING_ˆ*) -¥Œ -; - -879 cÚ¡ * -p - = (cÚ¡ *) -chunk_buf -; - -880 cÚ¡ * -³nd - = -p - + -chunk_size -; - -881  -b™s_unu£d - = -¡ -->bits_unused & 0x7; - -882 -ušt8_t - * -buf -; - -885 -size_t - -Ãw_size - = -¡ --> -size - + ( -chunk_size - + 7) / 8; - -886 * -Ō - = - `REALLOC -( -¡ --> -buf -, -Ãw_size - + 1); - -887 if(! -Ō -)  -1; - -888 -¡ --> -buf - = ( -ušt8_t - *) -Ō -; - -889 -buf - = -¡ -->buà+ st-> -size -; - -891 () -have_mÜe -; - -893 if( -b™s_unu£d - == 0) - -894 -b™s_unu£d - = 8; - -895 if( -¡ --> -size -) - -896 -buf ---; - -901 ; -p - < -³nd -;…++) { - -902  -ch - = *(cÚ¡ *) -p -; - -903  -ch -) { - -910 if( -b™s_unu£d --- <= 0) { - -911 *++ -buf - = 0; - -912 -b™s_unu£d - = 7; - -914 * -buf - |ð( -ch -&1è<< -b™s_unu£d -; - -917 -¡ --> -b™s_unu£d - = bits_unused; - -922 if( -b™s_unu£d - == 8) { - -923 -¡ --> -size - = -buf - - st->buf; - -924 -¡ --> -b™s_unu£d - = 0; - -926 -¡ --> -size - = -buf - - st->buf + 1; - -927 -¡ --> -b™s_unu£d - = bits_unused; - -930 - `as£¹ -( -¡ --> -size - <ð -Ãw_size -); - -931 -¡ --> -buf -[¡-> -size -] = 0; - -933  -chunk_size -; - -934 - } -} - -940 - $OS__¡¹ÛÁ -( -ba£ -, cÚ¡ * -buf -, cÚ¡ * -’d -, -št32_t - * -»t_v®ue -) { - -941 cÚ¡ -št32_t - -Ï¡_unicode_cod•ošt - = 0x10ffff; - -942 -št32_t - -v® - = 0; - -943 cÚ¡ * -p -; - -945  -p - = -buf -;… < -’d -;…++) { - -946  -ch - = * -p -; - -948  -ch -) { - -951 -v® - = v® * -ba£ - + ( -ch - - 0x30); - -955 -v® - = v® * -ba£ - + ( -ch - - 0x41 + 10); - -959 -v® - = v® * -ba£ - + ( -ch - - 0x61 + 10); - -962 * -»t_v®ue - = -v® -; - -963  ( -p - - -buf -) + 1; - -969 if( -v® - > -Ï¡_unicode_cod•ošt -) { - -974 * -»t_v®ue - = -1; - -975  ( -p - - -buf -); - -976 - } -} - -981  -ssize_t - - -982 - $OCTET_STRING__cÚv”t_’Œefs -(* -¥Œ -, cÚ¡ * -chunk_buf -, - -983 -size_t - -chunk_size -,  -have_mÜe -) { - -984 -OCTET_STRING_t - * -¡ - = (OCTET_STRING_ˆ*) -¥Œ -; - -985 cÚ¡ * -p - = (cÚ¡ *) -chunk_buf -; - -986 cÚ¡ * -³nd - = -p - + -chunk_size -; - -987 -ušt8_t - * -buf -; - -990 -size_t - -Ãw_size - = -¡ --> -size - + -chunk_size -; - -991 * -Ō - = - `REALLOC -( -¡ --> -buf -, -Ãw_size - + 1); - -992 if(! -Ō -)  -1; - -993 -¡ --> -buf - = ( -ušt8_t - *) -Ō -; - -994 -buf - = -¡ -->buà+ st-> -size -; - -999 ; -p - < -³nd -;…++) { - -1000  -ch - = *(cÚ¡ *) -p -; - -1001  -Ën -; - -1003 if( -ch - != 0x26 ) { - -1004 * -buf -++ = -ch -; - -1011 -Ën - = -chunk_size - - ( -p - - (cÚ¡ *) -chunk_buf -); - -1012 if( -Ën - =ð1 )  -wªt_mÜe -; - -1013 if( -p -[1] == 0x23 ) { - -1014 cÚ¡ * -pv® -; - -1015 -št32_t - -v® - = 0; - -1016  -ba£ -; - -1018 if( -Ën - =ð2 )  -wªt_mÜe -; - -1019 if( -p -[2] == 0x78 ) - -1020 -pv® - = -p - + 3, -ba£ - = 16; - -1022 -pv® - = -p - + 2, -ba£ - = 10; - -1023 -Ën - = - `OS__¡¹ÛÁ -( -ba£ -, -pv® -, -p - +†’, & -v® -); - -1024 if( -Ën - == -1) { - -1026 * -buf -++ = -ch -; - -1029 if(! -Ën - || -pv® -[Ën-1] !ð0x3bè -wªt_mÜe -; - -1030 - `as£¹ -( -v® - > 0); - -1031 -p - +ð( -pv® - -…è+ -Ën - - 1; - -1033 if( -v® - < 0x80) { - -1034 * -buf -++ = () -v® -; - -1035 } if( -v® - < 0x800) { - -1036 * -buf -++ = 0xc0 | (( -v® - >> 6)); - -1037 * -buf -++ = 0x80 | (( -v® - & 0x3f)); - -1038 } if( -v® - < 0x10000) { - -1039 * -buf -++ = 0xe0 | (( -v® - >> 12)); - -1040 * -buf -++ = 0x80 | (( -v® - >> 6) & 0x3f); - -1041 * -buf -++ = 0x80 | (( -v® - & 0x3f)); - -1042 } if( -v® - < 0x200000) { - -1043 * -buf -++ = 0xf0 | (( -v® - >> 18)); - -1044 * -buf -++ = 0x80 | (( -v® - >> 12) & 0x3f); - -1045 * -buf -++ = 0x80 | (( -v® - >> 6) & 0x3f); - -1046 * -buf -++ = 0x80 | (( -v® - & 0x3f)); - -1047 } if( -v® - < 0x4000000) { - -1048 * -buf -++ = 0xf8 | (( -v® - >> 24)); - -1049 * -buf -++ = 0x80 | (( -v® - >> 18) & 0x3f); - -1050 * -buf -++ = 0x80 | (( -v® - >> 12) & 0x3f); - -1051 * -buf -++ = 0x80 | (( -v® - >> 6) & 0x3f); - -1052 * -buf -++ = 0x80 | (( -v® - & 0x3f)); - -1054 * -buf -++ = 0xfø| (( -v® - >> 30) & 0x1); - -1055 * -buf -++ = 0x80 | (( -v® - >> 24) & 0x3f); - -1056 * -buf -++ = 0x80 | (( -v® - >> 18) & 0x3f); - -1057 * -buf -++ = 0x80 | (( -v® - >> 12) & 0x3f); - -1058 * -buf -++ = 0x80 | (( -v® - >> 6) & 0x3f); - -1059 * -buf -++ = 0x80 | (( -v® - & 0x3f)); - -1065 * -sc - = (*) - `memchr -( -p -, 0x3b, -Ën - > 5 ? 5 :†en); - -1066 if(! -sc -è -wªt_mÜe -; - -1067 if(( -sc - - -p -) == 4 - -1068 && -p -[1] == 0x61 - -1069 && -p -[2] == 0x6d - -1070 && -p -[3] == 0x70 ) { - -1071 * -buf -++ = 0x26; - -1072 -p - = -sc -; - -1075 if(( -sc - - -p -) == 3) { - -1076 if( -p -[1] == 0x6c) { - -1077 * -buf - = 0x3c; - -1078 } if( -p -[1] == 0x67) { - -1079 * -buf - = 0x3e; - -1082 * -buf -++ = -ch -; - -1085 if( -p -[2] != 0x74) { - -1087 * -buf -++ = -ch -; - -1090 -buf -++; - -1091 -p - = -sc -; - -1095 * -buf -++ = -ch -; - -1099 -wªt_mÜe -: - -1100 if( -have_mÜe -) { - -1105 * -buf -++ = -ch -; - -1108 -chunk_size - = ( -p - - (cÚ¡ *) -chunk_buf -); - -1113 -¡ --> -size - = -buf - - st->buf; - -1114 - `as£¹ -( -¡ --> -size - <ð -Ãw_size -); - -1115 -¡ --> -buf -[¡-> -size -] = 0; - -1117  -chunk_size -; - -1118 - } -} - -1123  -a¢_dec_rv®_t - - -1124 - $OCTET_STRING__decode_x” -( - -1125 cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1126 ** -¥Œ -, cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, -size_t - -size -, - -1127 (* -Ýt_uÃx³ùed_g_decod” -)(* -¡ruù_±r -, cÚ¡ * -chunk_buf -, - -1128 -size_t - -chunk_size -), - -1129 - $ssize_t - (* -body_»ûiv” -)(* -¡ruù_±r -, cÚ¡ * -chunk_buf -, - -1130 -size_t - -chunk_size -,  -have_mÜe -)) { - -1131 -OCTET_STRING_t - * -¡ - = (OCTET_STRING_ˆ*)* -¥Œ -; - -1132 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics - - -1133 ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *) -td --> -¥ecifics - - -1134 : & -a¢_SPC_OCTET_STRING_¥ecs -; - -1135 cÚ¡ * -xml_g - = -Ýt_mÇme - ? o±_mÇm: -td -->xml_tag; - -1136 -a¢_¡ruù_ùx_t - * -ùx -; - -1137 -a¢_dec_rv®_t - -rv® -; - -1138  -¡_®loÿ‹d -; - -1143 if(! -¡ -) { - -1144 -¡ - = ( -OCTET_STRING_t - *) - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -1145 * -¥Œ - = (*) -¡ -; - -1146 if(! -¡ -è -¡a_çžed -; - -1147 -¡_®loÿ‹d - = 1; - -1149 -¡_®loÿ‹d - = 0; - -1151 if(! -¡ --> -buf -) { - -1153 -¡ --> -buf - = ( -ušt8_t - *) - `CALLOC -(1, 1); - -1154 if(! -¡ --> -buf -) { - -1155 if( -¡_®loÿ‹d -) { - -1156 * -¥Œ - = 0; - -1157  -¡b_çžed -; - -1159  -¡a_çžed -; - -1165 -ùx - = ( -a¢_¡ruù_ùx_t - *)(((*)* -¥Œ -è+ -¥ecs --> -ùx_off£t -); - -1167  - `x”_decode_g’”® -( -Ýt_codec_ùx -, -ùx -, * -¥Œ -, -xml_g -, - -1168 -buf_±r -, -size -, -Ýt_uÃx³ùed_g_decod” -, -body_»ûiv” -); - -1170 -¡b_çžed -: - -1171 - `FREEMEM -( -¡ -); - -1172 -¡a_çžed -: - -1173 -rv® -. -code - = -RC_FAIL -; - -1174 -rv® -. -cÚsumed - = 0; - -1175  -rv® -; - -1176 - } -} - -1181 -a¢_dec_rv®_t - - -1182 - $OCTET_STRING_decode_x”_hex -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -1183 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -1184 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, - -1185 -size_t - -size -) { - -1186  - `OCTET_STRING__decode_x” -( -Ýt_codec_ùx -, -td -, -¥Œ -, -Ýt_mÇme -, - -1187 -buf_±r -, -size -, 0, -OCTET_STRING__cÚv”t_hexadecim® -); - -1188 - } -} - -1193 -a¢_dec_rv®_t - - -1194 - $OCTET_STRING_decode_x”_bš¬y -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -1195 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -1196 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, - -1197 -size_t - -size -) { - -1198  - `OCTET_STRING__decode_x” -( -Ýt_codec_ùx -, -td -, -¥Œ -, -Ýt_mÇme -, - -1199 -buf_±r -, -size -, 0, -OCTET_STRING__cÚv”t_bš¬y -); - -1200 - } -} - -1205 -a¢_dec_rv®_t - - -1206 - $OCTET_STRING_decode_x”_utf8 -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -1207 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -1208 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, - -1209 -size_t - -size -) { - -1210  - `OCTET_STRING__decode_x” -( -Ýt_codec_ùx -, -td -, -¥Œ -, -Ýt_mÇme -, - -1211 -buf_±r -, -size -, - -1212 -OCTET_STRING__hªdË_cڌÞ_ch¬s -, - -1213 -OCTET_STRING__cÚv”t_’Œefs -); - -1214 - } -} - -1216 #iâdeà -ASN_DISABLE_PER_SUPPORT - - -1219 - $OCTET_STRING_³r_g‘_ch¬aù”s -( -a¢_³r_d©a_t - * -po -, -ušt8_t - * -buf -, - -1220 -size_t - -un™s -,  -bpc -,  -un™_b™s -, - -1221  -lb -,  -ub -, cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -pc -) { - -1222 -ušt8_t - * -’d - = -buf - + -un™s - * -bpc -; - -1224 - `ASN_DEBUG -("Expanding %d characters into (%ld..%ld):%d", - -1225 () -un™s -, -lb -, -ub -, -un™_b™s -); - -1228 if(() -ub - <ð(()2 << ( -un™_b™s - - 1))) { - -1230 -lb - = 0; - -1231 } if( -pc - &&…c-> -code2v®ue -) { - -1232 if( -un™_b™s - > 16) - -1236 ; -buf - < -’d -; buà+ð -bpc -) { - -1237  -v®ue -; - -1238  -code - = - `³r_g‘_ãw_b™s -( -po -, -un™_b™s -); - -1239 if( -code - < 0)  -1; - -1240 -v®ue - = -pc --> - `code2v®ue -( -code -); - -1241 if( -v®ue - < 0) { - -1242 - `ASN_DEBUG -("Code %d (0x%02x) is" - -1244 -code -, code, -lb -, -ub -); - -1247  -bpc -) { - -1248 1: * -buf - = -v®ue -; ; - -1249 2: -buf -[0] = -v®ue - >> 8; buf[1] = value; ; - -1250 4: -buf -[0] = -v®ue - >> 24; buf[1] = value >> 16; - -1251 -buf -[2] = -v®ue - >> 8; buf[3] = value; ; - -1258 if( -lb - =ð0 && ( -un™_b™s - =ð8 * -bpc -)) { - -1259  - `³r_g‘_mªy_b™s -( -po -, -buf -, 0, -un™_b™s - * -un™s -); - -1262 ; -buf - < -’d -; buà+ð -bpc -) { - -1263 -št32_t - -code - = - `³r_g‘_ãw_b™s -( -po -, -un™_b™s -); - -1264 -št32_t - -ch - = -code - + -lb -; - -1265 if( -code - < 0)  -1; - -1266 if( -ch - > -ub -) { - -1267 - `ASN_DEBUG -("Code %d is out of„ange (%ld..%ld)", - -1268 -ch -, -lb -, -ub -); - -1271  -bpc -) { - -1272 1: * -buf - = -ch -; ; - -1273 2: -buf -[0] = -ch - >> 8; buf[1] = ch; ; - -1274 4: -buf -[0] = -ch - >> 24; buf[1] = ch >> 16; - -1275 -buf -[2] = -ch - >> 8; buf[3] = ch; ; - -1280 - } -} - -1283 - $OCTET_STRING_³r_put_ch¬aù”s -( -a¢_³r_ou_t - * -po -, cÚ¡ -ušt8_t - * -buf -, - -1284 -size_t - -un™s -,  -bpc -,  -un™_b™s -, - -1285  -lb -,  -ub -, cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -pc -) { - -1286 cÚ¡ -ušt8_t - * -’d - = -buf - + -un™s - * -bpc -; - -1288 - `ASN_DEBUG -("Squeezing %d characters into (%ld..%ld):%d (%d bpc)", - -1289 () -un™s -, -lb -, -ub -, -un™_b™s -, -bpc -); - -1292 if(() -ub - <ð(()2 << ( -un™_b™s - - 1))) { - -1294 -lb - = 0; - -1295 } if( -pc - &&…c-> -v®ue2code -) { - -1296 ; -buf - < -’d -; buà+ð -bpc -) { - -1297  -code -; - -1298 -ušt32_t - -v®ue -; - -1299  -bpc -) { - -1300 1: -v®ue - = *(cÚ¡ -ušt8_t - *) -buf -; ; - -1301 2: -v®ue - = ( -buf -[0] << 8) | buf[1]; ; - -1302 4: -v®ue - = ( -buf -[0] << 24) | (buf[1] << 16) - -1303 | ( -buf -[2] << 8) | buf[3]; ; - -1306 -code - = -pc --> - `v®ue2code -( -v®ue -); - -1307 if( -code - < 0) { - -1308 - `ASN_DEBUG -("Character %d (0x%02x) is" - -1310 * -buf -, *buf, -lb -, -ub -); - -1313 if( - `³r_put_ãw_b™s -( -po -, -code -, -un™_b™s -)) - -1319 if( -lb - =ð0 && ( -un™_b™s - =ð8 * -bpc -)) { - -1320  - `³r_put_mªy_b™s -( -po -, -buf -, -un™_b™s - * -un™s -); - -1323  -ub - -ð -lb -; -buf - < -’d -; buà+ð -bpc -) { - -1324  -ch -; - -1325 -ušt32_t - -v®ue -; - -1326  -bpc -) { - -1328 -v®ue - = *(cÚ¡ -ušt8_t - *) -buf -; - -1331 -v®ue - = ( -buf -[0] << 8) | buf[1]; - -1334 -v®ue - = ( -buf -[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; - -1339 -ch - = -v®ue - - -lb -; - -1340 if( -ch - < 0 || ch > -ub -) { - -1341 - `ASN_DEBUG -("Ch¬aù” %d (0x%02xèi ouˆoà¿ng(%ld..%ld)", * -buf -, - -1342 -v®ue -, -lb -, -ub - +†b); - -1345 if( - `³r_put_ãw_b™s -( -po -, -ch -, -un™_b™s -))  -1; - -1349 - } -} - -1351  -a¢_³r_cÚ¡¿šts_t - - ga¢_DEF_OCTET_STRING_cÚ¡¿šts - = { - -1352 { -APC_CONSTRAINED -, 8, 8, 0, 255 }, - -1353 { -APC_SEMI_CONSTRAINED -, -1, -1, 0, 0 }, - -1357 -a¢_dec_rv®_t - - -1358 - $OCTET_STRING_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -1359 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1360 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -1361 -a¢_³r_d©a_t - * -pd -) { - -1362 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics - - -1363 ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *) -td --> -¥ecifics - - -1364 : & -a¢_SPC_OCTET_STRING_¥ecs -; - -1365 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -pc - = - -1366 -cÚ¡¿šts - ? cÚ¡¿št : -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -; - -1367 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -cv® -; - -1368 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -csiz -; - -1369 -a¢_dec_rv®_t - -rv® - = { -RC_OK -, 0 }; - -1370 -OCTET_STRING_t - * -¡ - = (OCTET_STRING_ˆ*)* -¥Œ -; - -1371 -ssize_t - -cÚsumed_my£lf - = 0; - -1372  -»³© -; - -1374 -OS__BPC_CHAR - = 1, - -1375 -OS__BPC_U16 - = 2, - -1376 -OS__BPC_U32 - = 4 - -1377 } -bpc -; - -1378  -un™_b™s -; - -1379  -ÿnÚiÿl_un™_b™s -; - -1381 () -Ýt_codec_ùx -; - -1383 if( -pc -) { - -1384 -cv® - = & -pc --> -v®ue -; - -1385 -csiz - = & -pc --> -size -; - -1387 -cv® - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -v®ue -; - -1388 -csiz - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -size -; - -1391  -¥ecs --> -subv¬ŸÁ -) { - -1393  -ASN_OSUBV_ANY -: - -1394  -ASN_OSUBV_BIT -: - -1395 - `ASN_DEBUG -("UÄecognized subv¬ŸÁ %d", -¥ecs --> -subv¬ŸÁ -); - -1396 - `RETURN -( -RC_FAIL -); - -1398  -ASN_OSUBV_STR -: - -1399 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 8; - -1400 if( -cv® --> -æags - & -APC_CONSTRAINED -) - -1401 -un™_b™s - = -cv® --> -¿nge_b™s -; - -1402 -bpc - = -OS__BPC_CHAR -; - -1404  -ASN_OSUBV_U16 -: - -1405 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 16; - -1406 if( -cv® --> -æags - & -APC_CONSTRAINED -) - -1407 -un™_b™s - = -cv® --> -¿nge_b™s -; - -1408 -bpc - = -OS__BPC_U16 -; - -1410  -ASN_OSUBV_U32 -: - -1411 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 32; - -1412 if( -cv® --> -æags - & -APC_CONSTRAINED -) - -1413 -un™_b™s - = -cv® --> -¿nge_b™s -; - -1414 -bpc - = -OS__BPC_U32 -; - -1421 if(! -¡ -) { - -1422 -¡ - = ( -OCTET_STRING_t - *)(* -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -)); - -1423 if(! -¡ -è - `RETURN -( -RC_FAIL -); - -1426 - `ASN_DEBUG -("PER Decoding %s size %ld .. %ld bits %d", - -1427 -csiz --> -æags - & -APC_EXTENSIBLE - ? "extensible" : "non-extensible", - -1428 -csiz --> -low”_bound -, csiz-> -uµ”_bound -, csiz-> -efãùive_b™s -); - -1430 if( -csiz --> -æags - & -APC_EXTENSIBLE -) { - -1431  -šext - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -1432 if( -šext - < 0è - `RETURN -( -RC_WMORE -); - -1433 if( -šext -) { - -1434 -csiz - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -size -; - -1435 -un™_b™s - = -ÿnÚiÿl_un™_b™s -; - -1439 if( -csiz --> -efãùive_b™s - >= 0) { - -1440 - `FREEMEM -( -¡ --> -buf -); - -1441 if( -bpc -) { - -1442 -¡ --> -size - = -csiz --> -uµ”_bound - * -bpc -; - -1444 -¡ --> -size - = ( -csiz --> -uµ”_bound - + 7) >> 3; - -1446 -¡ --> -buf - = ( -ušt8_t - *) - `MALLOC -(¡-> -size - + 1); - -1447 if(! -¡ --> -buf -è{ st-> -size - = 0; - `RETURN -( -RC_FAIL -); } - -1453 if( -csiz --> -efãùive_b™s - == 0) { - -1454  -»t -; - -1455 if( -bpc -) { - -1456 - `ASN_DEBUG -("Encoding OCTET STRING size %ld", - -1457 -csiz --> -uµ”_bound -); - -1458 -»t - = - `OCTET_STRING_³r_g‘_ch¬aù”s -( -pd -, -¡ --> -buf -, - -1459 -csiz --> -uµ”_bound -, -bpc -, -un™_b™s -, - -1460 -cv® --> -low”_bound -, cv®-> -uµ”_bound -, -pc -); - -1461 if( -»t - > 0è - `RETURN -( -RC_FAIL -); - -1463 - `ASN_DEBUG -("Encoding BIT STRING size %ld", - -1464 -csiz --> -uµ”_bound -); - -1465 -»t - = - `³r_g‘_mªy_b™s -( -pd -, -¡ --> -buf -, 0, - -1466 -un™_b™s - * -csiz --> -uµ”_bound -); - -1468 if( -»t - < 0è - `RETURN -( -RC_WMORE -); - -1469 -cÚsumed_my£lf - +ð -un™_b™s - * -csiz --> -uµ”_bound -; - -1470 -¡ --> -buf -[¡-> -size -] = 0; - -1471 - `RETURN -( -RC_OK -); - -1474 -¡ --> -size - = 0; - -1476 -ssize_t - -¿w_Ën -; - -1477 -ssize_t - -Ën_by‹s -; - -1478 * -p -; - -1479  -»t -; - -1482 -¿w_Ën - = - `u³r_g‘_Ëngth -( -pd -, -csiz --> -efãùive_b™s -, csiz-> -low”_bound -, - -1483 & -»³© -); - -1484 if( -¿w_Ën - < 0è - `RETURN -( -RC_WMORE -); - -1485 if( -¿w_Ën - =ð0 && -¡ --> -buf -) ; - -1487 - `ASN_DEBUG -("Got PER†engthƒb %ld,†en %ld, %s (%s)", - -1488 () -csiz --> -efãùive_b™s -, () -¿w_Ën -, - -1489 -»³© - ? "»³©" : "Úû", -td --> -Çme -); - -1490 -Ën_by‹s - = -¿w_Ën - * -bpc -; - -1491 -p - = - `REALLOC -( -¡ --> -buf -, st-> -size - + -Ën_by‹s - + 1); - -1492 if(! -p -è - `RETURN -( -RC_FAIL -); - -1493 -¡ --> -buf - = ( -ušt8_t - *) -p -; - -1495 -»t - = - `OCTET_STRING_³r_g‘_ch¬aù”s -( -pd -, & -¡ --> -buf -[¡-> -size -], -¿w_Ën -, - -1496 -bpc -, -un™_b™s -, -cv® --> -low”_bound -, - -1497 -cv® --> -uµ”_bound -, -pc -); - -1498 if( -»t - > 0è - `RETURN -( -RC_FAIL -); - -1499 if( -»t - < 0è - `RETURN -( -RC_WMORE -); - -1500 -¡ --> -size - +ð -Ën_by‹s -; - -1501 }  -»³© -); - -1502 -¡ --> -buf -[¡-> -size -] = 0; - -1504  -rv® -; - -1505 - } -} - -1507 -a¢_’c_rv®_t - - -1508 - $OCTET_STRING_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1509 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -1510 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -1511 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics - - -1512 ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *) -td --> -¥ecifics - - -1513 : & -a¢_SPC_OCTET_STRING_¥ecs -; - -1514 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -pc - = -cÚ¡¿šts - ? constraints - -1515 : -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -; - -1516 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -cv® -; - -1517 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -csiz -; - -1518 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -1519 -a¢_’c_rv®_t - -” - = { 0, 0, 0 }; - -1520  -šext - = 0; - -1521  -un™_b™s -; - -1522  -ÿnÚiÿl_un™_b™s -; - -1523 -size_t - -size_š_un™s -; - -1524 cÚ¡ -ušt8_t - * -buf -; - -1525  -»t -; - -1527 -OS__BPC_CHAR - = 1, - -1528 -OS__BPC_U16 - = 2, - -1529 -OS__BPC_U32 - = 4 - -1530 } -bpc -; - -1531  -ù_ex‹nsibË -; - -1533 if(! -¡ - || (!¡-> -buf - && st-> -size -)) - -1534 -ASN__ENCODE_FAILED -; - -1536 if( -pc -) { - -1537 -cv® - = & -pc --> -v®ue -; - -1538 -csiz - = & -pc --> -size -; - -1540 -cv® - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -v®ue -; - -1541 -csiz - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -size -; - -1543 -ù_ex‹nsibË - = -csiz --> -æags - & -APC_EXTENSIBLE -; - -1545  -¥ecs --> -subv¬ŸÁ -) { - -1547  -ASN_OSUBV_ANY -: - -1548  -ASN_OSUBV_BIT -: - -1549 -ASN__ENCODE_FAILED -; - -1550  -ASN_OSUBV_STR -: - -1551 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 8; - -1552 if( -cv® --> -æags - & -APC_CONSTRAINED -) - -1553 -un™_b™s - = -cv® --> -¿nge_b™s -; - -1554 -bpc - = -OS__BPC_CHAR -; - -1555 -size_š_un™s - = -¡ --> -size -; - -1557  -ASN_OSUBV_U16 -: - -1558 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 16; - -1559 if( -cv® --> -æags - & -APC_CONSTRAINED -) - -1560 -un™_b™s - = -cv® --> -¿nge_b™s -; - -1561 -bpc - = -OS__BPC_U16 -; - -1562 -size_š_un™s - = -¡ --> -size - >> 1; - -1563 if( -¡ --> -size - & 1) { - -1564 - `ASN_DEBUG -("% ¡ršg sizi nÙ modulØ2", -td --> -Çme -); - -1565 -ASN__ENCODE_FAILED -; - -1568  -ASN_OSUBV_U32 -: - -1569 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 32; - -1570 if( -cv® --> -æags - & -APC_CONSTRAINED -) - -1571 -un™_b™s - = -cv® --> -¿nge_b™s -; - -1572 -bpc - = -OS__BPC_U32 -; - -1573 -size_š_un™s - = -¡ --> -size - >> 2; - -1574 if( -¡ --> -size - & 3) { - -1575 - `ASN_DEBUG -("% ¡ršg sizi nÙ modulØ4", -td --> -Çme -); - -1576 -ASN__ENCODE_FAILED -; - -1581 - `ASN_DEBUG -("Encodšg % štØ%" -ASN_PRI_SIZE - " units of %d bits" - -1583 -td --> -Çme -, -size_š_un™s -, -un™_b™s -, - -1584 -csiz --> -low”_bound -, csiz-> -uµ”_bound -, - -1585 -csiz --> -efãùive_b™s -, -ù_ex‹nsibË - ? " EXT" : ""); - -1589 if( -csiz --> -efãùive_b™s - >= 0) { - -1590 if(( -ssize_t -) -size_š_un™s - < -csiz --> -low”_bound - - -1591 || ( -ssize_t -) -size_š_un™s - > -csiz --> -uµ”_bound -) { - -1592 if( -ù_ex‹nsibË -) { - -1593 -csiz - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -size -; - -1594 -un™_b™s - = -ÿnÚiÿl_un™_b™s -; - -1595 -šext - = 1; - -1597 -ASN__ENCODE_FAILED -; - -1601 -šext - = 0; - -1604 if( -ù_ex‹nsibË -) { - -1606 if( - `³r_put_ãw_b™s -( -po -, -šext -, 1)) - -1607 -ASN__ENCODE_FAILED -; - -1610 if( -csiz --> -efãùive_b™s - >ð0 && ! -šext -) { - -1611 - `ASN_DEBUG -("Encodšg %" -ASN_PRI_SIZE - " by‹ (%ld),†’gth iÀ%d b™s", -¡ --> -size -, - -1612 -size_š_un™s - - -csiz --> -low”_bound -, csiz-> -efãùive_b™s -); - -1613 -»t - = - `³r_put_ãw_b™s -( -po -, -size_š_un™s - - -csiz --> -low”_bound -, - -1614 -csiz --> -efãùive_b™s -); - -1615 if( -»t -è -ASN__ENCODE_FAILED -; - -1616 -»t - = - `OCTET_STRING_³r_put_ch¬aù”s -( -po -, -¡ --> -buf -, -size_š_un™s -, -bpc -, - -1617 -un™_b™s -, -cv® --> -low”_bound -, - -1618 -cv® --> -uµ”_bound -, -pc -); - -1619 if( -»t -è -ASN__ENCODE_FAILED -; - -1620 - `ASN__ENCODED_OK -( -” -); - -1623 - `ASN_DEBUG -("Encodšg %" -ASN_PRI_SIZE - " by‹s", -¡ --> -size -); - -1625 -buf - = -¡ -->buf; - -1626 - `ASN_DEBUG -("Encodšg %" -ASN_PRI_SIZE - " iÀun™s", -size_š_un™s -); - -1628  -Ãed_eom - = 0; - -1629 -ssize_t - -may_§ve - = - `u³r_put_Ëngth -( -po -, -size_š_un™s -, & -Ãed_eom -); - -1630 if( -may_§ve - < 0è -ASN__ENCODE_FAILED -; - -1632 - `ASN_DEBUG -("Encodšg %" -ASN_PRI_SSIZE - " oà%" -ASN_PRI_SIZE - "%s", -may_§ve -, -size_š_un™s -, - -1633 -Ãed_eom - ? ",+EOM" : ""); - -1635 -»t - = - `OCTET_STRING_³r_put_ch¬aù”s -( -po -, -buf -, -may_§ve -, -bpc -, -un™_b™s -, - -1636 -cv® --> -low”_bound -, - -1637 -cv® --> -uµ”_bound -, -pc -); - -1638 if( -»t -è -ASN__ENCODE_FAILED -; - -1640 -buf - +ð -may_§ve - * -bpc -; - -1641 -size_š_un™s - -ð -may_§ve -; - -1642 - `as£¹ -(!( -may_§ve - & 0x07è|| ! -size_š_un™s -); - -1643 if( -Ãed_eom - && - `u³r_put_Ëngth -( -po -, 0, 0)) - -1644 -ASN__ENCODE_FAILED -; - -1645 }  -size_š_un™s -); - -1647 - `ASN__ENCODED_OK -( -” -); - -1648 - } -} - -1650 -a¢_dec_rv®_t - - -1651 - $OCTET_STRING_decode_­” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -1652 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1653 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -1654 ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -1656 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics - - -1657 ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *) -td --> -¥ecifics - - -1658 : & -a¢_SPC_OCTET_STRING_¥ecs -; - -1659 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -pc - = -cÚ¡¿šts - ? constraints - -1660 : -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -; - -1661 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -cv® -; - -1662 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -csiz -; - -1663 -a¢_dec_rv®_t - -rv® - = { -RC_OK -, 0 }; - -1664 -BIT_STRING_t - * -¡ - = (BIT_STRING_ˆ*)* -¥Œ -; - -1665 -ssize_t - -cÚsumed_my£lf - = 0; - -1666  -»³© -; - -1668 -OS__BPC_BIT - = 0, - -1669 -OS__BPC_CHAR - = 1, - -1670 -OS__BPC_U16 - = 2, - -1671 -OS__BPC_U32 - = 4 - -1672 } -bpc -; - -1673  -un™_b™s -; - -1674  -ÿnÚiÿl_un™_b™s -; - -1676 () -Ýt_codec_ùx -; - -1678 if( -pc -) { - -1679 -cv® - = & -pc --> -v®ue -; - -1680 -csiz - = & -pc --> -size -; - -1682 -cv® - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -v®ue -; - -1683 -csiz - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -size -; - -1686  -¥ecs --> -subv¬ŸÁ -) { - -1692  -ASN_OSUBV_BIT -: - -1693 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 1; - -1694 -bpc - = -OS__BPC_BIT -; - -1696  -ASN_OSUBV_ANY -: - -1697  -ASN_OSUBV_STR -: - -1698 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 8; - -1702 -bpc - = -OS__BPC_CHAR -; - -1704  -ASN_OSUBV_U16 -: - -1705 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 16; - -1706 if( -cv® --> -æags - & -APC_CONSTRAINED -) - -1707 -un™_b™s - = -cv® --> -¿nge_b™s -; - -1708 -bpc - = -OS__BPC_U16 -; - -1710  -ASN_OSUBV_U32 -: - -1711 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 32; - -1712 if( -cv® --> -æags - & -APC_CONSTRAINED -) - -1713 -un™_b™s - = -cv® --> -¿nge_b™s -; - -1714 -bpc - = -OS__BPC_U32 -; - -1721 if(! -¡ -) { - -1722 -¡ - = ( -BIT_STRING_t - *)(* -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -)); - -1723 if(! -¡ -è - `RETURN -( -RC_FAIL -); - -1726 - `ASN_DEBUG -("PER Decoding %s size %ld .. %ld bits %d", - -1727 -csiz --> -æags - & -APC_EXTENSIBLE - ? "extensible" : "non-extensible", - -1728 -csiz --> -low”_bound -, csiz-> -uµ”_bound -, csiz-> -efãùive_b™s -); - -1730 if( -csiz --> -æags - & -APC_EXTENSIBLE -) { - -1731  -šext - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -1732 if( -šext - < 0è - `RETURN -( -RC_WMORE -); - -1733 if( -šext -) { - -1734 -csiz - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -size -; - -1735 -cv® - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -v®ue -; - -1736 -un™_b™s - = -ÿnÚiÿl_un™_b™s -; - -1740 if( -csiz --> -efãùive_b™s - >= 0) { - -1741 - `FREEMEM -( -¡ --> -buf -); - -1742 if( -bpc -) { - -1743 -¡ --> -size - = -csiz --> -uµ”_bound - * -bpc -; - -1745 -¡ --> -size - = ( -csiz --> -uµ”_bound - + 7) >> 3; - -1747 -¡ --> -buf - = ( -ušt8_t - *) - `MALLOC -(¡-> -size - + 1); - -1748 if(! -¡ --> -buf -è{ st-> -size - = 0; - `RETURN -( -RC_FAIL -); } - -1754 if( -csiz --> -efãùive_b™s - == 0) { - -1755  -»t -; - -1756 ià( -¡ --> -size - > 2) { - -1757 ià( - `­”_g‘_®ign -( -pd -) < 0) - -1758 - `RETURN -( -RC_FAIL -); - -1760 if( -bpc -) { - -1761 - `ASN_DEBUG -("Decoding OCTET STRING size %ld", - -1762 -csiz --> -uµ”_bound -); - -1763 -»t - = - `OCTET_STRING_³r_g‘_ch¬aù”s -( -pd -, -¡ --> -buf -, - -1764 -csiz --> -uµ”_bound -, -bpc -, -un™_b™s -, - -1765 -cv® --> -low”_bound -, cv®-> -uµ”_bound -, -pc -); - -1766 if( -»t - > 0è - `RETURN -( -RC_FAIL -); - -1768 - `ASN_DEBUG -("Decoding BIT STRING size %ld", - -1769 -csiz --> -uµ”_bound -); - -1770 -»t - = - `³r_g‘_mªy_b™s -( -pd -, -¡ --> -buf -, 0, - -1771 -un™_b™s - * -csiz --> -uµ”_bound -); - -1773 if( -»t - < 0è - `RETURN -( -RC_WMORE -); - -1774 -cÚsumed_my£lf - +ð -un™_b™s - * -csiz --> -uµ”_bound -; - -1775 -¡ --> -buf -[¡-> -size -] = 0; - -1776 if( -bpc - == 0) { - -1777  -ubs - = ( -csiz --> -uµ”_bound - & 0x7); - -1778 -¡ --> -b™s_unu£d - = -ubs - ? 8 - ubs : 0; - -1780 - `RETURN -( -RC_OK -); - -1783 -¡ --> -size - = 0; - -1785 -ssize_t - -¿w_Ën -; - -1786 -ssize_t - -Ën_by‹s -; - -1787 -ssize_t - -Ën_b™s -; - -1788 * -p -; - -1789  -»t -; - -1792 ià( -csiz --> -uµ”_bound - - csiz-> -low”_bound - == 0) - -1794 -¿w_Ën - = - `­”_g‘_Ëngth -( -pd -, -1, -csiz --> -efãùive_b™s -, & -»³© -); - -1796 -¿w_Ën - = - `­”_g‘_Ëngth -( -pd -, -csiz --> -uµ”_bound - - csiz-> -low”_bound - + 1, csiz-> -efãùive_b™s -, & -»³© -); - -1797 -»³© - = 0; - -1798 if( -¿w_Ën - < 0è - `RETURN -( -RC_WMORE -); - -1799 -¿w_Ën - +ð -csiz --> -low”_bound -; - -1801 - `ASN_DEBUG -("Got PER†engthƒb %ld,†en %ld, %s (%s)", - -1802 () -csiz --> -efãùive_b™s -, () -¿w_Ën -, - -1803 -»³© - ? "»³©" : "Úû", -td --> -Çme -); - -1805 ià( -¿w_Ën - > 2) { - -1806 ià( - `­”_g‘_®ign -( -pd -) < 0) - -1807 - `RETURN -( -RC_FAIL -); - -1810 if( -bpc -) { - -1811 -Ën_by‹s - = -¿w_Ën - * -bpc -; - -1812 -Ën_b™s - = -Ën_by‹s - * -un™_b™s -; - -1814 -Ën_b™s - = -¿w_Ën -; - -1815 -Ën_by‹s - = ( -Ën_b™s - + 7) >> 3; - -1816 if( -Ën_b™s - & 0x7) - -1817 -¡ --> -b™s_unu£d - = 8 - ( -Ën_b™s - & 0x7); - -1820 -p - = - `REALLOC -( -¡ --> -buf -, st-> -size - + -Ën_by‹s - + 1); - -1821 if(! -p -è - `RETURN -( -RC_FAIL -); - -1822 -¡ --> -buf - = ( -ušt8_t - *) -p -; - -1824 if( -bpc -) { - -1825 -»t - = - `OCTET_STRING_³r_g‘_ch¬aù”s -( -pd -, - -1826 & -¡ --> -buf -[¡-> -size -], -¿w_Ën -, -bpc -, -un™_b™s -, - -1827 -cv® --> -low”_bound -, cv®-> -uµ”_bound -, -pc -); - -1828 if( -»t - > 0è - `RETURN -( -RC_FAIL -); - -1830 -»t - = - `³r_g‘_mªy_b™s -( -pd -, & -¡ --> -buf -[¡-> -size -], - -1831 0, -Ën_b™s -); - -1833 if( -»t - < 0è - `RETURN -( -RC_WMORE -); - -1834 -¡ --> -size - +ð -Ën_by‹s -; - -1835 }  -»³© -); - -1836 -¡ --> -buf -[¡-> -size -] = 0; - -1838  -rv® -; - -1839 - } -} - -1841 -a¢_’c_rv®_t - - -1842 - $OCTET_STRING_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1843 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -1844 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -1846 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics - - -1847 ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *) -td --> -¥ecifics - - -1848 : & -a¢_SPC_OCTET_STRING_¥ecs -; - -1849 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -pc - = -cÚ¡¿šts - ? constraints - -1850 : -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -; - -1851 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -cv® -; - -1852 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -csiz -; - -1853 cÚ¡ -BIT_STRING_t - * -¡ - = (cÚ¡ BIT_STRING_ˆ*) -¥Œ -; - -1854 -a¢_’c_rv®_t - -” - = { 0, 0, 0 }; - -1855  -šext - = 0; - -1856  -un™_b™s -; - -1857  -ÿnÚiÿl_un™_b™s -; - -1858  -sizešun™s -; - -1859 cÚ¡ -ušt8_t - * -buf -; - -1860  -»t -; - -1862 -OS__BPC_BIT - = 0, - -1863 -OS__BPC_CHAR - = 1, - -1864 -OS__BPC_U16 - = 2, - -1865 -OS__BPC_U32 - = 4 - -1866 } -bpc -; - -1867  -ù_ex‹nsibË -; - -1869 if(! -¡ - || (!¡-> -buf - && st-> -size -)) - -1870 -ASN__ENCODE_FAILED -; - -1872 if( -pc -) { - -1873 -cv® - = & -pc --> -v®ue -; - -1874 -csiz - = & -pc --> -size -; - -1876 -cv® - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -v®ue -; - -1877 -csiz - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -size -; - -1879 -ù_ex‹nsibË - = -csiz --> -æags - & -APC_EXTENSIBLE -; - -1881  -¥ecs --> -subv¬ŸÁ -) { - -1886  -ASN_OSUBV_BIT -: - -1887 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 1; - -1888 -bpc - = -OS__BPC_BIT -; - -1889 -sizešun™s - = -¡ --> -size - * 8 - (¡-> -b™s_unu£d - & 0x07); - -1890 - `ASN_DEBUG -("BIT STRING of %d bytes", - -1891 -sizešun™s -); - -1893  -ASN_OSUBV_ANY -: - -1894  -ASN_OSUBV_STR -: - -1895 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 8; - -1899 -bpc - = -OS__BPC_CHAR -; - -1900 -sizešun™s - = -¡ --> -size -; - -1902  -ASN_OSUBV_U16 -: - -1903 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 16; - -1904 if( -cv® --> -æags - & -APC_CONSTRAINED -) - -1905 -un™_b™s - = -cv® --> -¿nge_b™s -; - -1906 -bpc - = -OS__BPC_U16 -; - -1907 -sizešun™s - = -¡ --> -size - / 2; - -1909  -ASN_OSUBV_U32 -: - -1910 -ÿnÚiÿl_un™_b™s - = -un™_b™s - = 32; - -1911 if( -cv® --> -æags - & -APC_CONSTRAINED -) - -1912 -un™_b™s - = -cv® --> -¿nge_b™s -; - -1913 -bpc - = -OS__BPC_U32 -; - -1914 -sizešun™s - = -¡ --> -size - / 4; - -1918 - `ASN_DEBUG -("Encoding %s into %d units of %d bits" - -1920 -td --> -Çme -, -sizešun™s -, -un™_b™s -, - -1921 -csiz --> -low”_bound -, csiz-> -uµ”_bound -, - -1922 -csiz --> -efãùive_b™s -, -ù_ex‹nsibË - ? " EXT" : ""); - -1926 if( -csiz --> -efãùive_b™s - >= 0) { - -1927 if(() -sizešun™s - < -csiz --> -low”_bound - - -1928 || () -sizešun™s - > -csiz --> -uµ”_bound -) { - -1929 if( -ù_ex‹nsibË -) { - -1930 -cv® - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -v®ue -; - -1931 -csiz - = & -a¢_DEF_OCTET_STRING_cÚ¡¿šts -. -size -; - -1932 -un™_b™s - = -ÿnÚiÿl_un™_b™s -; - -1933 -šext - = 1; - -1935 -ASN__ENCODE_FAILED -; - -1938 -šext - = 0; - -1942 if( -ù_ex‹nsibË -) { - -1944 if( - `³r_put_ãw_b™s -( -po -, -šext -, 1)) - -1945 -ASN__ENCODE_FAILED -; - -1951 if( -csiz --> -efãùive_b™s - >= 0) { - -1952 - `ASN_DEBUG -("Encoding %lu bytes (%ld),†ength in %d bits", - -1953 -¡ --> -size -, -sizešun™s - - -csiz --> -low”_bound -, - -1954 -csiz --> -efãùive_b™s -); - -1955 ià( -csiz --> -efãùive_b™s - > 0) { - -1956 -»t - = - `­”_put_Ëngth -( -po -, -csiz --> -uµ”_bound - - csiz-> -low”_bound - + 1, -sizešun™s - - csiz->lower_bound); - -1957 if( -»t -è -ASN__ENCODE_FAILED -; - -1961 ià(( -¡ --> -size - > 2è|| ( -csiz --> -low”_bound - !ðcsiz-> -uµ”_bound -)) { - -1962 ià( - `­”_put_®ign -( -po -) < 0) - -1963 -ASN__ENCODE_FAILED -; - -1965 if( -bpc -) { - -1966 -»t - = - `OCTET_STRING_³r_put_ch¬aù”s -( -po -, -¡ --> -buf -, - -1967 -sizešun™s -, -bpc -, -un™_b™s -, - -1968 -cv® --> -low”_bound -, cv®-> -uµ”_bound -, -pc -); - -1970 -»t - = - `³r_put_mªy_b™s -( -po -, -¡ --> -buf -, - -1971 -sizešun™s - * -un™_b™s -); - -1973 if( -»t -è -ASN__ENCODE_FAILED -; - -1974 - `ASN__ENCODED_OK -( -” -); - -1977 - `ASN_DEBUG -("Encodšg %lu by‹s", -¡ --> -size -); - -1979 if( -sizešun™s - == 0) { - -1980 if( - `­”_put_Ëngth -( -po -, -1, 0)) - -1981 -ASN__ENCODE_FAILED -; - -1982 - `ASN__ENCODED_OK -( -” -); - -1985 -buf - = -¡ -->buf; - -1986  -sizešun™s -) { - -1987 -ssize_t - -maySave - = - `­”_put_Ëngth -( -po -, -1, -sizešun™s -); - -1989 if( -maySave - < 0è -ASN__ENCODE_FAILED -; - -1991 - `ASN_DEBUG -("Encoding %ld of %ld", - -1992 () -maySave -, () -sizešun™s -); - -1994 if( -bpc -) { - -1995 -»t - = - `OCTET_STRING_³r_put_ch¬aù”s -( -po -, -buf -, - -1996 -maySave -, -bpc -, -un™_b™s -, - -1997 -cv® --> -low”_bound -, cv®-> -uµ”_bound -, -pc -); - -1999 -»t - = - `³r_put_mªy_b™s -( -po -, -buf -, -maySave - * -un™_b™s -); - -2001 if( -»t -è -ASN__ENCODE_FAILED -; - -2003 if( -bpc -) - -2004 -buf - +ð -maySave - * -bpc -; - -2006 -buf - +ð -maySave - >> 3; - -2007 -sizešun™s - -ð -maySave -; - -2008 - `as£¹ -(!( -maySave - & 0x07è|| ! -sizešun™s -); - -2011 - `ASN__ENCODED_OK -( -” -); - -2012 - } -} - -2017 - $OCTET_STRING_´št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -2018  -žev– -, -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -2019 cÚ¡ * cÚ¡ -h2c - = "0123456789ABCDEF"; - -2020 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -2021  -sü©ch -[16 * 3 + 4]; - -2022 * -p - = -sü©ch -; - -2023 -ušt8_t - * -buf -; - -2024 -ušt8_t - * -’d -; - -2025 -size_t - -i -; - -2027 () -td -; - -2029 if(! -¡ - || (!¡-> -buf - && st-> -size -)) - -2030  ( - `cb -("", 8, -­p_key -) < 0) ? -1 : 0; - -2035 -buf - = -¡ -->buf; - -2036 -’d - = -buf - + -¡ --> -size -; - -2037  -i - = 0; -buf - < -’d -; buf++, i++) { - -2038 if(!( -i - % 16è&& (˜|| -¡ --> -size - > 16)) { - -2039 if( - `cb -( -sü©ch -, -p - - sü©ch, -­p_key -) < 0) - -2041 - `_i_INDENT -(1); - -2042 -p - = -sü©ch -; - -2044 * -p -++ = -h2c -[(* -buf - >> 4) & 0x0F]; - -2045 * -p -++ = -h2c -[* -buf - & 0x0F]; - -2046 * -p -++ = 0x20; - -2049 if( -p - > -sü©ch -) { - -2050 -p ---; - -2051 if( - `cb -( -sü©ch -, -p - - sü©ch, -­p_key -) < 0) - -2056 - } -} - -2059 - $OCTET_STRING_´št_utf8 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -2060  -žev– -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -2061 * -­p_key -) { - -2062 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -2064 () -td -; - -2065 () -žev– -; - -2067 if( -¡ - && (¡-> -buf - || !¡-> -size -)) { - -2068  ( - `cb -( -¡ --> -buf -, st-> -size -, -­p_key -) < 0) ? -1 : 0; - -2070  ( - `cb -("", 8, -­p_key -) < 0) ? -1 : 0; - -2072 - } -} - -2075 - $OCTET_STRING_ä“ -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -2076 -a¢_¡ruù_ä“_m‘hod - -m‘hod -) { - -2077 -OCTET_STRING_t - * -¡ - = (OCTET_STRING_ˆ*) -¥Œ -; - -2078 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs -; - -2079 -a¢_¡ruù_ùx_t - * -ùx -; - -2080  -_¡ack - * -¡ck -; - -2082 if(! -td - || ! -¡ -) - -2085 -¥ecs - = -td --> -¥ecifics - - -2086 ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *) -td --> -¥ecifics - - -2087 : & -a¢_SPC_OCTET_STRING_¥ecs -; - -2088 -ùx - = ( -a¢_¡ruù_ùx_t - *)((*) -¡ - + -¥ecs --> -ùx_off£t -); - -2090 - `ASN_DEBUG -("F»ešg % a OCTET STRING", -td --> -Çme -); - -2092 if( -¡ --> -buf -) { - -2093 - `FREEMEM -( -¡ --> -buf -); - -2094 -¡ --> -buf - = 0; - -2100 -¡ck - = ( -_¡ack - *) -ùx --> -±r -; - -2101 if( -¡ck -) { - -2102  -¡ck --> -ž -) { - -2103  -_¡ack_– - * -£l - = -¡ck --> -ž -; - -2104 -¡ck --> -ž - = -£l --> -´ev -; - -2105 - `FREEMEM -( -£l -); - -2107 - `FREEMEM -( -¡ck -); - -2110  -m‘hod -) { - -2111  -ASFM_FREE_EVERYTHING -: - -2112 - `FREEMEM -( -¥Œ -); - -2114  -ASFM_FREE_UNDERLYING -: - -2116  -ASFM_FREE_UNDERLYING_AND_RESET -: - -2117 - `mem£t -( -¥Œ -, 0, - -2118 -td --> -¥ecifics - - -2119 ? ((cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *)( -td --> -¥ecifics -)) - -2120 -> -¡ruù_size - - -2121 : ( -OCTET_STRING_t -)); - -2124 - } -} - -2130 - $OCTET_STRING_äomBuf -( -OCTET_STRING_t - * -¡ -, cÚ¡ * -¡r -,  -Ën -) { - -2131 * -buf -; - -2133 if( -¡ - =ð0 || ( -¡r - =ð0 && -Ën -)) { - -2134 -”ºo - = -EINVAL -; - -2141 if( -¡r - =ð -NULL -) { - -2142 - `FREEMEM -( -¡ --> -buf -); - -2143 -¡ --> -buf - = 0; - -2144 -¡ --> -size - = 0; - -2149 if( -Ën - < 0) - -2150 -Ën - = - `¡¾’ -( -¡r -); - -2153 -buf - = - `MALLOC -( -Ën - + 1); - -2154 if( -buf - =ð -NULL -) - -2157 - `memýy -( -buf -, -¡r -, -Ën -); - -2158 (( -ušt8_t - *) -buf -)[ -Ën -] = '\0'; - -2159 - `FREEMEM -( -¡ --> -buf -); - -2160 -¡ --> -buf - = ( -ušt8_t - *)buf; - -2161 -¡ --> -size - = -Ën -; - -2164 - } -} - -2166 -OCTET_STRING_t - * - -2167 - $OCTET_STRING_Ãw_äomBuf -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¡r -, - -2168  -Ën -) { - -2169 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = - -2170 -td --> -¥ecifics - ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *)td->specifics - -2171 : & -a¢_SPC_OCTET_STRING_¥ecs -; - -2172 -OCTET_STRING_t - * -¡ -; - -2174 -¡ - = ( -OCTET_STRING_t - *) - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -2175 if( -¡ - && -¡r - && - `OCTET_STRING_äomBuf -(¡, sŒ, -Ën -)) { - -2176 - `FREEMEM -( -¡ -); - -2177 -¡ - = -NULL -; - -2180  -¡ -; - -2181 - } -} - -2188 - $OCTET_STRING_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -­Œ -, - -2189 cÚ¡ * -b±r -) { - -2190 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics -; - -2191 cÚ¡ -OCTET_STRING_t - * -a - = -­Œ -; - -2192 cÚ¡ -OCTET_STRING_t - * -b - = -b±r -; - -2194 - `as£¹ -(! -¥ecs - || s³cs-> -subv¬ŸÁ - !ð -ASN_OSUBV_BIT -); - -2196 if( -a - && -b -) { - -2197 -size_t - -commÚ_´efix_size - = -a --> -size - <ð -b -->size ?‡->size : b->size; - -2198  -»t - = - `memcmp -( -a --> -buf -, -b -->buf, -commÚ_´efix_size -); - -2199 if( -»t - == 0) { - -2201 if( -a --> -size - < -b -->size) { - -2203 } if( -a --> -size - > -b -->size) { - -2209  -»t - < 0 ? -1 : 1; - -2211 } if(! -a - && ! -b -) { - -2213 } if(! -a -) { - -2219 - } -} - -2224  -ušt32_t - - -2225 - $OCTET_STRING__¿ndom_ch¬ -( -lb -,  -ub -) { - -2226 - `as£¹ -( -lb - <ð -ub -); - -2227  - `a¢_¿ndom_b‘w“n -(0, 16)) { - -2229 if( -lb - < -ub -) †b + 1; - -2232  -lb -; - -2234 if( -lb - < -ub -)  ub - 1; - -2237  -ub -; - -2239  - `a¢_¿ndom_b‘w“n -( -lb -, -ub -); - -2241 - } -} - -2244 -size_t - - -2245 - $OCTET_STRING_¿ndom_Ëngth_cÚ¡¿šed -( - -2246 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -2247 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡¿šts -, -size_t - -max_Ëngth -) { - -2248 cÚ¡  -Ëngths -[] = {0, 1, 2, 3, 4, 8, - -2251 -size_t - -ºd_Ën -; - -2254 -ºd_Ën - = -Ëngths -[ - `a¢_¿ndom_b‘w“n -( - -2255 0, ( -Ëngths -) / (lengths[0]) - 1)]; - -2257 if(! -cÚ¡¿šts - || !cÚ¡¿šts-> -³r_cÚ¡¿šts -) - -2258 -cÚ¡¿šts - = & -td --> -’codšg_cÚ¡¿šts -; - -2259 if( -cÚ¡¿šts --> -³r_cÚ¡¿šts -) { - -2260 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -pc - = & -cÚ¡¿šts --> -³r_cÚ¡¿šts --> -size -; - -2261 if( -pc --> -æags - & -APC_CONSTRAINED -) { - -2262  -sugge¡ed_uµ”_bound - = -pc --> -uµ”_bound - < ( -ssize_t -) -max_Ëngth - - -2263 ? -pc --> -uµ”_bound - - -2264 : ( -ssize_t -) -max_Ëngth -; - -2265 if( -max_Ëngth - <ð( -size_t -) -pc --> -low”_bound -) { - -2266  -pc --> -low”_bound -; - -2268 if( -pc --> -æags - & -APC_EXTENSIBLE -) { - -2269  - `a¢_¿ndom_b‘w“n -(0, 5)) { - -2271 if( -pc --> -low”_bound - > 0) { - -2272 -ºd_Ën - = -pc --> -low”_bound - - 1; - -2277 -ºd_Ën - = -pc --> -uµ”_bound - + 1; - -2281 if( -ºd_Ën - <ð -max_Ëngth -) { - -2286 -ºd_Ën - = - `a¢_¿ndom_b‘w“n -( -pc --> -low”_bound -, - -2287 -sugge¡ed_uµ”_bound -); - -2290 -ºd_Ën - = - -2291 - `a¢_¿ndom_b‘w“n -( -pc --> -low”_bound -, -sugge¡ed_uµ”_bound -); - -2294 -ºd_Ën - = - `a¢_¿ndom_b‘w“n -(0, -max_Ëngth -); - -2296 } if( -ºd_Ën - > -max_Ëngth -) { - -2297 -ºd_Ën - = - `a¢_¿ndom_b‘w“n -(0, -max_Ëngth -); - -2300  -ºd_Ën -; - -2301 - } -} - -2303 -a¢_¿ndom_fžl_»suÉ_t - - -2304 - $OCTET_STRING_¿ndom_fžl -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -2305 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -2306 -size_t - -max_Ëngth -) { - -2307 cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - * -¥ecs - = -td --> -¥ecifics - - -2308 ? (cÚ¡ -a¢_OCTET_STRING_¥ecifics_t - *) -td --> -¥ecifics - - -2309 : & -a¢_SPC_OCTET_STRING_¥ecs -; - -2310 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_ok - = { -ARFILL_OK -, 1}; - -2311 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_çžed - = { -ARFILL_FAILED -, 0}; - -2312 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_sk³d - = { -ARFILL_SKIPPED -, 0}; - -2313  -un™_by‹s - = 1; - -2314  -þb - = 0; - -2315  -cub - = 255; - -2316 -ušt8_t - * -buf -; - -2317 -ušt8_t - * -b’d -; - -2318 -ušt8_t - * -b -; - -2319 -size_t - -ºd_Ën -; - -2320 -OCTET_STRING_t - * -¡ -; - -2322 if( -max_Ëngth - =ð0 && !* -¥Œ -è -»suÉ_sk³d -; - -2324  -¥ecs --> -subv¬ŸÁ -) { - -2326  -ASN_OSUBV_ANY -: - -2327  -»suÉ_çžed -; - -2328  -ASN_OSUBV_BIT -: - -2330  -»suÉ_çžed -; - -2331  -ASN_OSUBV_STR -: - -2332 -un™_by‹s - = 1; - -2333 -þb - = 0; - -2334 -cub - = 255; - -2336  -ASN_OSUBV_U16 -: - -2337 -un™_by‹s - = 2; - -2338 -þb - = 0; - -2339 -cub - = 65535; - -2341  -ASN_OSUBV_U32 -: - -2342 -un™_by‹s - = 4; - -2343 -þb - = 0; - -2344 -cub - = 0x10FFFF; - -2348 if(! -cÚ¡¿šts - || !cÚ¡¿šts-> -³r_cÚ¡¿šts -) - -2349 -cÚ¡¿šts - = & -td --> -’codšg_cÚ¡¿šts -; - -2350 if( -cÚ¡¿šts --> -³r_cÚ¡¿šts -) { - -2351 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -pc - = & -cÚ¡¿šts --> -³r_cÚ¡¿šts --> -v®ue -; - -2352 if( -pc --> -æags - & -APC_SEMI_CONSTRAINED -) { - -2353 -þb - = -pc --> -low”_bound -; - -2354 } if( -pc --> -æags - & -APC_CONSTRAINED -) { - -2355 -þb - = -pc --> -low”_bound -; - -2356 -cub - = -pc --> -uµ”_bound -; - -2360 -ºd_Ën - = - -2361 - `OCTET_STRING_¿ndom_Ëngth_cÚ¡¿šed -( -td -, -cÚ¡¿šts -, -max_Ëngth -); - -2363 -buf - = - `CALLOC -( -un™_by‹s -, -ºd_Ën - + 1); - -2364 if(! -buf -è -»suÉ_çžed -; - -2366 -b’d - = & -buf -[ -un™_by‹s - * -ºd_Ën -]; - -2368  -un™_by‹s -) { - -2370  -b - = -buf -; b < -b’d -; b +ð -un™_by‹s -) { - -2371 *( -ušt8_t - *) -b - = - `OCTET_STRING__¿ndom_ch¬ -( -þb -, -cub -); - -2373 *( -ušt8_t - *) -b - = 0; - -2376  -b - = -buf -; b < -b’d -; b +ð -un™_by‹s -) { - -2377 -ušt32_t - -code - = - `OCTET_STRING__¿ndom_ch¬ -( -þb -, -cub -); - -2378 -b -[0] = -code - >> 8; - -2379 -b -[1] = -code -; - -2381 *( -ušt16_t - *) -b - = 0; - -2384  -b - = -buf -; b < -b’d -; b +ð -un™_by‹s -) { - -2385 -ušt32_t - -code - = - `OCTET_STRING__¿ndom_ch¬ -( -þb -, -cub -); - -2386 -b -[0] = -code - >> 24; - -2387 -b -[1] = -code - >> 16; - -2388 -b -[2] = -code - >> 8; - -2389 -b -[3] = -code -; - -2391 *( -ušt32_t - *) -b - = 0; - -2395 if(* -¥Œ -) { - -2396 -¡ - = * -¥Œ -; - -2397 - `FREEMEM -( -¡ --> -buf -); - -2399 -¡ - = ( -OCTET_STRING_t - *)(* -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -)); - -2400 if(! -¡ -) { - -2401 - `FREEMEM -( -buf -); - -2402  -»suÉ_çžed -; - -2406 -¡ --> -buf - = buf; - -2407 -¡ --> -size - = -un™_by‹s - * -ºd_Ën -; - -2409 -»suÉ_ok -. -Ëngth - = -¡ --> -size -; - -2410  -»suÉ_ok -; - -2411 - } -} - - @OPEN_TYPE.c - -5  - ~ - -6  - ~ - -7  - ~ - -8  - ~<³r_ݒty³.h -> - -9  - ~<”ºo.h -> - -11 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_OPEN_TYPE - = { - -12 -OPEN_TYPE_ä“ -, - -13 -OPEN_TYPE_´št -, - -14 -OPEN_TYPE_com·» -, - -15 -OPEN_TYPE_decode_b” -, - -16 -OPEN_TYPE_’code_d” -, - -17 -OPEN_TYPE_decode_x” -, - -18 -OPEN_TYPE_’code_x” -, - -19 #ifdeà -ASN_DISABLE_OER_SUPPORT - - -22 -OPEN_TYPE_decode_Ûr -, - -23 -OPEN_TYPE_’code_Ûr -, - -25 #ifdeà -ASN_DISABLE_PER_SUPPORT - - -28 -OPEN_TYPE_decode_u³r -, - -29 -OPEN_TYPE_’code_u³r -, - -30 -OPEN_TYPE_decode_­” -, - -31 -OPEN_TYPE_’code_­” -, - -37 #undeà -ADVANCE - - -38  - #ADVANCE -( -num_by‹s -) \ - -40 -size_t - -num - = -num_by‹s -; \ - -41 -±r - = ((cÚ¡ *íŒè+ -num -; \ - -42 -size - -ð -num -; \ - -43 -cÚsumed_my£lf - +ð -num -; \ - -44 } 0) - - ) - -46 -a¢_dec_rv®_t - - -47 - $OPEN_TYPE_b”_g‘ -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -48 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -49 cÚ¡ -a¢_TYPE_memb”_t - * -–m -, cÚ¡ * -±r -, -size_t - -size -) { - -50 -size_t - -cÚsumed_my£lf - = 0; - -51 -a¢_ty³_£ËùÜ_»suÉ_t - -£Ëùed -; - -52 * -memb_±r -; - -53 ** -memb_±r2 -; - -54 * -šÃr_v®ue -; - -55 -a¢_dec_rv®_t - -rv -; - -57 if(!( -–m --> -æags - & -ATF_OPEN_TYPE -)) { - -58 -ASN__DECODE_FAILED -; - -61 if(! -–m --> -ty³_£ËùÜ -) { - -62 - `ASN_DEBUG -("Type selector is‚ot defined for Open Type %s->%s->%s", - -63 -td --> -Çme -, -–m -->Çme,ƒlm-> -ty³ -->name); - -64 -ASN__DECODE_FAILED -; - -67 -£Ëùed - = -–m --> - `ty³_£ËùÜ -( -td -, -¥Œ -); - -68 if(! -£Ëùed -. -´e£nû_šdex -) { - -69 -ASN__DECODE_FAILED -; - -73 if( -–m --> -æags - & -ATF_POINTER -) { - -74 -memb_±r2 - = (**)((*) -¥Œ - + -–m --> -memb_off£t -); - -76 -memb_±r - = (*) -¥Œ - + -–m --> -memb_off£t -; - -77 -memb_±r2 - = & -memb_±r -; - -79 if(* -memb_±r2 - !ð -NULL -) { - -81 if( - `CHOICE_v¬ŸÁ_£t_´e£nû -( -–m --> -ty³ -, * -memb_±r2 -, 0) != 0) { - -82 -ASN__DECODE_FAILED -; - -86 -šÃr_v®ue - = - -87 (*)* -memb_±r2 - - -88 + -–m --> -ty³ --> -–em’ts -[ -£Ëùed -. -´e£nû_šdex - - 1]. -memb_off£t -; - -90 - `ASN_DEBUG -("´e£nû %d\n", -£Ëùed -. -´e£nû_šdex -); - -92 -rv - = -£Ëùed -. -ty³_desütÜ --> -Ý --> - `b”_decod” -( - -93 -Ýt_codec_ùx -, -£Ëùed -. -ty³_desütÜ -, & -šÃr_v®ue -, -±r -, -size -, - -94 -–m --> -g_mode -); - -95 - `ADVANCE -( -rv -. -cÚsumed -); - -96 -rv -. -cÚsumed - = 0; - -97  -rv -. -code -) { - -98  -RC_OK -: - -99 if( - `CHOICE_v¬ŸÁ_£t_´e£nû -( -–m --> -ty³ -, * -memb_±r2 -, - -100 -£Ëùed -. -´e£nû_šdex -) - -102 -rv -. -code - = -RC_OK -; - -103 -rv -. -cÚsumed - = -cÚsumed_my£lf -; - -104  -rv -; - -109  -RC_FAIL -: - -110 -rv -. -cÚsumed - = -cÚsumed_my£lf -; - -112  -RC_WMORE -: - -116 if(* -memb_±r2 -) { - -117 if( -–m --> -æags - & -ATF_POINTER -) { - -118 - `ASN_STRUCT_FREE -(* -£Ëùed -. -ty³_desütÜ -, -šÃr_v®ue -); - -119 * -memb_±r2 - = -NULL -; - -121 - `ASN_STRUCT_RESET -(* -£Ëùed -. -ty³_desütÜ -, - -122 -šÃr_v®ue -); - -125  -rv -; - -126 - } -} - -128 -a¢_dec_rv®_t - - -129 - $OPEN_TYPE_x”_g‘ -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -130 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -131 cÚ¡ -a¢_TYPE_memb”_t - * -–m -, cÚ¡ * -±r -, -size_t - -size -) { - -132 -size_t - -cÚsumed_my£lf - = 0; - -133 -a¢_ty³_£ËùÜ_»suÉ_t - -£Ëùed -; - -134 * -memb_±r -; - -135 ** -memb_±r2 -; - -136 * -šÃr_v®ue -; - -137 -a¢_dec_rv®_t - -rv -; - -139  -x”_cڋxt - = 0; - -140 -ssize_t - -ch_size -; - -141 -px”_chunk_ty³_e - -ch_ty³ -; - -143 if(!( -–m --> -æags - & -ATF_OPEN_TYPE -)) { - -144 -ASN__DECODE_FAILED -; - -147 if(! -–m --> -ty³_£ËùÜ -) { - -148 - `ASN_DEBUG -("Type selector is‚ot defined for Open Type %s->%s->%s", - -149 -td --> -Çme -, -–m -->Çme,ƒlm-> -ty³ -->name); - -150 -ASN__DECODE_FAILED -; - -153 -£Ëùed - = -–m --> - `ty³_£ËùÜ -( -td -, -¥Œ -); - -154 if(! -£Ëùed -. -´e£nû_šdex -) { - -155 -ASN__DECODE_FAILED -; - -159 - `as£¹ -( -–m --> -æags - =ð -ATF_OPEN_TYPE -); - -160 if( -–m --> -æags - & -ATF_POINTER -) { - -161 -memb_±r2 - = (**)((*) -¥Œ - + -–m --> -memb_off£t -); - -163 -memb_±r - = (*) -¥Œ - + -–m --> -memb_off£t -; - -164 -memb_±r2 - = & -memb_±r -; - -166 if(* -memb_±r2 - !ð -NULL -) { - -168 if( - `CHOICE_v¬ŸÁ_£t_´e£nû -( -–m --> -ty³ -, * -memb_±r2 -, 0) - -170 -ASN__DECODE_FAILED -; - -178 -ch_size - = - `x”_Ãxt_tok’ -(& -x”_cڋxt -, -±r -, -size -, & -ch_ty³ -); - -179 if( -ch_size - < 0) { - -180 -ASN__DECODE_FAILED -; - -182  -ch_ty³ -) { - -183  -PXER_WMORE -: - -184 -ASN__DECODE_STARVED -; - -185  -PXER_COMMENT -: - -186  -PXER_TEXT -: - -187 - `ADVANCE -( -ch_size -); - -189  -PXER_TAG -: - -199  - `x”_check_g -( -±r -, -ch_size -, -–m --> -Çme -)) { - -200  -XCT_OPENING -: - -201 - `ADVANCE -( -ch_size -); - -203  -XCT_BROKEN -: - -205 -ASN__DECODE_FAILED -; - -208 -šÃr_v®ue - = - -209 (*)* -memb_±r2 - - -210 + -–m --> -ty³ --> -–em’ts -[ -£Ëùed -. -´e£nû_šdex - - 1]. -memb_off£t -; - -212 -rv - = -£Ëùed -. -ty³_desütÜ --> -Ý --> - `x”_decod” -( - -213 -Ýt_codec_ùx -, -£Ëùed -. -ty³_desütÜ -, & -šÃr_v®ue -, -NULL -, -±r -, -size -); - -214 - `ADVANCE -( -rv -. -cÚsumed -); - -215 -rv -. -cÚsumed - = 0; - -216  -rv -. -code -) { - -217  -RC_OK -: - -218 if( - `CHOICE_v¬ŸÁ_£t_´e£nû -( -–m --> -ty³ -, * -memb_±r2 -, - -219 -£Ëùed -. -´e£nû_šdex -) - -223 -rv -. -code - = -RC_FAIL -; - -226  -RC_FAIL -: - -228 -rv -. -cÚsumed - = -cÚsumed_my£lf -; - -230  -RC_WMORE -: - -235 if(* -memb_±r2 -) { - -236 if( -–m --> -æags - & -ATF_POINTER -) { - -237 - `ASN_STRUCT_FREE -(* -£Ëùed -. -ty³_desütÜ -, -šÃr_v®ue -); - -238 * -memb_±r2 - = -NULL -; - -240 - `ASN_STRUCT_RESET -(* -£Ëùed -. -ty³_desütÜ -, - -241 -šÃr_v®ue -); - -244  -rv -; - -251 -ch_size - = - `x”_Ãxt_tok’ -(& -x”_cڋxt -, -±r -, -size -, & -ch_ty³ -); - -252 if( -ch_size - < 0) { - -253 -ASN__DECODE_FAILED -; - -255  -ch_ty³ -) { - -256  -PXER_WMORE -: - -257 -ASN__DECODE_STARVED -; - -258  -PXER_COMMENT -: - -259  -PXER_TEXT -: - -260 - `ADVANCE -( -ch_size -); - -262  -PXER_TAG -: - -272  - `x”_check_g -( -±r -, -ch_size -, -–m --> -Çme -)) { - -273  -XCT_CLOSING -: - -274 - `ADVANCE -( -ch_size -); - -276  -XCT_BROKEN -: - -278 -ASN__DECODE_FAILED -; - -281 -rv -. -cÚsumed - +ð -cÚsumed_my£lf -; - -283  -rv -; - -284 - } -} - -287 #iâdeà -ASN_DISABLE_PER_SUPPORT - - -289 -a¢_dec_rv®_t - - -290 - $OPEN_TYPE_u³r_g‘ -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -291 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -292 cÚ¡ -a¢_TYPE_memb”_t - * -–m -, -a¢_³r_d©a_t - * -pd -) { - -293 -a¢_ty³_£ËùÜ_»suÉ_t - -£Ëùed -; - -294 * -memb_±r -; - -295 ** -memb_±r2 -; - -296 * -šÃr_v®ue -; - -297 -a¢_dec_rv®_t - -rv -; - -299 if(!( -–m --> -æags - & -ATF_OPEN_TYPE -)) { - -300 -ASN__DECODE_FAILED -; - -303 if(! -–m --> -ty³_£ËùÜ -) { - -304 - `ASN_DEBUG -("Type selector is‚ot defined for Open Type %s->%s->%s", - -305 -td --> -Çme -, -–m -->Çme,ƒlm-> -ty³ -->name); - -306 -ASN__DECODE_FAILED -; - -309 -£Ëùed - = -–m --> - `ty³_£ËùÜ -( -td -, -¥Œ -); - -310 if(! -£Ëùed -. -´e£nû_šdex -) { - -311 -ASN__DECODE_FAILED -; - -315 - `as£¹ -( -–m --> -æags - =ð -ATF_OPEN_TYPE -); - -316 if( -–m --> -æags - & -ATF_POINTER -) { - -317 -memb_±r2 - = (**)((*) -¥Œ - + -–m --> -memb_off£t -); - -319 -memb_±r - = (*) -¥Œ - + -–m --> -memb_off£t -; - -320 -memb_±r2 - = & -memb_±r -; - -322 if(* -memb_±r2 - !ð -NULL -) { - -324 if( - `CHOICE_v¬ŸÁ_£t_´e£nû -( -–m --> -ty³ -, * -memb_±r2 -, 0) - -326 -ASN__DECODE_FAILED -; - -330 -šÃr_v®ue - = - -331 (*)* -memb_±r2 - - -332 + -–m --> -ty³ --> -–em’ts -[ -£Ëùed -. -´e£nû_šdex - - 1]. -memb_off£t -; - -334 -rv - = - `u³r_ݒ_ty³_g‘ -( -Ýt_codec_ùx -, -£Ëùed -. -ty³_desütÜ -, -NULL -, - -335 & -šÃr_v®ue -, -pd -); - -336  -rv -. -code -) { - -337  -RC_OK -: - -338 if( - `CHOICE_v¬ŸÁ_£t_´e£nû -( -–m --> -ty³ -, * -memb_±r2 -, - -339 -£Ëùed -. -´e£nû_šdex -) - -343 -rv -. -code - = -RC_FAIL -; - -346  -RC_WMORE -: - -347  -RC_FAIL -: - -348 if(* -memb_±r2 -) { - -349 if( -–m --> -æags - & -ATF_POINTER -) { - -350 - `ASN_STRUCT_FREE -(* -£Ëùed -. -ty³_desütÜ -, -šÃr_v®ue -); - -351 * -memb_±r2 - = -NULL -; - -353 - `ASN_STRUCT_RESET -(* -£Ëùed -. -ty³_desütÜ -, - -354 -šÃr_v®ue -); - -358  -rv -; - -359 - } -} - -361 -a¢_’c_rv®_t - - -362 - $OPEN_TYPE_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -363 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -364 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -365 cÚ¡ * -memb_±r -; - -366 -a¢_TYPE_memb”_t - * -–m -; - -367 -a¢_’c_rv®_t - -” - = {0,0,0}; - -368  -´e£Á -; - -370 () -cÚ¡¿šts -; - -372 -´e£Á - = - `CHOICE_v¬ŸÁ_g‘_´e£nû -( -td -, -¥Œ -); - -373 if( -´e£Á - =ð0 ||…»£Á > -td --> -–em’ts_couÁ -) { - -374 -ASN__ENCODE_FAILED -; - -376 -´e£Á ---; - -379 - `ASN_DEBUG -("Encodšg % OPEN TYPEƒËm’ˆ%d", -td --> -Çme -, -´e£Á -); - -381 -–m - = & -td --> -–em’ts -[ -´e£Á -]; - -382 if( -–m --> -æags - & -ATF_POINTER -) { - -384 -memb_±r - = - -385 *(cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -386 if(! -memb_±r -è -ASN__ENCODE_FAILED -; - -388 -memb_±r - = (cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -; - -391 if( - `u³r_ݒ_ty³_put -( -–m --> -ty³ -, -NULL -, -memb_±r -, -po -) < 0) { - -392 -ASN__ENCODE_FAILED -; - -395 -” -. -’coded - = 0; - -396 - `ASN__ENCODED_OK -( -” -); - -397 - } -} - -399 -a¢_dec_rv®_t - - -400 - $OPEN_TYPE_­”_g‘ -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -401 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -402 cÚ¡ -a¢_TYPE_memb”_t - * -–m -, -a¢_³r_d©a_t - * -pd -) { - -403 -a¢_ty³_£ËùÜ_»suÉ_t - -£Ëùed -; - -404 * -memb_±r -; - -405 ** -memb_±r2 -; - -406 * -šÃr_v®ue -; - -407 -a¢_dec_rv®_t - -rv -; - -409 if(!( -–m --> -æags - & -ATF_OPEN_TYPE -)) { - -410 -ASN__DECODE_FAILED -; - -413 if(! -–m --> -ty³_£ËùÜ -) { - -414 - `ASN_DEBUG -("Type selector is‚ot defined for Open Type %s->%s->%s", - -415 -td --> -Çme -, -–m -->Çme,ƒlm-> -ty³ -->name); - -416 -ASN__DECODE_FAILED -; - -419 -£Ëùed - = -–m --> - `ty³_£ËùÜ -( -td -, -¥Œ -); - -420 if(! -£Ëùed -. -´e£nû_šdex -) { - -421 -ASN__DECODE_FAILED -; - -425 - `as£¹ -( -–m --> -æags - =ð -ATF_OPEN_TYPE -); - -426 if( -–m --> -æags - & -ATF_POINTER -) { - -427 -memb_±r2 - = (**)((*) -¥Œ - + -–m --> -memb_off£t -); - -429 -memb_±r - = (*) -¥Œ - + -–m --> -memb_off£t -; - -430 -memb_±r2 - = & -memb_±r -; - -432 if(* -memb_±r2 - !ð -NULL -) { - -434 if( - `CHOICE_v¬ŸÁ_£t_´e£nû -( -–m --> -ty³ -, * -memb_±r2 -, 0) - -436 -ASN__DECODE_FAILED -; - -440 -šÃr_v®ue - = - -441 (*)* -memb_±r2 - - -442 + -–m --> -ty³ --> -–em’ts -[ -£Ëùed -. -´e£nû_šdex - - 1]. -memb_off£t -; - -444 -rv - = - `­”_ݒ_ty³_g‘ -( -Ýt_codec_ùx -, -£Ëùed -. -ty³_desütÜ -, -NULL -, - -445 & -šÃr_v®ue -, -pd -); - -446  -rv -. -code -) { - -447  -RC_OK -: - -448 if( - `CHOICE_v¬ŸÁ_£t_´e£nû -( -–m --> -ty³ -, * -memb_±r2 -, - -449 -£Ëùed -. -´e£nû_šdex -) - -453 -rv -. -code - = -RC_FAIL -; - -456  -RC_WMORE -: - -457  -RC_FAIL -: - -458 if(* -memb_±r2 -) { - -459 if( -–m --> -æags - & -ATF_POINTER -) { - -460 - `ASN_STRUCT_FREE -(* -£Ëùed -. -ty³_desütÜ -, -šÃr_v®ue -); - -461 * -memb_±r2 - = -NULL -; - -463 - `ASN_STRUCT_RESET -(* -£Ëùed -. -ty³_desütÜ -, - -464 -šÃr_v®ue -); - -468  -rv -; - -469 - } -} - -471 -a¢_’c_rv®_t - - -472 - $OPEN_TYPE_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -473 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -474 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -475 cÚ¡ * -memb_±r -; - -476 -a¢_TYPE_memb”_t - * -–m -; - -477 -a¢_’c_rv®_t - -” - = {0,0,0}; - -478  -´e£Á -; - -480 () -cÚ¡¿šts -; - -482 -´e£Á - = - `CHOICE_v¬ŸÁ_g‘_´e£nû -( -td -, -¥Œ -); - -483 if( -´e£Á - =ð0 ||…»£Á > -td --> -–em’ts_couÁ -) { - -484 -ASN__ENCODE_FAILED -; - -486 -´e£Á ---; - -489 - `ASN_DEBUG -("Encodšg % OPEN TYPEƒËm’ˆ%d", -td --> -Çme -, -´e£Á -); - -491 -–m - = & -td --> -–em’ts -[ -´e£Á -]; - -492 if( -–m --> -æags - & -ATF_POINTER -) { - -494 -memb_±r - = - -495 *(cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -496 if(! -memb_±r -è -ASN__ENCODE_FAILED -; - -498 -memb_±r - = (cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -; - -501 if( - `­”_ݒ_ty³_put -( -–m --> -ty³ -, -NULL -, -memb_±r -, -po -) < 0) { - -502 -ASN__ENCODE_FAILED -; - -505 -” -. -’coded - = 0; - -506 - `ASN__ENCODED_OK -( -” -); - -507 - } -} - - @PLMNIdentity.c - -8  - ~"PLMNId’t™y.h -" - -11 - $PLMNId’t™y_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 -size - = -¡ -->size; - -25 if(( -size - == 3)) { - -29 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -31 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -34 - } -} - -40 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_PLMNId’t™y_cÚ¡r_1 - - gCC_NOTUSED - = { - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -42 { -APC_CONSTRAINED -, 0, 0, 3, 3 } , - -45 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_PLMNId’t™y_gs_1 -[] = { - -46 ( -ASN_TAG_CLASS_UNIVERSAL - | (4 << 2)) - -48 -a¢_TYPE_desütÜ_t - - ga¢_DEF_PLMNId’t™y - = { - -51 & -a¢_OP_OCTET_STRING -, - -52 -a¢_DEF_PLMNId’t™y_gs_1 -, - -53 ( -a¢_DEF_PLMNId’t™y_gs_1 -) - -54 /( -a¢_DEF_PLMNId’t™y_gs_1 -[0]), - -55 -a¢_DEF_PLMNId’t™y_gs_1 -, - -56 ( -a¢_DEF_PLMNId’t™y_gs_1 -) - -57 /( -a¢_DEF_PLMNId’t™y_gs_1 -[0]), - -58 { 0, & -a¢_PER_ty³_PLMNId’t™y_cÚ¡r_1 -, -PLMNId’t™y_cÚ¡¿št - }, - -60 & -a¢_SPC_OCTET_STRING_¥ecs - - - @PrintableString.c - -6  - ~ - -7  - ~ - -12 cÚ¡  - g_PršbËSŒšg_®phab‘ -[256] = { - -22 cÚ¡  - g_PršbËSŒšg_code2v®ue -[74] = { - -32 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_PršbËSŒšg_gs -[] = { - -33 ( -ASN_TAG_CLASS_UNIVERSAL - | (19 << 2)), - -34 ( -ASN_TAG_CLASS_UNIVERSAL - | (4 << 2)) - -36  - $a¢_DEF_PršbËSŒšg_v2c -( -v®ue -) { - -37  -_PršbËSŒšg_®phab‘ -[ -v®ue - > 255 ? 0 : value] - 1; - -38 - } -} - -39  - $a¢_DEF_PršbËSŒšg_c2v -( -code -) { - -40 if( -code - < 74) - -41  -_PršbËSŒšg_code2v®ue -[ -code -]; - -43 - } -} - -44  -a¢_³r_cÚ¡¿šts_t - - ga¢_DEF_PršbËSŒšg_³r_cÚ¡¿šts - = { - -45 { -APC_CONSTRAINED -, 4, 4, 0x20, 0x39 }, - -46 { -APC_SEMI_CONSTRAINED -, -1, -1, 0, 0 }, - -47 -a¢_DEF_PršbËSŒšg_v2c -, - -48 -a¢_DEF_PršbËSŒšg_c2v - - -50 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_PršbËSŒšg - = { - -51 -OCTET_STRING_ä“ -, - -52 -OCTET_STRING_´št_utf8 -, - -53 -OCTET_STRING_com·» -, - -54 -OCTET_STRING_decode_b” -, - -55 -OCTET_STRING_’code_d” -, - -56 -OCTET_STRING_decode_x”_utf8 -, - -57 -OCTET_STRING_’code_x”_utf8 -, - -58 #ifdef -ASN_DISABLE_OER_SUPPORT - - -62 -OCTET_STRING_decode_Ûr -, - -63 -OCTET_STRING_’code_Ûr -, - -65 #ifdef -ASN_DISABLE_PER_SUPPORT - - -71 -OCTET_STRING_decode_u³r -, - -72 -OCTET_STRING_’code_u³r -, - -73 -OCTET_STRING_decode_­” -, - -74 -OCTET_STRING_’code_­” -, - -76 -OCTET_STRING_¿ndom_fžl -, - -79 -a¢_TYPE_desütÜ_t - - ga¢_DEF_PršbËSŒšg - = { - -82 & -a¢_OP_PršbËSŒšg -, - -83 -a¢_DEF_PršbËSŒšg_gs -, - -84 ( -a¢_DEF_PršbËSŒšg_gs -) - -85 / ( -a¢_DEF_PršbËSŒšg_gs -[0]) - 1, - -86 -a¢_DEF_PršbËSŒšg_gs -, - -87 ( -a¢_DEF_PršbËSŒšg_gs -) - -88 / ( -a¢_DEF_PršbËSŒšg_gs -[0]), - -89 { 0, & -a¢_DEF_PršbËSŒšg_³r_cÚ¡¿šts -, -PršbËSŒšg_cÚ¡¿št - }, - -96 - $PršbËSŒšg_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -97 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, - -98 * -­p_key -) { - -99 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -101 if( -¡ - && st-> -buf -) { - -102 -ušt8_t - * -buf - = -¡ -->buf; - -103 -ušt8_t - * -’d - = -buf - + -¡ --> -size -; - -109 ; -buf - < -’d -; buf++) { - -110 if(! -_PršbËSŒšg_®phab‘ -[* -buf -]) { - -111 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -115 -td --> -Çme -, - -116 ()(( -buf - - -¡ -->buf) + 1), - -117 * -buf -, - -118 -__FILE__ -, -__LINE__ -); - -123 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -125 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -130 - } -} - - @QCI.c - -8  - ~"QCI.h -" - -11 - $QCI_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 0 && value <= 255)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_QCI_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED -, 8, 8, 0, 255 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_QCI_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_QCI - = { - -50 & -a¢_OP_N©iveIÁeg” -, - -51 -a¢_DEF_QCI_gs_1 -, - -52 ( -a¢_DEF_QCI_gs_1 -) - -53 /( -a¢_DEF_QCI_gs_1 -[0]), - -54 -a¢_DEF_QCI_gs_1 -, - -55 ( -a¢_DEF_QCI_gs_1 -) - -56 /( -a¢_DEF_QCI_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_QCI_cÚ¡r_1 -, -QCI_cÚ¡¿št - }, - - @QoSID.c - -8  - ~"QoSID.h -" - -10  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_QoSID_cÚ¡r_1 - - gCC_NOTUSED - = { - -11 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -15  -a¢_TYPE_memb”_t - - ga¢_MBR_QoSID_1 -[] = { - -16 { -ATF_NOFLAGS -, 0, -off£tof -( -QoSID -, -choiû -. -fiveGC -), - -17 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -19 & -a¢_DEF_FiveQI -, - -25 { -ATF_NOFLAGS -, 0, -off£tof -( -QoSID -, -choiû -. -ePC -), - -26 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -28 & -a¢_DEF_QCI -, - -35 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_QoSID_g2–_1 -[] = { - -36 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -37 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -39  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_QoSID_¥ecs_1 - = { - -40 ( -QoSID -), - -41 -off£tof -( -QoSID -, -_a¢_ùx -), - -42 -off£tof -( -QoSID -, -´e£Á -), - -43 ((( -QoSID - *)0)-> -´e£Á -), - -44 -a¢_MAP_QoSID_g2–_1 -, - -49 -a¢_TYPE_desütÜ_t - - ga¢_DEF_QoSID - = { - -52 & -a¢_OP_CHOICE -, - -57 { 0, & -a¢_PER_ty³_QoSID_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -58 -a¢_MBR_QoSID_1 -, - -60 & -a¢_SPC_QoSID_¥ecs_1 - - - @QosFlowIdentifier.c - -8  - ~"QosFlowId’tif›r.h -" - -11 - $QosFlowId’tif›r_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 0 && value <= 63)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_QosFlowId’tif›r_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 6, 6, 0, 63 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_QosFlowId’tif›r_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_QosFlowId’tif›r - = { - -50 & -a¢_OP_N©iveIÁeg” -, - -51 -a¢_DEF_QosFlowId’tif›r_gs_1 -, - -52 ( -a¢_DEF_QosFlowId’tif›r_gs_1 -) - -53 /( -a¢_DEF_QosFlowId’tif›r_gs_1 -[0]), - -54 -a¢_DEF_QosFlowId’tif›r_gs_1 -, - -55 ( -a¢_DEF_QosFlowId’tif›r_gs_1 -) - -56 /( -a¢_DEF_QosFlowId’tif›r_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_QosFlowId’tif›r_cÚ¡r_1 -, -QosFlowId’tif›r_cÚ¡¿št - }, - - @RANUEID.c - -8  - ~"RANUEID.h -" - -11 - $RANUEID_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 -size - = -¡ -->size; - -25 if(( -size - == 8)) { - -29 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -31 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -34 - } -} - -40 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_RANUEID_cÚ¡r_1 - - gCC_NOTUSED - = { - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -42 { -APC_CONSTRAINED -, 0, 0, 8, 8 } , - -45 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_RANUEID_gs_1 -[] = { - -46 ( -ASN_TAG_CLASS_UNIVERSAL - | (4 << 2)) - -48 -a¢_TYPE_desütÜ_t - - ga¢_DEF_RANUEID - = { - -51 & -a¢_OP_OCTET_STRING -, - -52 -a¢_DEF_RANUEID_gs_1 -, - -53 ( -a¢_DEF_RANUEID_gs_1 -) - -54 /( -a¢_DEF_RANUEID_gs_1 -[0]), - -55 -a¢_DEF_RANUEID_gs_1 -, - -56 ( -a¢_DEF_RANUEID_gs_1 -) - -57 /( -a¢_DEF_RANUEID_gs_1 -[0]), - -58 { 0, & -a¢_PER_ty³_RANUEID_cÚ¡r_1 -, -RANUEID_cÚ¡¿št - }, - -60 & -a¢_SPC_OCTET_STRING_¥ecs - - - @RANfunction-Name.c - -8  - ~"RANfunùiÚ-Name.h -" - -10 cÚ¡  - g³rm™‹d_®phab‘_bË_2 -[256] = { - -20 cÚ¡  - g³rm™‹d_®phab‘_code2v®ue_2 -[74] = { - -28  - $check_³rm™‹d_®phab‘_2 -(cÚ¡ * -¥Œ -) { - -29 cÚ¡ * -bË - = -³rm™‹d_®phab‘_bË_2 -; - -31 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -32 cÚ¡ -ušt8_t - * -ch - = -¡ --> -buf -; - -33 cÚ¡ -ušt8_t - * -’d - = -ch - + -¡ --> -size -; - -35 ; -ch - < -’d -; ch++) { - -36 -ušt8_t - -cv - = * -ch -; - -37 if(! -bË -[ -cv -])  -1; - -40 - } -} - -42 cÚ¡  - g³rm™‹d_®phab‘_bË_3 -[256] = { - -52 cÚ¡  - g³rm™‹d_®phab‘_code2v®ue_3 -[74] = { - -60  - $check_³rm™‹d_®phab‘_3 -(cÚ¡ * -¥Œ -) { - -61 cÚ¡ * -bË - = -³rm™‹d_®phab‘_bË_3 -; - -63 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -64 cÚ¡ -ušt8_t - * -ch - = -¡ --> -buf -; - -65 cÚ¡ -ušt8_t - * -’d - = -ch - + -¡ --> -size -; - -67 ; -ch - < -’d -; ch++) { - -68 -ušt8_t - -cv - = * -ch -; - -69 if(! -bË -[ -cv -])  -1; - -72 - } -} - -74 cÚ¡  - g³rm™‹d_®phab‘_bË_4 -[256] = { - -84 cÚ¡  - g³rm™‹d_®phab‘_code2v®ue_4 -[74] = { - -92  - $check_³rm™‹d_®phab‘_4 -(cÚ¡ * -¥Œ -) { - -93 cÚ¡ * -bË - = -³rm™‹d_®phab‘_bË_4 -; - -95 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -96 cÚ¡ -ušt8_t - * -ch - = -¡ --> -buf -; - -97 cÚ¡ -ušt8_t - * -’d - = -ch - + -¡ --> -size -; - -99 ; -ch - < -’d -; ch++) { - -100 -ušt8_t - -cv - = * -ch -; - -101 if(! -bË -[ -cv -])  -1; - -104 - } -} - -107 - $memb_¿nFunùiÚ_ShÜtName_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -108 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -109 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -110 -size_t - -size -; - -112 if(! -¥Œ -) { - -113 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -115 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -119 -size - = -¡ -->size; - -121 if(( -size - >= 1 && size <= 150) - -122 && ! - `check_³rm™‹d_®phab‘_2 -( -¡ -)) { - -126 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -128 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -131 - } -} - -133  - $a¢_PER_MAP_¿nFunùiÚ_ShÜtName_2_v2c -( -v®ue -) { - -134 if( -v®ue - >ð( -³rm™‹d_®phab‘_bË_2 -)/(permitted_alphabet_table_2[0])) - -136  -³rm™‹d_®phab‘_bË_2 -[ -v®ue -] - 1; - -137 - } -} - -138  - $a¢_PER_MAP_¿nFunùiÚ_ShÜtName_2_c2v -( -code -) { - -139 if( -code - >ð( -³rm™‹d_®phab‘_code2v®ue_2 -)/(permitted_alphabet_code2value_2[0])) - -141  -³rm™‹d_®phab‘_code2v®ue_2 -[ -code -]; - -142 - } -} - -144 - $memb_¿nFunùiÚ_E2SM_OID_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -145 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -146 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -147 -size_t - -size -; - -149 if(! -¥Œ -) { - -150 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -152 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -156 -size - = -¡ -->size; - -158 if(( -size - >= 1 && size <= 1000) - -159 && ! - `check_³rm™‹d_®phab‘_3 -( -¡ -)) { - -163 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -165 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -168 - } -} - -170  - $a¢_PER_MAP_¿nFunùiÚ_E2SM_OID_3_v2c -( -v®ue -) { - -171 if( -v®ue - >ð( -³rm™‹d_®phab‘_bË_3 -)/(permitted_alphabet_table_3[0])) - -173  -³rm™‹d_®phab‘_bË_3 -[ -v®ue -] - 1; - -174 - } -} - -175  - $a¢_PER_MAP_¿nFunùiÚ_E2SM_OID_3_c2v -( -code -) { - -176 if( -code - >ð( -³rm™‹d_®phab‘_code2v®ue_3 -)/(permitted_alphabet_code2value_3[0])) - -178  -³rm™‹d_®phab‘_code2v®ue_3 -[ -code -]; - -179 - } -} - -181 - $memb_¿nFunùiÚ_DesütiÚ_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -182 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -183 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -184 -size_t - -size -; - -186 if(! -¥Œ -) { - -187 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -189 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -193 -size - = -¡ -->size; - -195 if(( -size - >= 1 && size <= 150) - -196 && ! - `check_³rm™‹d_®phab‘_4 -( -¡ -)) { - -200 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -202 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -205 - } -} - -207  - $a¢_PER_MAP_¿nFunùiÚ_DesütiÚ_4_v2c -( -v®ue -) { - -208 if( -v®ue - >ð( -³rm™‹d_®phab‘_bË_4 -)/(permitted_alphabet_table_4[0])) - -210  -³rm™‹d_®phab‘_bË_4 -[ -v®ue -] - 1; - -211 - } -} - -212  - $a¢_PER_MAP_¿nFunùiÚ_DesütiÚ_4_c2v -( -code -) { - -213 if( -code - >ð( -³rm™‹d_®phab‘_code2v®ue_4 -)/(permitted_alphabet_code2value_4[0])) - -215  -³rm™‹d_®phab‘_code2v®ue_4 -[ -code -]; - -216 - } -} - -217  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_¿nFunùiÚ_ShÜtName_cÚ¡r_2 - - gCC_NOTUSED - = { - -218 { -APC_CONSTRAINED -, 7, 7, 32, 122 } , - -219 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 8, 8, 1, 150 } , - -220 -a¢_PER_MAP_¿nFunùiÚ_ShÜtName_2_v2c -, - -221 -a¢_PER_MAP_¿nFunùiÚ_ShÜtName_2_c2v - - -223  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_¿nFunùiÚ_E2SM_OID_cÚ¡r_3 - - gCC_NOTUSED - = { - -224 { -APC_CONSTRAINED -, 7, 7, 32, 122 } , - -225 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 10, 10, 1, 1000 } , - -226 -a¢_PER_MAP_¿nFunùiÚ_E2SM_OID_3_v2c -, - -227 -a¢_PER_MAP_¿nFunùiÚ_E2SM_OID_3_c2v - - -229  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_¿nFunùiÚ_DesütiÚ_cÚ¡r_4 - - gCC_NOTUSED - = { - -230 { -APC_CONSTRAINED -, 7, 7, 32, 122 } , - -231 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 8, 8, 1, 150 } , - -232 -a¢_PER_MAP_¿nFunùiÚ_DesütiÚ_4_v2c -, - -233 -a¢_PER_MAP_¿nFunùiÚ_DesütiÚ_4_c2v - - -235 -a¢_TYPE_memb”_t - - ga¢_MBR_RANfunùiÚ_Name_1 -[] = { - -236 { -ATF_NOFLAGS -, 0, -off£tof -( -RANfunùiÚ_Name -, -¿nFunùiÚ_ShÜtName -), - -237 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -239 & -a¢_DEF_PršbËSŒšg -, - -241 { 0, & -a¢_PER_memb_¿nFunùiÚ_ShÜtName_cÚ¡r_2 -, -memb_¿nFunùiÚ_ShÜtName_cÚ¡¿št_1 - }, - -245 { -ATF_NOFLAGS -, 0, -off£tof -( -RANfunùiÚ_Name -, -¿nFunùiÚ_E2SM_OID -), - -246 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -248 & -a¢_DEF_PršbËSŒšg -, - -250 { 0, & -a¢_PER_memb_¿nFunùiÚ_E2SM_OID_cÚ¡r_3 -, -memb_¿nFunùiÚ_E2SM_OID_cÚ¡¿št_1 - }, - -254 { -ATF_NOFLAGS -, 0, -off£tof -( -RANfunùiÚ_Name -, -¿nFunùiÚ_DesütiÚ -), - -255 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -257 & -a¢_DEF_PršbËSŒšg -, - -259 { 0, & -a¢_PER_memb_¿nFunùiÚ_DesütiÚ_cÚ¡r_4 -, -memb_¿nFunùiÚ_DesütiÚ_cÚ¡¿št_1 - }, - -263 { -ATF_POINTER -, 1, -off£tof -( -RANfunùiÚ_Name -, -¿nFunùiÚ_In¡ªû -), - -264 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -266 & -a¢_DEF_N©iveIÁeg” -, - -273 cÚ¡  - ga¢_MAP_RANfunùiÚ_Name_oms_1 -[] = { 3 }; - -274 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_RANfunùiÚ_Name_gs_1 -[] = { - -275 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -277 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_RANfunùiÚ_Name_g2–_1 -[] = { - -278 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -279 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -280 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -281 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 } - -283 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_RANfunùiÚ_Name_¥ecs_1 - = { - -284 ( -RANfunùiÚ_Name -), - -285 -off£tof -( -RANfunùiÚ_Name -, -_a¢_ùx -), - -286 -a¢_MAP_RANfunùiÚ_Name_g2–_1 -, - -288 -a¢_MAP_RANfunùiÚ_Name_oms_1 -, - -292 -a¢_TYPE_desütÜ_t - - ga¢_DEF_RANfunùiÚ_Name - = { - -295 & -a¢_OP_SEQUENCE -, - -296 -a¢_DEF_RANfunùiÚ_Name_gs_1 -, - -297 ( -a¢_DEF_RANfunùiÚ_Name_gs_1 -) - -298 /( -a¢_DEF_RANfunùiÚ_Name_gs_1 -[0]), - -299 -a¢_DEF_RANfunùiÚ_Name_gs_1 -, - -300 ( -a¢_DEF_RANfunùiÚ_Name_gs_1 -) - -301 /( -a¢_DEF_RANfunùiÚ_Name_gs_1 -[0]), - -302 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -303 -a¢_MBR_RANfunùiÚ_Name_1 -, - -305 & -a¢_SPC_RANfunùiÚ_Name_¥ecs_1 - - - @REAL.c - -5  - #_ISOC99_SOURCE - - - ) - -6 #iâdeà -_BSD_SOURCE - - -7  - #_BSD_SOURCE - - - ) - -9  - ~ - -10 #if -defšed -( -__®pha -) - -11  - ~ - -13  - ~<¡dlib.h -> - -14  - ~ - -15  - ~<æßt.h -> - -16  - ~<”ºo.h -> - -17  - ~ - -18  - ~ - -20 #undeà -INT_MAX - - -21  - #INT_MAX - (()((()-1è>> 1)) - - ) - -23 #if !( -defšed -( -NAN -è|| defšed( -INFINITY -)) - -24 vÞ©ž -»®_z”o - - gCC_NOTUSED - = 0.0; - -26 #iâdef -NAN - - -27  - #NAN - (0.0/0.0) - - ) - -29 #iâdef -INFINITY - - -30  - #INFINITY - (1.0/0.0) - - ) - -33 #ià -defšed -( -__þªg__ -) - -41 #´agm¨ -þªg - -dŸgno¡ic - -push - - -42 #´agm¨ -þªg - -dŸgno¡ic - -ignÜed - "-Wc11-extensions" - -43  - $a¢_i¢ª -( -d -) { - -44  - `i¢ª -( -d -); - -45 - } -} - -46  - $a¢_isfš™e -( -d -) { - -47 #ifdeà -isfš™e - - -48  - `isfš™e -( -d -); - -50  - `fš™e -( -d -); - -52 - } -} - -53 #´agm¨ -þªg - -dŸgno¡ic - -pÝ - - -55  - #a¢_i¢ª -( -v -è - `i¢ª -(v) - - ) - -56 #ifdeà -isfš™e - - -57  - #a¢_isfš™e -( -d -è - `isfš™e -(dè - - ) - -59  - #a¢_isfš™e -( -d -è - `fš™e -(dè - - ) - -66 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_REAL_gs -[] = { - -67 ( -ASN_TAG_CLASS_UNIVERSAL - | (9 << 2)) - -69 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_REAL - = { - -70 -ASN__PRIMITIVE_TYPE_ä“ -, - -71 -REAL_´št -, - -72 -REAL_com·» -, - -73 -b”_decode_´im™ive -, - -74 -d”_’code_´im™ive -, - -75 -REAL_decode_x” -, - -76 -REAL_’code_x” -, - -77 #ifdef -ASN_DISABLE_OER_SUPPORT - - -81 -REAL_decode_Ûr -, - -82 -REAL_’code_Ûr -, - -84 #ifdef -ASN_DISABLE_PER_SUPPORT - - -90 -REAL_decode_u³r -, - -91 -REAL_’code_u³r -, - -92 -REAL_decode_­” -, - -93 -REAL_’code_­” -, - -95 -REAL_¿ndom_fžl -, - -98 -a¢_TYPE_desütÜ_t - - ga¢_DEF_REAL - = { - -101 & -a¢_OP_REAL -, - -102 -a¢_DEF_REAL_gs -, - -103 ( -a¢_DEF_REAL_gs -) / (asn_DEF_REAL_tags[0]), - -104 -a¢_DEF_REAL_gs -, - -105 ( -a¢_DEF_REAL_gs -) / (asn_DEF_REAL_tags[0]), - -106 { 0, 0, -a¢_g’”ic_no_cÚ¡¿št - }, - -112  - e¥ecŸlR—lV®ue - { - -113 - mSRV__NOT_A_NUMBER -, - -114 - mSRV__MINUS_INFINITY -, - -115 - mSRV__PLUS_INFINITY - - -116 } - t¥ecŸlR—lV®ue_e -; - -117  - s¥ecŸlR—lV®ue_s - { - -118 * - m¡ršg -; - -119 -size_t - - mËngth -; - -120  - mdv -; - -121 } - g¥ecŸlR—lV®ue -[] = { - -122  - #SRV_SET -( -foo -, -v® -è{ foo, (fooè- 1, v® } - - ) - -123 -SRV_SET -("", 0), - -124 -SRV_SET -("", -1), - -125 -SRV_SET -("", 1), - -126 #undeà -SRV_SET - - -129 -ssize_t - - -130 - $REAL__dump -( -d -,  -ÿnÚiÿl -, -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -131  -loÿl_buf -[64]; - -132 * -buf - = -loÿl_buf -; - -133 -ssize_t - -buæ’ - = ( -loÿl_buf -); - -134 cÚ¡ * -fmt - = -ÿnÚiÿl - ? "%.17E" : "%.15f" ; - -135 -ssize_t - -»t -; - -141 if( - `a¢_i¢ª -( -d -)) { - -142 -buf - = -¥ecŸlR—lV®ue -[ -SRV__NOT_A_NUMBER -]. -¡ršg -; - -143 -buæ’ - = -¥ecŸlR—lV®ue -[ -SRV__NOT_A_NUMBER -]. -Ëngth -; - -144  ( - `cb -( -buf -, -buæ’ -, -­p_key -) < 0) ? -1 : buflen; - -145 } if(! - `a¢_isfš™e -( -d -)) { - -146 if( - `cÝysign -(1.0, -d -) < 0.0) { - -147 -buf - = -¥ecŸlR—lV®ue -[ -SRV__MINUS_INFINITY -]. -¡ršg -; - -148 -buæ’ - = -¥ecŸlR—lV®ue -[ -SRV__MINUS_INFINITY -]. -Ëngth -; - -150 -buf - = -¥ecŸlR—lV®ue -[ -SRV__PLUS_INFINITY -]. -¡ršg -; - -151 -buæ’ - = -¥ecŸlR—lV®ue -[ -SRV__PLUS_INFINITY -]. -Ëngth -; - -153  ( - `cb -( -buf -, -buæ’ -, -­p_key -) < 0) ? -1 : buflen; - -154 } if( - `žogb -( -d -è<ð- -INT_MAX -) { - -155 if( - `cÝysign -(1.0, -d -) < 0.0) { - -156 -buf - = "-0"; - -157 -buæ’ - = 2; - -159 -buf - = "0"; - -160 -buæ’ - = 1; - -162  ( - `cb -( -buf -, -buæ’ -, -­p_key -) < 0) ? -1 : buflen; - -169 -»t - = - `¢´štf -( -buf -, -buæ’ -, -fmt -, -d -); - -170 if( -»t - < 0) { - -172 -buæ’ - <<= 1; - -173 if( -buæ’ - > 4096) { - -175 if( -buf - !ð -loÿl_buf -è - `FREEMEM -(buf); - -178 } if( -»t - >ð -buæ’ -) { - -179 -buæ’ - = -»t - + 1; - -181 -buæ’ - = -»t -; - -184 if( -buf - !ð -loÿl_buf -è - `FREEMEM -(buf); - -185 -buf - = (*) - `MALLOC -( -buæ’ -); - -186 if(! -buf -)  -1; - -189 if( -ÿnÚiÿl -) { - -194 * -dÙ -; - -195 * -’d - = -buf - + -buæ’ -; - -196 * -Ï¡_z”o -; - -197 * -fœ¡_z”o_š_run -; - -198 * -s -; - -201 -LZSTATE_NOTHING -, - -202 -LZSTATE_ZEROES - - -203 } -lz_¡©e - = -LZSTATE_NOTHING -; - -205 -dÙ - = ( -buf -[0] == 0x2d ) ? (buf + 2) : (buf + 1); - -206 if(* -dÙ - >= 0x30) { - -207 if( -buf - !ð -loÿl_buf -è - `FREEMEM -(buf); - -208 -”ºo - = -EINVAL -; - -211 * -dÙ - = 0x2e; - -213  -fœ¡_z”o_š_run - = -Ï¡_z”o - = -s - = -dÙ - + 2; s < -’d -; s++) { - -214 * -s -) { - -216 if( -lz_¡©e - =ð -LZSTATE_ZEROES -è -Ï¡_z”o - = -fœ¡_z”o_š_run -; - -219 if( -lz_¡©e - =ð -LZSTATE_NOTHING -è -fœ¡_z”o_š_run - = -s -; - -220 -lz_¡©e - = -LZSTATE_ZEROES -; - -223 -lz_¡©e - = -LZSTATE_NOTHING -; - -229 if( -s - =ð -’d -) { - -230 if( -buf - !ð -loÿl_buf -è - `FREEMEM -(buf); - -231 -”ºo - = -EINVAL -; - -235 - `as£¹ -(* -s - == 0x45); - -237 * -E - = -s -; - -238 * -exµŒ - = ++ -E -; - -239 * -s - = -exµŒ -; - -240  -sign -; - -242 if(* -exµŒ - == 0x2b ) { - -244 -buæ’ - -= 1; - -245 -sign - = 0; - -247 -sign - = 1; - -248 -s -++; - -250 -exµŒ -++; - -251 if( -exµŒ - > -’d -) { - -252 if( -buf - !ð -loÿl_buf -è - `FREEMEM -(buf); - -253 -”ºo - = -EINVAL -; - -256 if(* -exµŒ - == 0x30) { - -257 -buæ’ ---; - -258 -exµŒ -++; - -260 if( -lz_¡©e - =ð -LZSTATE_ZEROES -) { - -261 * -Ï¡_z”o - = 0x45; - -262 -buæ’ - -ð -s - - ( -Ï¡_z”o - + 1); - -263 -s - = -Ï¡_z”o - + 1; - -264 if( -sign -) { - -265 * -s -++ = 0x2d ; - -266 -buæ’ -++; - -269 ; -exµŒ - <ð -’d -; -s -++,ƒxpptr++) - -270 * -s - = * -exµŒ -; - -276 * -’d - = -buf - + -buæ’ -; - -277 * -Ï¡_z”o - = -’d -; - -278  -¡Ýlookšg - = 0; - -279 * -z -; - -280  -z - = -’d - - 1; z > -buf -; z--) { - -281 * -z -) { - -283 if(! -¡Ýlookšg -) - -284 -Ï¡_z”o - = -z -; - -288 -¡Ýlookšg - = 1; - -295 * -z - = 0x2e; - -296 if( -Ï¡_z”o - =ð -z - + 1) { - -297 -Ï¡_z”o -++; - -299 -buæ’ - = -Ï¡_z”o - - -buf -; - -300 * -Ï¡_z”o - = '\0'; - -307 -»t - = - `cb -( -buf -, -buæ’ -, -­p_key -); - -308 if( -buf - !ð -loÿl_buf -è - `FREEMEM -(buf); - -309  ( -»t - < 0è? -1 : -buæ’ -; - -310 - } -} - -313 - $REAL_´št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -314 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -315 cÚ¡ -REAL_t - * -¡ - = (cÚ¡ REAL_ˆ*) -¥Œ -; - -316 -ssize_t - -»t -; - -317  -d -; - -319 () -td -; - -320 () -žev– -; - -322 if(! -¡ - || !¡-> -buf -) - -323 -»t - = - `cb -("", 8, -­p_key -); - -324 if( - `a¢_REAL2doubË -( -¡ -, & -d -)) - -325 -»t - = - `cb -("<”rÜ>", 7, -­p_key -); - -327 -»t - = - `REAL__dump -( -d -, 0, -cb -, -­p_key -); - -329  ( -»t - < 0) ? -1 : 0; - -330 - } -} - -333 - $REAL_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -­Œ -, - -334 cÚ¡ * -b±r -) { - -335 cÚ¡ -REAL_t - * -a - = -­Œ -; - -336 cÚ¡ -REAL_t - * -b - = -b±r -; - -338 () -td -; - -340 if( -a - && -b -) { - -341  -adbl -, -bdbl -; - -342  -¿ -, -rb -; - -343 -¿ - = - `a¢_REAL2doubË -( -a -, & -adbl -); - -344 -rb - = - `a¢_REAL2doubË -( -b -, & -bdbl -); - -345 if( -¿ - =ð0 && -rb - == 0) { - -346 if( - `a¢_i¢ª -( -adbl -)) { - -347 if( - `a¢_i¢ª -( -bdbl -)) { - -352 } if( - `a¢_i¢ª -( -bdbl -)) { - -356 if( -adbl - < -bdbl -) { - -358 } if( -adbl - > -bdbl -) { - -363 } if( -¿ -) { - -368 } if(! -a -) { - -373 - } -} - -375 -a¢_’c_rv®_t - - -376 - $REAL_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -377 -x”_’cod”_æags_e - -æags -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -378 * -­p_key -) { - -379 cÚ¡ -REAL_t - * -¡ - = (cÚ¡ REAL_ˆ*) -¥Œ -; - -380 -a¢_’c_rv®_t - -” - = {0,0,0}; - -381  -d -; - -383 () -žev– -; - -385 if(! -¡ - || !¡-> -buf - || - `a¢_REAL2doubË -(¡, & -d -)) - -386 -ASN__ENCODE_FAILED -; - -388 -” -. -’coded - = - `REAL__dump -( -d -, -æags - & -XER_F_CANONICAL -, -cb -, -­p_key -); - -389 if( -” -. -’coded - < 0è -ASN__ENCODE_FAILED -; - -391 - `ASN__ENCODED_OK -( -” -); - -392 - } -} - -398  -x”_pbd_rv® - - -399 - $REAL__x”_body_decode -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -400 cÚ¡ * -chunk_buf -, -size_t - -chunk_size -) { - -401 -REAL_t - * -¡ - = (REAL_ˆ*) -¥Œ -; - -402  -v®ue -; - -403 cÚ¡ * -x”d©a - = (cÚ¡ *) -chunk_buf -; - -404 * -’d±r - = 0; - -405 * -b -; - -407 () -td -; - -409 if(! -chunk_size -è -XPBD_BROKEN_ENCODING -; - -414 if( -x”d©a -[0] == 0x3c ) { - -415 -size_t - -i -; - -416  -i - = 0; i < ( -¥ecŸlR—lV®ue -) - -417 / ( -¥ecŸlR—lV®ue -[0]); -i -++) { - -418  -¥ecŸlR—lV®ue_s - * -¤v - = & -¥ecŸlR—lV®ue -[ -i -]; - -419  -dv -; - -421 if( -¤v --> -Ëngth - !ð -chunk_size - - -422 || - `memcmp -( -¤v --> -¡ršg -, -chunk_buf -, -chunk_size -)) - -430  -¤v --> -dv -) { - -431 -1: -dv - = - -INFINITY -; ; - -432 0: -dv - = -NAN -; ; - -433 1: -dv - = -INFINITY -; ; - -434 :  -XPBD_SYSTEM_FAILURE -; - -437 if( - `a¢_doubË2REAL -( -¡ -, -dv -)) - -438  -XPBD_SYSTEM_FAILURE -; - -440  -XPBD_BODY_CONSUMED -; - -442 - `ASN_DEBUG -("Unknown XMLSpecialRealValue"); - -443  -XPBD_BROKEN_ENCODING -; - -449 -b - = (*) - `MALLOC -( -chunk_size - + 1); - -450 if(! -b -è -XPBD_SYSTEM_FAILURE -; - -451 - `memýy -( -b -, -chunk_buf -, -chunk_size -); - -452 -b -[ -chunk_size -] = 0; - -454 -v®ue - = - `¡¹od -( -b -, & -’d±r -); - -455 - `FREEMEM -( -b -); - -456 if( -’d±r - =ð -b -è -XPBD_BROKEN_ENCODING -; - -458 if( - `a¢_doubË2REAL -( -¡ -, -v®ue -)) - -459  -XPBD_SYSTEM_FAILURE -; - -461  -XPBD_BODY_CONSUMED -; - -462 - } -} - -464 -a¢_dec_rv®_t - - -465 - $REAL_decode_x” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -466 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -467 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, -size_t - -size -) { - -468  - `x”_decode_´im™ive -( -Ýt_codec_ùx -, -td -, - -469 -¥Œ -, ( -REAL_t -), -Ýt_mÇme -, - -470 -buf_±r -, -size -, -REAL__x”_body_decode -); - -471 - } -} - -474 - $a¢_REAL2doubË -(cÚ¡ -REAL_t - * -¡ -, * -dbl_v®ue -) { - -475  -oùv -; - -477 if(! -¡ - || !¡-> -buf -) { - -478 -”ºo - = -EINVAL -; - -482 if( -¡ --> -size - == 0) { - -483 * -dbl_v®ue - = 0; - -487 -oùv - = -¡ --> -buf -[0]; - -489  -oùv - & 0xC0) { - -498  -¡ --> -buf -[0]) { - -500 * -dbl_v®ue - = -INFINITY -; - -503 * -dbl_v®ue - = - -INFINITY -; - -506 * -dbl_v®ue - = -NAN -; - -509 * -dbl_v®ue - = -0.0; - -513 -”ºo - = -EINVAL -; - -522  -d -; - -523 * -sourû - = 0; - -524 * -’d±r -; - -525  -u£d_m®loc - = 0; - -527 if( -oùv - == 0 || (octv & 0x3C)) { - -529 -”ºo - = -EINVAL -; - -539 if( -¡ --> -buf -[¡-> -size -] !ð'\0' || - `memchr -(st->buf, ',', st->size)) { - -540 cÚ¡ -ušt8_t - * -p -, * -’d -; - -541 * -b -; - -543 -b - = -sourû - = (*) - `MALLOC -( -¡ --> -size - + 1); - -544 if(! -sourû -)  -1; - -545 -u£d_m®loc - = 1; - -548  -p - = -¡ --> -buf - + 1, -’d - = st->buà+ st-> -size -; - -549 -p - < -’d -; -b -++,…++) - -550 * -b - = (* -p - == ',') ? '.' : *p; - -551 * -b - = '\0'; - -553 -sourû - = (*)& -¡ --> -buf -[1]; - -556 -’d±r - = -sourû -; - -557 -d - = - `¡¹od -( -sourû -, & -’d±r -); - -558 if(* -’d±r - != '\0') { - -560 if( -u£d_m®loc -è - `FREEMEM -( -sourû -); - -561 -”ºo - = -EINVAL -; - -564 if( -u£d_m®loc -è - `FREEMEM -( -sourû -); - -565 if( - `a¢_isfš™e -( -d -)) { - -566 * -dbl_v®ue - = -d -; - -569 -”ºo - = -ERANGE -; - -579  -m -; - -580 -št32_t - -expv® -; - -581  -–’ -; - -582  -sÿËF -; - -583  -ba£F -; - -584 -ušt8_t - * -±r -; - -585 -ušt8_t - * -’d -; - -586  -sign -; - -588 ( -oùv - & 0x30) >> 4) { - -589 0x00: -ba£F - = 1; ; - -590 0x01: -ba£F - = 3; ; - -591 0x02: -ba£F - = 4; ; - -594 -”ºo - = -EINVAL -; - -598 -sign - = ( -oùv - & 0x40); - -599 -sÿËF - = ( -oùv - & 0x0C) >> 2; - -601 if( -¡ --> -size - <ð1 + ( -oùv - & 0x03)) { - -602 -”ºo - = -EINVAL -; - -606 -–’ - = ( -oùv - & 0x03); - -607 if( -–’ - == 0x03) { - -608 -–’ - = -¡ --> -buf -[1]; - -609 if( -–’ - =ð0 || -¡ --> -size - <= (2 +ƒlen)) { - -610 -”ºo - = -EINVAL -; - -614 -±r - = & -¡ --> -buf -[2]; - -616 -±r - = & -¡ --> -buf -[1]; - -620 -expv® - = ()(*( -št8_t - *) -±r -); - -621 if( -–’ - >ð( -expv® -)-1) { - -622 -”ºo - = -ERANGE -; - -625 -’d - = -±r - + -–’ - + 1; - -626  -±r -++;…Œ < -’d -;…tr++) - -627 -expv® - = (expv® * 256è+ * -±r -; - -629 -m - = 0.0; - -632 -’d - = -¡ --> -buf - + st-> -size -; - -633 ; -±r - < -’d -;…tr++) - -634 -m - = - `ldexp -(m, 8è+ * -±r -; - -637 - `ASN_DEBUG -("m=%.10f, scF=%d, bF=%d,ƒxpval=%d,†dexp()=%f,†dexp()=%f\n", - -638 -m -, -sÿËF -, -ba£F -, -expv® -, - -639 - `ldexp -( -m -, -expv® - * -ba£F - + -sÿËF -), - -640 - `ldexp -( -m -, -sÿËF -è* - `pow -Õow(2, -ba£F -), -expv® -) - -648 -m - = - `ldexp -(m, -expv® - * -ba£F - + -sÿËF -); - -649 if( - `a¢_isfš™e -( -m -)) { - -650 * -dbl_v®ue - = -sign - ? - -m - : m; - -652 -”ºo - = -ERANGE -; - -659 - } -} - -666 - $a¢_doubË2REAL -( -REAL_t - * -¡ -,  -dbl_v®ue -) { - -667  -‹¡ - = -0.0; - -668  -æßt_big_’dŸn - = *(cÚ¡ *)& -‹¡ - != 0; - -669 -ušt8_t - -buf -[16]; - -670 -ušt8_t - -dsü -[( -dbl_v®ue -)]; - -672  -as£¹iÚ_bufãr1 -[9 - ( -dbl_v®ue -)] -CC_NOTUSED -; - -673  -as£¹iÚ_bufãr2 -[( -dbl_v®ue -è- 7] -CC_NOTUSED -; - -674 -ušt8_t - * -±r - = -buf -; - -675 -ušt8_t - * -m¡Ý -; - -676  -mv® -; - -677  -bmsign -; - -678  -buæ’ -; - -679  -accum -; - -680  -expv® -; - -682 if(! -¡ -) { - -683 -”ºo - = -EINVAL -; - -692 -expv® - = - `žogb -( -dbl_v®ue -); - -693 if( -expv® - <ð- -INT_MAX - - -694 || -expv® - =ð -INT_MAX - - -696 if(! -¡ --> -buf - || st-> -size - < 2) { - -697 -±r - = ( -ušt8_t - *) - `MALLOC -(2); - -698 if(! -±r -)  -1; - -699 if( -¡ --> -buf -è - `FREEMEM -(st->buf); - -700 -¡ --> -buf - = -±r -; - -703 if( - `a¢_i¢ª -( -dbl_v®ue -)) { - -704 -¡ --> -buf -[0] = 0x42; - -705 -¡ --> -buf -[1] = 0; - -706 -¡ --> -size - = 1; - -707 } if(! - `a¢_isfš™e -( -dbl_v®ue -)) { - -708 if( - `cÝysign -(1.0, -dbl_v®ue -) < 0.0) { - -709 -¡ --> -buf -[0] = 0x41; - -711 -¡ --> -buf -[0] = 0x40; - -713 -¡ --> -buf -[1] = 0; - -714 -¡ --> -size - = 1; - -716 if( - `cÝysign -(1.0, -dbl_v®ue -) >= 0.0) { - -718 -¡ --> -buf -[0] = 0; - -719 -¡ --> -size - = 0; - -722 -¡ --> -buf -[0] = 0x43; - -723 -¡ --> -buf -[1] = 0; - -724 -¡ --> -size - = 1; - -730 if( -æßt_big_’dŸn -) { - -731 -ušt8_t - * -s - = ((ušt8_ˆ*)& -dbl_v®ue -) + 1; - -732 -ušt8_t - * -’d - = ((ušt8_ˆ*)& -dbl_v®ue -) + (); - -733 -ušt8_t - * -d -; - -735 -bmsign - = 0x80 | (( -s -[-1] >> 1) & 0x40); - -736  -m¡Ý - = -d - = -dsü -; -s - < -’d -; d++, s++) { - -737 * -d - = * -s -; - -738 if(* -d -è -m¡Ý - = d; - -741 -ušt8_t - * -s - = ((ušt8_ˆ*)& -dbl_v®ue -) + (dbl_value) - 2; - -742 -ušt8_t - * -¡¬t - = ((ušt8_ˆ*)& -dbl_v®ue -); - -743 -ušt8_t - * -d -; - -745 -bmsign - = 0x80 | (( -s -[1] >> 1) & 0x40); - -746  -m¡Ý - = -d - = -dsü -; -s - >ð -¡¬t -; d++, s--) { - -747 * -d - = * -s -; - -748 if(* -d -è -m¡Ý - = d; - -753 -dsü -[0] = 0x10 | (dscr[0] & 0x0f); - -756 -expv® - -ð8 * (( -m¡Ý - - -dsü -) + 1) - 4; - -759 -mv® - = * -m¡Ý -; - -760 if( -mv® - && !(mval & 1)) { - -761  -shiá_couÁ - = 1; - -762  -ishiá -; - -763 -ušt8_t - * -m±r -; - -768 if(!( -mv® - & 0x0f)) - -769 -shiá_couÁ - = 4; - -770 (( -mv® - >> -shiá_couÁ -) & 1) == 0) - -771 -shiá_couÁ -++; - -773 -ishiá - = 8 - -shiá_couÁ -; - -774 -accum - = 0; - -777  -m±r - = -dsü -; m±¸<ð -m¡Ý -; mptr++) { - -778 -mv® - = * -m±r -; - -779 * -m±r - = -accum - | ( -mv® - >> -shiá_couÁ -); - -780 -accum - = -mv® - << -ishiá -; - -784 -expv® - +ð -shiá_couÁ -; - -787 if( -expv® - < 0) { - -788 if(( -expv® - >> 7) == -1) { - -789 * -±r -++ = -bmsign - | 0x00; - -790 * -±r -++ = -expv® -; - -791 } if(( -expv® - >> 15) == -1) { - -792 * -±r -++ = -bmsign - | 0x01; - -793 * -±r -++ = -expv® - >> 8; - -794 * -±r -++ = -expv® -; - -796 * -±r -++ = -bmsign - | 0x02; - -797 * -±r -++ = -expv® - >> 16; - -798 * -±r -++ = -expv® - >> 8; - -799 * -±r -++ = -expv® -; - -801 } if( -expv® - <= 0x7f) { - -802 * -±r -++ = -bmsign - | 0x00; - -803 * -±r -++ = -expv® -; - -804 } if( -expv® - <= 0x7fff) { - -805 * -±r -++ = -bmsign - | 0x01; - -806 * -±r -++ = -expv® - >> 8; - -807 * -±r -++ = -expv® -; - -809 - `as£¹ -( -expv® - <= 0x7fffff); - -810 * -±r -++ = -bmsign - | 0x02; - -811 * -±r -++ = -expv® - >> 16; - -812 * -±r -++ = -expv® - >> 8; - -813 * -±r -++ = -expv® -; - -816 -buæ’ - = ( -m¡Ý - - -dsü -) + 1; - -817 - `memýy -( -±r -, -dsü -, -buæ’ -); - -818 -±r - +ð -buæ’ -; - -819 -buæ’ - = -±r - - -buf -; - -821 -±r - = ( -ušt8_t - *) - `MALLOC -( -buæ’ - + 1); - -822 if(! -±r -)  -1; - -824 - `memýy -( -±r -, -buf -, -buæ’ -); - -825 -buf -[ -buæ’ -] = 0; - -827 if( -¡ --> -buf -è - `FREEMEM -(st->buf); - -828 -¡ --> -buf - = -±r -; - -829 -¡ --> -size - = -buæ’ -; - -832 - } -} - -834  -CC_ATTR_NO_SANITIZE -("float-cast-overflow") - -835 - $a¢_doubË2æßt -( -d -, * -outcome -) { - -836  -f - = -d -; - -838 * -outcome - = -f -; - -840 if( - `a¢_isfš™e -( -d -è=ða¢_isfš™e( -f -)) { - -845 - } -} - -847 #iâdeà -ASN_DISABLE_OER_SUPPORT - - -852 -a¢_’c_rv®_t - - -853 - $REAL_’code_Ûr -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -854 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -855 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -856 cÚ¡ -REAL_t - * -¡ - = -¥Œ -; - -857 -a¢_’c_rv®_t - -” - = {0,0,0}; - -858 -ssize_t - -Ën_Ën -; - -860 if(! -¡ - || !¡-> -buf - || ! -td -) - -861 -ASN__ENCODE_FAILED -; - -863 if(! -cÚ¡¿šts -ècÚ¡¿št ð -td --> -’codšg_cÚ¡¿šts -. -Ûr_cÚ¡¿šts -; - -864 if( -cÚ¡¿šts - && cÚ¡¿šts-> -v®ue -. -width - != 0) { - -867 -ASN__ENCODE_FAILED -; - -871 -Ën_Ën - = - `Ûr_£rŸlize_Ëngth -( -¡ --> -size -, -cb -, -­p_key -); - -872 if( -Ën_Ën - < 0 || - `cb -( -¡ --> -buf -, st-> -size -, -­p_key -) < 0) { - -873 -ASN__ENCODE_FAILED -; - -875 -” -. -’coded - = -Ën_Ën - + -¡ --> -size -; - -876 - `ASN__ENCODED_OK -( -” -); - -878 - } -} - -880 -a¢_dec_rv®_t - - -881 - $REAL_decode_Ûr -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -882 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -883 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -884 cÚ¡ * -±r -, -size_t - -size -) { - -885 -a¢_dec_rv®_t - -ok - = { -RC_OK -, 0}; - -886 -REAL_t - * -¡ -; - -887 -ušt8_t - * -buf -; - -888 -ssize_t - -Ën_Ën -; - -889 -size_t - -»®_body_Ën -; - -891 () -Ýt_codec_ùx -; - -893 if(! -cÚ¡¿šts -ècÚ¡¿št ð -td --> -’codšg_cÚ¡¿šts -. -Ûr_cÚ¡¿šts -; - -894 if( -cÚ¡¿šts - && cÚ¡¿šts-> -v®ue -. -width - != 0) { - -897 -ASN__DECODE_FAILED -; - -900 -Ën_Ën - = - `Ûr_ãtch_Ëngth -( -±r -, -size -, & -»®_body_Ën -); - -901 if( -Ën_Ën - < 0è -ASN__DECODE_FAILED -; - -902 if( -Ën_Ën - =ð0è -ASN__DECODE_STARVED -; - -904 -±r - = (cÚ¡ *íŒ + -Ën_Ën -; - -905 -size - -ð -Ën_Ën -; - -907 if( -»®_body_Ën - > -size -è -ASN__DECODE_STARVED -; - -909 -buf - = - `CALLOC -(1, -»®_body_Ën - + 1); - -910 if(! -buf -è -ASN__DECODE_FAILED -; - -912 if(!( -¡ - = * -¥Œ -)) { - -913 -¡ - = (* -¥Œ - = - `CALLOC -(1, ( -REAL_t -))); - -914 if(! -¡ -) { - -915 - `FREEMEM -( -buf -); - -916 -ASN__DECODE_FAILED -; - -919 - `FREEMEM -( -¡ --> -buf -); - -922 - `memýy -( -buf -, -±r -, -»®_body_Ën -); - -923 -buf -[ -»®_body_Ën -] = '\0'; - -925 -¡ --> -buf - = buf; - -926 -¡ --> -size - = -»®_body_Ën -; - -928 -ok -. -cÚsumed - = -Ën_Ën - + -»®_body_Ën -; - -929  -ok -; - -930 - } -} - -934 #iâdeà -ASN_DISABLE_PER_SUPPORT - - -936 -a¢_dec_rv®_t - - -937 - $REAL_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -938 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -939 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -940 -a¢_³r_d©a_t - * -pd -) { - -941 () -cÚ¡¿šts -; - -942  - `OCTET_STRING_decode_u³r -( -Ýt_codec_ùx -, -td -, 0, -¥Œ -, -pd -); - -943 - } -} - -945 -a¢_’c_rv®_t - - -946 - $REAL_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -947 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -948 -a¢_³r_ou_t - * -po -) { - -949 () -cÚ¡¿šts -; - -950  - `OCTET_STRING_’code_u³r -( -td -, 0, -¥Œ -, -po -); - -951 - } -} - -953 -a¢_dec_rv®_t - - -954 - $REAL_decode_­” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -955 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -956 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -957 ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -958 () -cÚ¡¿šts -; - -959  - `OCTET_STRING_decode_­” -( -Ýt_codec_ùx -, -td -, 0, -¥Œ -, -pd -); - -960 - } -} - -962 -a¢_’c_rv®_t - - -963 - $REAL_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -964 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -965 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -966 () -cÚ¡¿šts -; - -967  - `OCTET_STRING_’code_­” -( -td -, 0, -¥Œ -, -po -); - -968 - } -} - -972 -a¢_¿ndom_fžl_»suÉ_t - - -973 - $REAL_¿ndom_fžl -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -974 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -975 -size_t - -max_Ëngth -) { - -976 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_ok - = { -ARFILL_OK -, 1}; - -977 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_çžed - = { -ARFILL_FAILED -, 0}; - -978 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_sk³d - = { -ARFILL_SKIPPED -, 0}; - -979 cÚ¡  -v®ues -[] = { - -980 0, -0.0, -1, 1, - -M_E -, M_E, -3.14, 3.14, - -M_PI -, M_PI, -255, 255, - -987 - -FLT_MIN -, FLT_MIN, - -988 - -FLT_MAX -, FLT_MAX, - -989 - -DBL_MIN -, DBL_MIN, - -990 - -DBL_MAX -, DBL_MAX, - -991 #ifdeà -FLT_TRUE_MIN - - -992 - -FLT_TRUE_MIN -, FLT_TRUE_MIN, - -994 #ifdeà -DBL_TRUE_MIN - - -995 - -DBL_TRUE_MIN -, DBL_TRUE_MIN, - -997 -INFINITY -, -INFINITY, -NAN -}; - -998 -REAL_t - * -¡ -; - -999  -d -; - -1001 () -cÚ¡¿šts -; - -1003 if( -max_Ëngth - =ð0è -»suÉ_sk³d -; - -1005 -d - = -v®ues -[ - `a¢_¿ndom_b‘w“n -(0, (values) / (values[0]) - 1)]; - -1007 if(* -¥Œ -) { - -1008 -¡ - = * -¥Œ -; - -1010 -¡ - = ( -REAL_t -*)(* -¥Œ - = - `CALLOC -(1, (REAL_t))); - -1011 if(! -¡ -) { - -1012  -»suÉ_çžed -; - -1016 if( - `a¢_doubË2REAL -( -¡ -, -d -)) { - -1017 if( -¡ - =ð* -¥Œ -) { - -1018 - `ASN_STRUCT_RESET -(* -td -, -¡ -); - -1020 - `ASN_STRUCT_FREE -(* -td -, -¡ -); - -1022  -»suÉ_çžed -; - -1025 -»suÉ_ok -. -Ëngth - = -¡ --> -size -; - -1026  -»suÉ_ok -; - -1027 - } -} - - @RIC-EventTriggerStyle-Item.c - -8  - ~"RIC-Ev’tTrigg”StyË-I‹m.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_RIC_Ev’tTrigg”StyË_I‹m_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -RIC_Ev’tTrigg”StyË_I‹m -, -ric_Ev’tTrigg”StyË_Ty³ -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_RIC_StyË_Ty³ -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -RIC_Ev’tTrigg”StyË_I‹m -, -ric_Ev’tTrigg”StyË_Name -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_RIC_StyË_Name -, - -29 { -ATF_NOFLAGS -, 0, -off£tof -( -RIC_Ev’tTrigg”StyË_I‹m -, -ric_Ev’tTrigg”FÜm©_Ty³ -), - -30 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -32 & -a¢_DEF_RIC_FÜm©_Ty³ -, - -39 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_RIC_Ev’tTrigg”StyË_I‹m_gs_1 -[] = { - -40 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -42 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_RIC_Ev’tTrigg”StyË_I‹m_g2–_1 -[] = { - -43 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -44 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -45 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -47 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_RIC_Ev’tTrigg”StyË_I‹m_¥ecs_1 - = { - -48 ( -RIC_Ev’tTrigg”StyË_I‹m -), - -49 -off£tof -( -RIC_Ev’tTrigg”StyË_I‹m -, -_a¢_ùx -), - -50 -a¢_MAP_RIC_Ev’tTrigg”StyË_I‹m_g2–_1 -, - -55 -a¢_TYPE_desütÜ_t - - ga¢_DEF_RIC_Ev’tTrigg”StyË_I‹m - = { - -58 & -a¢_OP_SEQUENCE -, - -59 -a¢_DEF_RIC_Ev’tTrigg”StyË_I‹m_gs_1 -, - -60 ( -a¢_DEF_RIC_Ev’tTrigg”StyË_I‹m_gs_1 -) - -61 /( -a¢_DEF_RIC_Ev’tTrigg”StyË_I‹m_gs_1 -[0]), - -62 -a¢_DEF_RIC_Ev’tTrigg”StyË_I‹m_gs_1 -, - -63 ( -a¢_DEF_RIC_Ev’tTrigg”StyË_I‹m_gs_1 -) - -64 /( -a¢_DEF_RIC_Ev’tTrigg”StyË_I‹m_gs_1 -[0]), - -65 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -66 -a¢_MBR_RIC_Ev’tTrigg”StyË_I‹m_1 -, - -68 & -a¢_SPC_RIC_Ev’tTrigg”StyË_I‹m_¥ecs_1 - - - @RIC-Format-Type.c - -8  - ~"RIC-FÜm©-Ty³.h -" - -14 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_RIC_FÜm©_Ty³_gs_1 -[] = { - -15 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -17 -a¢_TYPE_desütÜ_t - - ga¢_DEF_RIC_FÜm©_Ty³ - = { - -20 & -a¢_OP_N©iveIÁeg” -, - -21 -a¢_DEF_RIC_FÜm©_Ty³_gs_1 -, - -22 ( -a¢_DEF_RIC_FÜm©_Ty³_gs_1 -) - -23 /( -a¢_DEF_RIC_FÜm©_Ty³_gs_1 -[0]), - -24 -a¢_DEF_RIC_FÜm©_Ty³_gs_1 -, - -25 ( -a¢_DEF_RIC_FÜm©_Ty³_gs_1 -) - -26 /( -a¢_DEF_RIC_FÜm©_Ty³_gs_1 -[0]), - -27 { 0, 0, -N©iveIÁeg”_cÚ¡¿št - }, - - @RIC-ReportStyle-Item.c - -8  - ~"RIC-R•ÜtStyË-I‹m.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_RIC_R•ÜtStyË_I‹m_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -RIC_R•ÜtStyË_I‹m -, -ric_R•ÜtStyË_Ty³ -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_RIC_StyË_Ty³ -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -RIC_R•ÜtStyË_I‹m -, -ric_R•ÜtStyË_Name -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_RIC_StyË_Name -, - -29 { -ATF_NOFLAGS -, 0, -off£tof -( -RIC_R•ÜtStyË_I‹m -, -ric_AùiÚFÜm©_Ty³ -), - -30 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -32 & -a¢_DEF_RIC_FÜm©_Ty³ -, - -38 { -ATF_NOFLAGS -, 0, -off£tof -( -RIC_R•ÜtStyË_I‹m -, -m—sInfo_AùiÚ_Li¡ -), - -39 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -41 & -a¢_DEF_M—su»m’tInfo_AùiÚ_Li¡ -, - -47 { -ATF_NOFLAGS -, 0, -off£tof -( -RIC_R•ÜtStyË_I‹m -, -ric_IndiÿtiÚH—d”FÜm©_Ty³ -), - -48 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -50 & -a¢_DEF_RIC_FÜm©_Ty³ -, - -56 { -ATF_NOFLAGS -, 0, -off£tof -( -RIC_R•ÜtStyË_I‹m -, -ric_IndiÿtiÚMes§geFÜm©_Ty³ -), - -57 ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), - -59 & -a¢_DEF_RIC_FÜm©_Ty³ -, - -66 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_RIC_R•ÜtStyË_I‹m_gs_1 -[] = { - -67 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -69 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_RIC_R•ÜtStyË_I‹m_g2–_1 -[] = { - -70 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -71 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -72 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -73 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 }, - -74 { ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), 4, 0, 0 }, - -75 { ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), 5, 0, 0 } - -77 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_RIC_R•ÜtStyË_I‹m_¥ecs_1 - = { - -78 ( -RIC_R•ÜtStyË_I‹m -), - -79 -off£tof -( -RIC_R•ÜtStyË_I‹m -, -_a¢_ùx -), - -80 -a¢_MAP_RIC_R•ÜtStyË_I‹m_g2–_1 -, - -85 -a¢_TYPE_desütÜ_t - - ga¢_DEF_RIC_R•ÜtStyË_I‹m - = { - -88 & -a¢_OP_SEQUENCE -, - -89 -a¢_DEF_RIC_R•ÜtStyË_I‹m_gs_1 -, - -90 ( -a¢_DEF_RIC_R•ÜtStyË_I‹m_gs_1 -) - -91 /( -a¢_DEF_RIC_R•ÜtStyË_I‹m_gs_1 -[0]), - -92 -a¢_DEF_RIC_R•ÜtStyË_I‹m_gs_1 -, - -93 ( -a¢_DEF_RIC_R•ÜtStyË_I‹m_gs_1 -) - -94 /( -a¢_DEF_RIC_R•ÜtStyË_I‹m_gs_1 -[0]), - -95 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -96 -a¢_MBR_RIC_R•ÜtStyË_I‹m_1 -, - -98 & -a¢_SPC_RIC_R•ÜtStyË_I‹m_¥ecs_1 - - - @RIC-Style-Name.c - -8  - ~"RIC-StyË-Name.h -" - -10 cÚ¡  - g³rm™‹d_®phab‘_bË_1 -[256] = { - -20 cÚ¡  - g³rm™‹d_®phab‘_code2v®ue_1 -[74] = { - -28  - $check_³rm™‹d_®phab‘_1 -(cÚ¡ * -¥Œ -) { - -29 cÚ¡ * -bË - = -³rm™‹d_®phab‘_bË_1 -; - -31 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -32 cÚ¡ -ušt8_t - * -ch - = -¡ --> -buf -; - -33 cÚ¡ -ušt8_t - * -’d - = -ch - + -¡ --> -size -; - -35 ; -ch - < -’d -; ch++) { - -36 -ušt8_t - -cv - = * -ch -; - -37 if(! -bË -[ -cv -])  -1; - -40 - } -} - -43 - $RIC_StyË_Name_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -44 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -45 cÚ¡ -PršbËSŒšg_t - * -¡ - = (cÚ¡ PršbËSŒšg_ˆ*) -¥Œ -; - -46 -size_t - -size -; - -48 if(! -¥Œ -) { - -49 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -51 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -55 -size - = -¡ -->size; - -57 if(( -size - >= 1 && size <= 150) - -58 && ! - `check_³rm™‹d_®phab‘_1 -( -¡ -)) { - -62 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -64 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -67 - } -} - -69  - $a¢_PER_MAP_RIC_StyË_Name_1_v2c -( -v®ue -) { - -70 if( -v®ue - >ð( -³rm™‹d_®phab‘_bË_1 -)/(permitted_alphabet_table_1[0])) - -72  -³rm™‹d_®phab‘_bË_1 -[ -v®ue -] - 1; - -73 - } -} - -74  - $a¢_PER_MAP_RIC_StyË_Name_1_c2v -( -code -) { - -75 if( -code - >ð( -³rm™‹d_®phab‘_code2v®ue_1 -)/(permitted_alphabet_code2value_1[0])) - -77  -³rm™‹d_®phab‘_code2v®ue_1 -[ -code -]; - -78 - } -} - -83 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_RIC_StyË_Name_cÚ¡r_1 - - gCC_NOTUSED - = { - -84 { -APC_CONSTRAINED -, 7, 7, 32, 122 } , - -85 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 8, 8, 1, 150 } , - -86 -a¢_PER_MAP_RIC_StyË_Name_1_v2c -, - -87 -a¢_PER_MAP_RIC_StyË_Name_1_c2v - - -89 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_RIC_StyË_Name_gs_1 -[] = { - -90 ( -ASN_TAG_CLASS_UNIVERSAL - | (19 << 2)) - -92 -a¢_TYPE_desütÜ_t - - ga¢_DEF_RIC_StyË_Name - = { - -95 & -a¢_OP_PršbËSŒšg -, - -96 -a¢_DEF_RIC_StyË_Name_gs_1 -, - -97 ( -a¢_DEF_RIC_StyË_Name_gs_1 -) - -98 /( -a¢_DEF_RIC_StyË_Name_gs_1 -[0]), - -99 -a¢_DEF_RIC_StyË_Name_gs_1 -, - -100 ( -a¢_DEF_RIC_StyË_Name_gs_1 -) - -101 /( -a¢_DEF_RIC_StyË_Name_gs_1 -[0]), - -102 { 0, & -a¢_PER_ty³_RIC_StyË_Name_cÚ¡r_1 -, -RIC_StyË_Name_cÚ¡¿št - }, - - @RIC-Style-Type.c - -8  - ~"RIC-StyË-Ty³.h -" - -14 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_RIC_StyË_Ty³_gs_1 -[] = { - -15 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -17 -a¢_TYPE_desütÜ_t - - ga¢_DEF_RIC_StyË_Ty³ - = { - -20 & -a¢_OP_N©iveIÁeg” -, - -21 -a¢_DEF_RIC_StyË_Ty³_gs_1 -, - -22 ( -a¢_DEF_RIC_StyË_Ty³_gs_1 -) - -23 /( -a¢_DEF_RIC_StyË_Ty³_gs_1 -[0]), - -24 -a¢_DEF_RIC_StyË_Ty³_gs_1 -, - -25 ( -a¢_DEF_RIC_StyË_Ty³_gs_1 -) - -26 /( -a¢_DEF_RIC_StyË_Ty³_gs_1 -[0]), - -27 { 0, 0, -N©iveIÁeg”_cÚ¡¿št - }, - - @RRC-MessageID.c - -8  - ~"RRC-Mes§geID.h -" - -10  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_¼cTy³_cÚ¡r_2 - - gCC_NOTUSED - = { - -11 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -15  -a¢_TYPE_memb”_t - - ga¢_MBR_¼cTy³_2 -[] = { - -16 { -ATF_NOFLAGS -, 0, -off£tof -( -RRC_Mes§geID__¼cTy³ -, -choiû -. -lTE -), - -17 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -19 & -a¢_DEF_RRCþass_LTE -, - -25 { -ATF_NOFLAGS -, 0, -off£tof -( -RRC_Mes§geID__¼cTy³ -, -choiû -. -nR -), - -26 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -28 & -a¢_DEF_RRCþass_NR -, - -35 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_¼cTy³_g2–_2 -[] = { - -36 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -37 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -39  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_¼cTy³_¥ecs_2 - = { - -40 ( -RRC_Mes§geID__¼cTy³ -), - -41 -off£tof -( -RRC_Mes§geID__¼cTy³ -, -_a¢_ùx -), - -42 -off£tof -( -RRC_Mes§geID__¼cTy³ -, -´e£Á -), - -43 ((( -RRC_Mes§geID__¼cTy³ - *)0)-> -´e£Á -), - -44 -a¢_MAP_¼cTy³_g2–_2 -, - -50 -a¢_TYPE_desütÜ_t - - ga¢_DEF_¼cTy³_2 - = { - -53 & -a¢_OP_CHOICE -, - -58 { 0, & -a¢_PER_ty³_¼cTy³_cÚ¡r_2 -, -CHOICE_cÚ¡¿št - }, - -59 -a¢_MBR_¼cTy³_2 -, - -61 & -a¢_SPC_¼cTy³_¥ecs_2 - - -64  -a¢_TYPE_memb”_t - - ga¢_MBR_RRC_Mes§geID_1 -[] = { - -65 { -ATF_NOFLAGS -, 0, -off£tof -( -RRC_Mes§geID -, -¼cTy³ -), - -66 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -68 & -a¢_DEF_¼cTy³_2 -, - -74 { -ATF_NOFLAGS -, 0, -off£tof -( -RRC_Mes§geID -, -mes§geID -), - -75 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -77 & -a¢_DEF_N©iveIÁeg” -, - -84 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_RRC_Mes§geID_gs_1 -[] = { - -85 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -87 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_RRC_Mes§geID_g2–_1 -[] = { - -88 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -89 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -91  -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_RRC_Mes§geID_¥ecs_1 - = { - -92 ( -RRC_Mes§geID -), - -93 -off£tof -( -RRC_Mes§geID -, -_a¢_ùx -), - -94 -a¢_MAP_RRC_Mes§geID_g2–_1 -, - -99 -a¢_TYPE_desütÜ_t - - ga¢_DEF_RRC_Mes§geID - = { - -102 & -a¢_OP_SEQUENCE -, - -103 -a¢_DEF_RRC_Mes§geID_gs_1 -, - -104 ( -a¢_DEF_RRC_Mes§geID_gs_1 -) - -105 /( -a¢_DEF_RRC_Mes§geID_gs_1 -[0]), - -106 -a¢_DEF_RRC_Mes§geID_gs_1 -, - -107 ( -a¢_DEF_RRC_Mes§geID_gs_1 -) - -108 /( -a¢_DEF_RRC_Mes§geID_gs_1 -[0]), - -109 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -110 -a¢_MBR_RRC_Mes§geID_1 -, - -112 & -a¢_SPC_RRC_Mes§geID_¥ecs_1 - - - @RRCclass-LTE.c - -8  - ~"RRCþass-LTE.h -" - -14 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_RRCþass_LTE_cÚ¡r_1 - - gCC_NOTUSED - = { - -15 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 4, 4, 0, 11 } , - -16 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -19 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_RRCþass_LTE_v®ue2’um_1 -[] = { - -34 cÚ¡  - ga¢_MAP_RRCþass_LTE_’um2v®ue_1 -[] = { - -49 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_RRCþass_LTE_¥ecs_1 - = { - -50 -a¢_MAP_RRCþass_LTE_v®ue2’um_1 -, - -51 -a¢_MAP_RRCþass_LTE_’um2v®ue_1 -, - -58 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_RRCþass_LTE_gs_1 -[] = { - -59 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -61 -a¢_TYPE_desütÜ_t - - ga¢_DEF_RRCþass_LTE - = { - -64 & -a¢_OP_N©iveEnum”©ed -, - -65 -a¢_DEF_RRCþass_LTE_gs_1 -, - -66 ( -a¢_DEF_RRCþass_LTE_gs_1 -) - -67 /( -a¢_DEF_RRCþass_LTE_gs_1 -[0]), - -68 -a¢_DEF_RRCþass_LTE_gs_1 -, - -69 ( -a¢_DEF_RRCþass_LTE_gs_1 -) - -70 /( -a¢_DEF_RRCþass_LTE_gs_1 -[0]), - -71 { 0, & -a¢_PER_ty³_RRCþass_LTE_cÚ¡r_1 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -73 & -a¢_SPC_RRCþass_LTE_¥ecs_1 - - - @RRCclass-NR.c - -8  - ~"RRCþass-NR.h -" - -14 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_RRCþass_NR_cÚ¡r_1 - - gCC_NOTUSED - = { - -15 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 3, 3, 0, 7 } , - -16 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -19 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_RRCþass_NR_v®ue2’um_1 -[] = { - -30 cÚ¡  - ga¢_MAP_RRCþass_NR_’um2v®ue_1 -[] = { - -41 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_RRCþass_NR_¥ecs_1 - = { - -42 -a¢_MAP_RRCþass_NR_v®ue2’um_1 -, - -43 -a¢_MAP_RRCþass_NR_’um2v®ue_1 -, - -50 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_RRCþass_NR_gs_1 -[] = { - -51 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -53 -a¢_TYPE_desütÜ_t - - ga¢_DEF_RRCþass_NR - = { - -56 & -a¢_OP_N©iveEnum”©ed -, - -57 -a¢_DEF_RRCþass_NR_gs_1 -, - -58 ( -a¢_DEF_RRCþass_NR_gs_1 -) - -59 /( -a¢_DEF_RRCþass_NR_gs_1 -[0]), - -60 -a¢_DEF_RRCþass_NR_gs_1 -, - -61 ( -a¢_DEF_RRCþass_NR_gs_1 -) - -62 /( -a¢_DEF_RRCþass_NR_gs_1 -[0]), - -63 { 0, & -a¢_PER_ty³_RRCþass_NR_cÚ¡r_1 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -65 & -a¢_SPC_RRCþass_NR_¥ecs_1 - - - @S-NSSAI.c - -8  - ~"S-NSSAI.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_S_NSSAI_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -S_NSSAI -, -sST -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_SST -, - -20 { -ATF_POINTER -, 1, -off£tof -( -S_NSSAI -, -sD -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_SD -, - -30 cÚ¡  - ga¢_MAP_S_NSSAI_oms_1 -[] = { 1 }; - -31 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_S_NSSAI_gs_1 -[] = { - -32 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -34 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_S_NSSAI_g2–_1 -[] = { - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -36 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -38 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_S_NSSAI_¥ecs_1 - = { - -39 ( -S_NSSAI -), - -40 -off£tof -( -S_NSSAI -, -_a¢_ùx -), - -41 -a¢_MAP_S_NSSAI_g2–_1 -, - -43 -a¢_MAP_S_NSSAI_oms_1 -, - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_S_NSSAI - = { - -50 & -a¢_OP_SEQUENCE -, - -51 -a¢_DEF_S_NSSAI_gs_1 -, - -52 ( -a¢_DEF_S_NSSAI_gs_1 -) - -53 /( -a¢_DEF_S_NSSAI_gs_1 -[0]), - -54 -a¢_DEF_S_NSSAI_gs_1 -, - -55 ( -a¢_DEF_S_NSSAI_gs_1 -) - -56 /( -a¢_DEF_S_NSSAI_gs_1 -[0]), - -57 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -58 -a¢_MBR_S_NSSAI_1 -, - -60 & -a¢_SPC_S_NSSAI_¥ecs_1 - - - @SD.c - -8  - ~"SD.h -" - -11 - $SD_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 -size - = -¡ -->size; - -25 if(( -size - == 3)) { - -29 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -31 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -34 - } -} - -40 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_SD_cÚ¡r_1 - - gCC_NOTUSED - = { - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -42 { -APC_CONSTRAINED -, 0, 0, 3, 3 } , - -45 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_SD_gs_1 -[] = { - -46 ( -ASN_TAG_CLASS_UNIVERSAL - | (4 << 2)) - -48 -a¢_TYPE_desütÜ_t - - ga¢_DEF_SD - = { - -51 & -a¢_OP_OCTET_STRING -, - -52 -a¢_DEF_SD_gs_1 -, - -53 ( -a¢_DEF_SD_gs_1 -) - -54 /( -a¢_DEF_SD_gs_1 -[0]), - -55 -a¢_DEF_SD_gs_1 -, - -56 ( -a¢_DEF_SD_gs_1 -) - -57 /( -a¢_DEF_SD_gs_1 -[0]), - -58 { 0, & -a¢_PER_ty³_SD_cÚ¡r_1 -, -SD_cÚ¡¿št - }, - -60 & -a¢_SPC_OCTET_STRING_¥ecs - - - @SST.c - -8  - ~"SST.h -" - -11 - $SST_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 -size - = -¡ -->size; - -25 if(( -size - == 1)) { - -29 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -31 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -34 - } -} - -40 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_SST_cÚ¡r_1 - - gCC_NOTUSED - = { - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -42 { -APC_CONSTRAINED -, 0, 0, 1, 1 } , - -45 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_SST_gs_1 -[] = { - -46 ( -ASN_TAG_CLASS_UNIVERSAL - | (4 << 2)) - -48 -a¢_TYPE_desütÜ_t - - ga¢_DEF_SST - = { - -51 & -a¢_OP_OCTET_STRING -, - -52 -a¢_DEF_SST_gs_1 -, - -53 ( -a¢_DEF_SST_gs_1 -) - -54 /( -a¢_DEF_SST_gs_1 -[0]), - -55 -a¢_DEF_SST_gs_1 -, - -56 ( -a¢_DEF_SST_gs_1 -) - -57 /( -a¢_DEF_SST_gs_1 -[0]), - -58 { 0, & -a¢_PER_ty³_SST_cÚ¡r_1 -, -SST_cÚ¡¿št - }, - -60 & -a¢_SPC_OCTET_STRING_¥ecs - - - @ServingCell-ARFCN.c - -8  - ~"S”všgC–l-ARFCN.h -" - -10  - ~"NR-ARFCN.h -" - -11  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_S”všgC–l_ARFCN_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -13 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -16  -a¢_TYPE_memb”_t - - ga¢_MBR_S”všgC–l_ARFCN_1 -[] = { - -17 { -ATF_POINTER -, 0, -off£tof -( -S”všgC–l_ARFCN -, -choiû -. -nR -), - -18 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -20 & -a¢_DEF_NR_ARFCN -, - -26 { -ATF_NOFLAGS -, 0, -off£tof -( -S”všgC–l_ARFCN -, -choiû -. -eUTRA -), - -27 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -29 & -a¢_DEF_E_UTRA_ARFCN -, - -36 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_S”všgC–l_ARFCN_g2–_1 -[] = { - -37 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -38 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -40  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_S”všgC–l_ARFCN_¥ecs_1 - = { - -41 ( -S”všgC–l_ARFCN -), - -42 -off£tof -( -S”všgC–l_ARFCN -, -_a¢_ùx -), - -43 -off£tof -( -S”všgC–l_ARFCN -, -´e£Á -), - -44 ((( -S”všgC–l_ARFCN - *)0)-> -´e£Á -), - -45 -a¢_MAP_S”všgC–l_ARFCN_g2–_1 -, - -50 -a¢_TYPE_desütÜ_t - - ga¢_DEF_S”všgC–l_ARFCN - = { - -53 & -a¢_OP_CHOICE -, - -58 { 0, & -a¢_PER_ty³_S”všgC–l_ARFCN_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -59 -a¢_MBR_S”všgC–l_ARFCN_1 -, - -61 & -a¢_SPC_S”všgC–l_ARFCN_¥ecs_1 - - - @ServingCell-PCI.c - -8  - ~"S”všgC–l-PCI.h -" - -10  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_S”všgC–l_PCI_cÚ¡r_1 - - gCC_NOTUSED - = { - -11 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 1, 1, 0, 1 } , - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -15  -a¢_TYPE_memb”_t - - ga¢_MBR_S”všgC–l_PCI_1 -[] = { - -16 { -ATF_NOFLAGS -, 0, -off£tof -( -S”všgC–l_PCI -, -choiû -. -nR -), - -17 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -19 & -a¢_DEF_NR_PCI -, - -25 { -ATF_NOFLAGS -, 0, -off£tof -( -S”všgC–l_PCI -, -choiû -. -eUTRA -), - -26 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -28 & -a¢_DEF_E_UTRA_PCI -, - -35 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_S”všgC–l_PCI_g2–_1 -[] = { - -36 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -37 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -39  -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_S”všgC–l_PCI_¥ecs_1 - = { - -40 ( -S”všgC–l_PCI -), - -41 -off£tof -( -S”všgC–l_PCI -, -_a¢_ùx -), - -42 -off£tof -( -S”všgC–l_PCI -, -´e£Á -), - -43 ((( -S”všgC–l_PCI - *)0)-> -´e£Á -), - -44 -a¢_MAP_S”všgC–l_PCI_g2–_1 -, - -49 -a¢_TYPE_desütÜ_t - - ga¢_DEF_S”všgC–l_PCI - = { - -52 & -a¢_OP_CHOICE -, - -57 { 0, & -a¢_PER_ty³_S”všgC–l_PCI_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -58 -a¢_MBR_S”všgC–l_PCI_1 -, - -60 & -a¢_SPC_S”všgC–l_PCI_¥ecs_1 - - - @SubscriberProfileIDforRFP.c - -8  - ~"Subsüib”ProfžeIDfÜRFP.h -" - -11 - $Subsüib”ProfžeIDfÜRFP_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 1 && value <= 256)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -39  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_Subsüib”ProfžeIDfÜRFP_cÚ¡r_1 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED -, 8, 8, 1, 256 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_Subsüib”ProfžeIDfÜRFP_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (2 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Subsüib”ProfžeIDfÜRFP - = { - -50 & -a¢_OP_N©iveIÁeg” -, - -51 -a¢_DEF_Subsüib”ProfžeIDfÜRFP_gs_1 -, - -52 ( -a¢_DEF_Subsüib”ProfžeIDfÜRFP_gs_1 -) - -53 /( -a¢_DEF_Subsüib”ProfžeIDfÜRFP_gs_1 -[0]), - -54 -a¢_DEF_Subsüib”ProfžeIDfÜRFP_gs_1 -, - -55 ( -a¢_DEF_Subsüib”ProfžeIDfÜRFP_gs_1 -) - -56 /( -a¢_DEF_Subsüib”ProfžeIDfÜRFP_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_Subsüib”ProfžeIDfÜRFP_cÚ¡r_1 -, -Subsüib”ProfžeIDfÜRFP_cÚ¡¿št - }, - - @SupportedSULBandList.c - -8  - ~"SuµÜ‹dSULBªdLi¡.h -" - -10  - ~"SuµÜ‹dSULF»qBªdI‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_SuµÜ‹dSULBªdLi¡_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 6, 6, 0, 32 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_SuµÜ‹dSULBªdLi¡_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -18 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -20 & -a¢_DEF_SuµÜ‹dSULF»qBªdI‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_SuµÜ‹dSULBªdLi¡_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_SuµÜ‹dSULBªdLi¡_¥ecs_1 - = { - -31 ( -SuµÜ‹dSULBªdLi¡ -), - -32 -off£tof -( -SuµÜ‹dSULBªdLi¡ -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_SuµÜ‹dSULBªdLi¡ - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_SuµÜ‹dSULBªdLi¡_gs_1 -, - -40 ( -a¢_DEF_SuµÜ‹dSULBªdLi¡_gs_1 -) - -41 /( -a¢_DEF_SuµÜ‹dSULBªdLi¡_gs_1 -[0]), - -42 -a¢_DEF_SuµÜ‹dSULBªdLi¡_gs_1 -, - -43 ( -a¢_DEF_SuµÜ‹dSULBªdLi¡_gs_1 -) - -44 /( -a¢_DEF_SuµÜ‹dSULBªdLi¡_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_SuµÜ‹dSULBªdLi¡_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_SuµÜ‹dSULBªdLi¡_1 -, - -48 & -a¢_SPC_SuµÜ‹dSULBªdLi¡_¥ecs_1 - - - @SupportedSULFreqBandItem.c - -8  - ~"SuµÜ‹dSULF»qBªdI‹m.h -" - -11 - $memb_äeqBªdIndiÿtÜNr_cÚ¡¿št_1 -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13  -v®ue -; - -15 if(! -¥Œ -) { - -16 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -18 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -22 -v®ue - = *(cÚ¡ *) -¥Œ -; - -24 if(( -v®ue - >= 1 && value <= 1024)) { - -28 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -30 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -33 - } -} - -35  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_memb_äeqBªdIndiÿtÜNr_cÚ¡r_2 - - gCC_NOTUSED - = { - -36 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 10, 10, 1, 1024 } , - -37 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -40 -a¢_TYPE_memb”_t - - ga¢_MBR_SuµÜ‹dSULF»qBªdI‹m_1 -[] = { - -41 { -ATF_NOFLAGS -, 0, -off£tof -( -SuµÜ‹dSULF»qBªdI‹m -, -äeqBªdIndiÿtÜNr -), - -42 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -44 & -a¢_DEF_N©iveIÁeg” -, - -46 { 0, & -a¢_PER_memb_äeqBªdIndiÿtÜNr_cÚ¡r_2 -, -memb_äeqBªdIndiÿtÜNr_cÚ¡¿št_1 - }, - -51 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_SuµÜ‹dSULF»qBªdI‹m_gs_1 -[] = { - -52 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -54 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_SuµÜ‹dSULF»qBªdI‹m_g2–_1 -[] = { - -55 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -57 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_SuµÜ‹dSULF»qBªdI‹m_¥ecs_1 - = { - -58 ( -SuµÜ‹dSULF»qBªdI‹m -), - -59 -off£tof -( -SuµÜ‹dSULF»qBªdI‹m -, -_a¢_ùx -), - -60 -a¢_MAP_SuµÜ‹dSULF»qBªdI‹m_g2–_1 -, - -65 -a¢_TYPE_desütÜ_t - - ga¢_DEF_SuµÜ‹dSULF»qBªdI‹m - = { - -68 & -a¢_OP_SEQUENCE -, - -69 -a¢_DEF_SuµÜ‹dSULF»qBªdI‹m_gs_1 -, - -70 ( -a¢_DEF_SuµÜ‹dSULF»qBªdI‹m_gs_1 -) - -71 /( -a¢_DEF_SuµÜ‹dSULF»qBªdI‹m_gs_1 -[0]), - -72 -a¢_DEF_SuµÜ‹dSULF»qBªdI‹m_gs_1 -, - -73 ( -a¢_DEF_SuµÜ‹dSULF»qBªdI‹m_gs_1 -) - -74 /( -a¢_DEF_SuµÜ‹dSULF»qBªdI‹m_gs_1 -[0]), - -75 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -76 -a¢_MBR_SuµÜ‹dSULF»qBªdI‹m_1 -, - -78 & -a¢_SPC_SuµÜ‹dSULF»qBªdI‹m_¥ecs_1 - - - @TestCond-Expression.c - -8  - ~"Te¡CÚd-Ex´essiÚ.h -" - -14 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_Te¡CÚd_Ex´essiÚ_cÚ¡r_1 - - gCC_NOTUSED - = { - -15 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 3, 3, 0, 4 } , - -16 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -19 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_Te¡CÚd_Ex´essiÚ_v®ue2’um_1 -[] = { - -27 cÚ¡  - ga¢_MAP_Te¡CÚd_Ex´essiÚ_’um2v®ue_1 -[] = { - -35 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_Te¡CÚd_Ex´essiÚ_¥ecs_1 - = { - -36 -a¢_MAP_Te¡CÚd_Ex´essiÚ_v®ue2’um_1 -, - -37 -a¢_MAP_Te¡CÚd_Ex´essiÚ_’um2v®ue_1 -, - -44 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_Te¡CÚd_Ex´essiÚ_gs_1 -[] = { - -45 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Te¡CÚd_Ex´essiÚ - = { - -50 & -a¢_OP_N©iveEnum”©ed -, - -51 -a¢_DEF_Te¡CÚd_Ex´essiÚ_gs_1 -, - -52 ( -a¢_DEF_Te¡CÚd_Ex´essiÚ_gs_1 -) - -53 /( -a¢_DEF_Te¡CÚd_Ex´essiÚ_gs_1 -[0]), - -54 -a¢_DEF_Te¡CÚd_Ex´essiÚ_gs_1 -, - -55 ( -a¢_DEF_Te¡CÚd_Ex´essiÚ_gs_1 -) - -56 /( -a¢_DEF_Te¡CÚd_Ex´essiÚ_gs_1 -[0]), - -57 { 0, & -a¢_PER_ty³_Te¡CÚd_Ex´essiÚ_cÚ¡r_1 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -59 & -a¢_SPC_Te¡CÚd_Ex´essiÚ_¥ecs_1 - - - @TestCond-Type.c - -8  - ~"Te¡CÚd-Ty³.h -" - -34  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_gBR_cÚ¡r_2 - - gCC_NOTUSED - = { - -35 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -36 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -39  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_aMBR_cÚ¡r_5 - - gCC_NOTUSED - = { - -40 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -44  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_isSt_cÚ¡r_8 - - gCC_NOTUSED - = { - -45 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -46 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -49  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_isC©M_cÚ¡r_11 - - gCC_NOTUSED - = { - -50 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -51 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -54  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_rSRP_cÚ¡r_14 - - gCC_NOTUSED - = { - -55 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -56 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -59  -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_rSRQ_cÚ¡r_17 - - gCC_NOTUSED - = { - -60 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 0, 0, 0, 0 } , - -61 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -64 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_Te¡CÚd_Ty³_cÚ¡r_1 - - gCC_NOTUSED - = { - -65 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 3, 3, 0, 5 } , - -66 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -69 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_gBR_v®ue2’um_2 -[] = { - -73 cÚ¡  - ga¢_MAP_gBR_’um2v®ue_2 -[] = { - -77 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_gBR_¥ecs_2 - = { - -78 -a¢_MAP_gBR_v®ue2’um_2 -, - -79 -a¢_MAP_gBR_’um2v®ue_2 -, - -86 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_gBR_gs_2 -[] = { - -87 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -88 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -91 -a¢_TYPE_desütÜ_t - - ga¢_DEF_gBR_2 - = { - -94 & -a¢_OP_N©iveEnum”©ed -, - -95 -a¢_DEF_gBR_gs_2 -, - -96 ( -a¢_DEF_gBR_gs_2 -) - -97 /( -a¢_DEF_gBR_gs_2 -[0]) - 1, - -98 -a¢_DEF_gBR_gs_2 -, - -99 ( -a¢_DEF_gBR_gs_2 -) - -100 /( -a¢_DEF_gBR_gs_2 -[0]), - -101 { 0, & -a¢_PER_ty³_gBR_cÚ¡r_2 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -103 & -a¢_SPC_gBR_¥ecs_2 - - -106 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_aMBR_v®ue2’um_5 -[] = { - -110 cÚ¡  - ga¢_MAP_aMBR_’um2v®ue_5 -[] = { - -114 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_aMBR_¥ecs_5 - = { - -115 -a¢_MAP_aMBR_v®ue2’um_5 -, - -116 -a¢_MAP_aMBR_’um2v®ue_5 -, - -123 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_aMBR_gs_5 -[] = { - -124 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -125 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -128 -a¢_TYPE_desütÜ_t - - ga¢_DEF_aMBR_5 - = { - -131 & -a¢_OP_N©iveEnum”©ed -, - -132 -a¢_DEF_aMBR_gs_5 -, - -133 ( -a¢_DEF_aMBR_gs_5 -) - -134 /( -a¢_DEF_aMBR_gs_5 -[0]) - 1, - -135 -a¢_DEF_aMBR_gs_5 -, - -136 ( -a¢_DEF_aMBR_gs_5 -) - -137 /( -a¢_DEF_aMBR_gs_5 -[0]), - -138 { 0, & -a¢_PER_ty³_aMBR_cÚ¡r_5 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -140 & -a¢_SPC_aMBR_¥ecs_5 - - -143 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_isSt_v®ue2’um_8 -[] = { - -147 cÚ¡  - ga¢_MAP_isSt_’um2v®ue_8 -[] = { - -151 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_isSt_¥ecs_8 - = { - -152 -a¢_MAP_isSt_v®ue2’um_8 -, - -153 -a¢_MAP_isSt_’um2v®ue_8 -, - -160 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_isSt_gs_8 -[] = { - -161 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -162 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -165 -a¢_TYPE_desütÜ_t - - ga¢_DEF_isSt_8 - = { - -168 & -a¢_OP_N©iveEnum”©ed -, - -169 -a¢_DEF_isSt_gs_8 -, - -170 ( -a¢_DEF_isSt_gs_8 -) - -171 /( -a¢_DEF_isSt_gs_8 -[0]) - 1, - -172 -a¢_DEF_isSt_gs_8 -, - -173 ( -a¢_DEF_isSt_gs_8 -) - -174 /( -a¢_DEF_isSt_gs_8 -[0]), - -175 { 0, & -a¢_PER_ty³_isSt_cÚ¡r_8 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -177 & -a¢_SPC_isSt_¥ecs_8 - - -180 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_isC©M_v®ue2’um_11 -[] = { - -184 cÚ¡  - ga¢_MAP_isC©M_’um2v®ue_11 -[] = { - -188 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_isC©M_¥ecs_11 - = { - -189 -a¢_MAP_isC©M_v®ue2’um_11 -, - -190 -a¢_MAP_isC©M_’um2v®ue_11 -, - -197 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_isC©M_gs_11 -[] = { - -198 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -199 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -202 -a¢_TYPE_desütÜ_t - - ga¢_DEF_isC©M_11 - = { - -205 & -a¢_OP_N©iveEnum”©ed -, - -206 -a¢_DEF_isC©M_gs_11 -, - -207 ( -a¢_DEF_isC©M_gs_11 -) - -208 /( -a¢_DEF_isC©M_gs_11 -[0]) - 1, - -209 -a¢_DEF_isC©M_gs_11 -, - -210 ( -a¢_DEF_isC©M_gs_11 -) - -211 /( -a¢_DEF_isC©M_gs_11 -[0]), - -212 { 0, & -a¢_PER_ty³_isC©M_cÚ¡r_11 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -214 & -a¢_SPC_isC©M_¥ecs_11 - - -217 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_rSRP_v®ue2’um_14 -[] = { - -221 cÚ¡  - ga¢_MAP_rSRP_’um2v®ue_14 -[] = { - -225 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_rSRP_¥ecs_14 - = { - -226 -a¢_MAP_rSRP_v®ue2’um_14 -, - -227 -a¢_MAP_rSRP_’um2v®ue_14 -, - -234 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_rSRP_gs_14 -[] = { - -235 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -236 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -239 -a¢_TYPE_desütÜ_t - - ga¢_DEF_rSRP_14 - = { - -242 & -a¢_OP_N©iveEnum”©ed -, - -243 -a¢_DEF_rSRP_gs_14 -, - -244 ( -a¢_DEF_rSRP_gs_14 -) - -245 /( -a¢_DEF_rSRP_gs_14 -[0]) - 1, - -246 -a¢_DEF_rSRP_gs_14 -, - -247 ( -a¢_DEF_rSRP_gs_14 -) - -248 /( -a¢_DEF_rSRP_gs_14 -[0]), - -249 { 0, & -a¢_PER_ty³_rSRP_cÚ¡r_14 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -251 & -a¢_SPC_rSRP_¥ecs_14 - - -254 cÚ¡ -a¢_INTEGER_’um_m­_t - - ga¢_MAP_rSRQ_v®ue2’um_17 -[] = { - -258 cÚ¡  - ga¢_MAP_rSRQ_’um2v®ue_17 -[] = { - -262 cÚ¡ -a¢_INTEGER_¥ecifics_t - - ga¢_SPC_rSRQ_¥ecs_17 - = { - -263 -a¢_MAP_rSRQ_v®ue2’um_17 -, - -264 -a¢_MAP_rSRQ_’um2v®ue_17 -, - -271 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_rSRQ_gs_17 -[] = { - -272 ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), - -273 ( -ASN_TAG_CLASS_UNIVERSAL - | (10 << 2)) - -276 -a¢_TYPE_desütÜ_t - - ga¢_DEF_rSRQ_17 - = { - -279 & -a¢_OP_N©iveEnum”©ed -, - -280 -a¢_DEF_rSRQ_gs_17 -, - -281 ( -a¢_DEF_rSRQ_gs_17 -) - -282 /( -a¢_DEF_rSRQ_gs_17 -[0]) - 1, - -283 -a¢_DEF_rSRQ_gs_17 -, - -284 ( -a¢_DEF_rSRQ_gs_17 -) - -285 /( -a¢_DEF_rSRQ_gs_17 -[0]), - -286 { 0, & -a¢_PER_ty³_rSRQ_cÚ¡r_17 -, -N©iveEnum”©ed_cÚ¡¿št - }, - -288 & -a¢_SPC_rSRQ_¥ecs_17 - - -291 -a¢_TYPE_memb”_t - - ga¢_MBR_Te¡CÚd_Ty³_1 -[] = { - -292 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_Ty³ -, -choiû -. -gBR -), - -293 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -295 & -a¢_DEF_gBR_2 -, - -301 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_Ty³ -, -choiû -. -aMBR -), - -302 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -304 & -a¢_DEF_aMBR_5 -, - -310 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_Ty³ -, -choiû -. -isSt -), - -311 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -313 & -a¢_DEF_isSt_8 -, - -319 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_Ty³ -, -choiû -. -isC©M -), - -320 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -322 & -a¢_DEF_isC©M_11 -, - -328 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_Ty³ -, -choiû -. -rSRP -), - -329 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -331 & -a¢_DEF_rSRP_14 -, - -337 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_Ty³ -, -choiû -. -rSRQ -), - -338 ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), - -340 & -a¢_DEF_rSRQ_17 -, - -347 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_Te¡CÚd_Ty³_g2–_1 -[] = { - -348 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -349 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -350 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -351 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 }, - -352 { ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), 4, 0, 0 }, - -353 { ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), 5, 0, 0 } - -355 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_Te¡CÚd_Ty³_¥ecs_1 - = { - -356 ( -Te¡CÚd_Ty³ -), - -357 -off£tof -( -Te¡CÚd_Ty³ -, -_a¢_ùx -), - -358 -off£tof -( -Te¡CÚd_Ty³ -, -´e£Á -), - -359 ((( -Te¡CÚd_Ty³ - *)0)-> -´e£Á -), - -360 -a¢_MAP_Te¡CÚd_Ty³_g2–_1 -, - -365 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Te¡CÚd_Ty³ - = { - -368 & -a¢_OP_CHOICE -, - -373 { 0, & -a¢_PER_ty³_Te¡CÚd_Ty³_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -374 -a¢_MBR_Te¡CÚd_Ty³_1 -, - -376 & -a¢_SPC_Te¡CÚd_Ty³_¥ecs_1 - - - @TestCond-Value.c - -8  - ~"Te¡CÚd-V®ue.h -" - -10 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_Te¡CÚd_V®ue_cÚ¡r_1 - - gCC_NOTUSED - = { - -11 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 3, 3, 0, 5 } , - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -15 -a¢_TYPE_memb”_t - - ga¢_MBR_Te¡CÚd_V®ue_1 -[] = { - -16 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_V®ue -, -choiû -. -v®ueIÁ -), - -17 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -19 & -a¢_DEF_N©iveIÁeg” -, - -25 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_V®ue -, -choiû -. -v®ueEnum -), - -26 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -28 & -a¢_DEF_N©iveIÁeg” -, - -34 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_V®ue -, -choiû -. -v®ueBoÞ -), - -35 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -37 & -a¢_DEF_BOOLEAN -, - -43 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_V®ue -, -choiû -. -v®ueB™S -), - -44 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -46 & -a¢_DEF_BIT_STRING -, - -52 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_V®ue -, -choiû -. -v®ueOùS -), - -53 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -55 & -a¢_DEF_OCTET_STRING -, - -61 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚd_V®ue -, -choiû -. -v®ueP¹S -), - -62 ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), - -64 & -a¢_DEF_PršbËSŒšg -, - -71 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_Te¡CÚd_V®ue_g2–_1 -[] = { - -72 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -73 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -74 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -75 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 }, - -76 { ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), 4, 0, 0 }, - -77 { ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), 5, 0, 0 } - -79 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_Te¡CÚd_V®ue_¥ecs_1 - = { - -80 ( -Te¡CÚd_V®ue -), - -81 -off£tof -( -Te¡CÚd_V®ue -, -_a¢_ùx -), - -82 -off£tof -( -Te¡CÚd_V®ue -, -´e£Á -), - -83 ((( -Te¡CÚd_V®ue - *)0)-> -´e£Á -), - -84 -a¢_MAP_Te¡CÚd_V®ue_g2–_1 -, - -89 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Te¡CÚd_V®ue - = { - -92 & -a¢_OP_CHOICE -, - -97 { 0, & -a¢_PER_ty³_Te¡CÚd_V®ue_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -98 -a¢_MBR_Te¡CÚd_V®ue_1 -, - -100 & -a¢_SPC_Te¡CÚd_V®ue_¥ecs_1 - - - @TestCondInfo.c - -8  - ~"Te¡CÚdInfo.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_Te¡CÚdInfo_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚdInfo -, -‹¡Ty³ -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_Te¡CÚd_Ty³ -, - -20 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚdInfo -, -‹¡Ex´ -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_Te¡CÚd_Ex´essiÚ -, - -29 { -ATF_NOFLAGS -, 0, -off£tof -( -Te¡CÚdInfo -, -‹¡V®ue -), - -30 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -32 & -a¢_DEF_Te¡CÚd_V®ue -, - -39 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_Te¡CÚdInfo_gs_1 -[] = { - -40 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -42 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_Te¡CÚdInfo_g2–_1 -[] = { - -43 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -44 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -45 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 } - -47 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_Te¡CÚdInfo_¥ecs_1 - = { - -48 ( -Te¡CÚdInfo -), - -49 -off£tof -( -Te¡CÚdInfo -, -_a¢_ùx -), - -50 -a¢_MAP_Te¡CÚdInfo_g2–_1 -, - -55 -a¢_TYPE_desütÜ_t - - ga¢_DEF_Te¡CÚdInfo - = { - -58 & -a¢_OP_SEQUENCE -, - -59 -a¢_DEF_Te¡CÚdInfo_gs_1 -, - -60 ( -a¢_DEF_Te¡CÚdInfo_gs_1 -) - -61 /( -a¢_DEF_Te¡CÚdInfo_gs_1 -[0]), - -62 -a¢_DEF_Te¡CÚdInfo_gs_1 -, - -63 ( -a¢_DEF_Te¡CÚdInfo_gs_1 -) - -64 /( -a¢_DEF_Te¡CÚdInfo_gs_1 -[0]), - -65 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -66 -a¢_MBR_Te¡CÚdInfo_1 -, - -68 & -a¢_SPC_Te¡CÚdInfo_¥ecs_1 - - - @TimeStamp.c - -8  - ~"TimeSmp.h -" - -11 - $TimeSmp_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -12 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -13 cÚ¡ -OCTET_STRING_t - * -¡ - = (cÚ¡ OCTET_STRING_ˆ*) -¥Œ -; - -14 -size_t - -size -; - -16 if(! -¥Œ -) { - -17 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -19 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -23 -size - = -¡ -->size; - -25 if(( -size - == 4)) { - -29 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -31 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -34 - } -} - -40 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_TimeSmp_cÚ¡r_1 - - gCC_NOTUSED - = { - -41 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -42 { -APC_CONSTRAINED -, 0, 0, 4, 4 } , - -45 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_TimeSmp_gs_1 -[] = { - -46 ( -ASN_TAG_CLASS_UNIVERSAL - | (4 << 2)) - -48 -a¢_TYPE_desütÜ_t - - ga¢_DEF_TimeSmp - = { - -51 & -a¢_OP_OCTET_STRING -, - -52 -a¢_DEF_TimeSmp_gs_1 -, - -53 ( -a¢_DEF_TimeSmp_gs_1 -) - -54 /( -a¢_DEF_TimeSmp_gs_1 -[0]), - -55 -a¢_DEF_TimeSmp_gs_1 -, - -56 ( -a¢_DEF_TimeSmp_gs_1 -) - -57 /( -a¢_DEF_TimeSmp_gs_1 -[0]), - -58 { 0, & -a¢_PER_ty³_TimeSmp_cÚ¡r_1 -, -TimeSmp_cÚ¡¿št - }, - -60 & -a¢_SPC_OCTET_STRING_¥ecs - - - @UEID-EN-GNB.c - -8  - ~"UEID-EN-GNB.h -" - -10  - ~"UEID-GNB-CU-CP-E1AP-ID-Li¡.h -" - -11 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_EN_GNB_1 -[] = { - -12 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_EN_GNB -, -m_eNB_UE_X2AP_ID -), - -13 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -15 & -a¢_DEF_ENB_UE_X2AP_ID -, - -21 { -ATF_POINTER -, 1, -off£tof -( -UEID_EN_GNB -, -m_eNB_UE_X2AP_ID_Ex‹nsiÚ -), - -22 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -24 & -a¢_DEF_ENB_UE_X2AP_ID_Ex‹nsiÚ -, - -30 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_EN_GNB -, -glob®ENB_ID -), - -31 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -33 & -a¢_DEF_Glob®ENB_ID -, - -39 { -ATF_POINTER -, 3, -off£tof -( -UEID_EN_GNB -, -gNB_CU_UE_F1AP_ID -), - -40 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -42 & -a¢_DEF_GNB_CU_UE_F1AP_ID -, - -48 { -ATF_POINTER -, 2, -off£tof -( -UEID_EN_GNB -, -gNB_CU_CP_UE_E1AP_ID_Li¡ -), - -49 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -51 & -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_Li¡ -, - -57 { -ATF_POINTER -, 1, -off£tof -( -UEID_EN_GNB -, -¿n_UEID -), - -58 ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), - -60 & -a¢_DEF_RANUEID -, - -67 cÚ¡  - ga¢_MAP_UEID_EN_GNB_oms_1 -[] = { 1, 3, 4, 5 }; - -68 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_UEID_EN_GNB_gs_1 -[] = { - -69 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -71 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_UEID_EN_GNB_g2–_1 -[] = { - -72 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -73 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -74 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -75 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 }, - -76 { ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), 4, 0, 0 }, - -77 { ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), 5, 0, 0 } - -79 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_UEID_EN_GNB_¥ecs_1 - = { - -80 ( -UEID_EN_GNB -), - -81 -off£tof -( -UEID_EN_GNB -, -_a¢_ùx -), - -82 -a¢_MAP_UEID_EN_GNB_g2–_1 -, - -84 -a¢_MAP_UEID_EN_GNB_oms_1 -, - -88 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID_EN_GNB - = { - -91 & -a¢_OP_SEQUENCE -, - -92 -a¢_DEF_UEID_EN_GNB_gs_1 -, - -93 ( -a¢_DEF_UEID_EN_GNB_gs_1 -) - -94 /( -a¢_DEF_UEID_EN_GNB_gs_1 -[0]), - -95 -a¢_DEF_UEID_EN_GNB_gs_1 -, - -96 ( -a¢_DEF_UEID_EN_GNB_gs_1 -) - -97 /( -a¢_DEF_UEID_EN_GNB_gs_1 -[0]), - -98 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -99 -a¢_MBR_UEID_EN_GNB_1 -, - -101 & -a¢_SPC_UEID_EN_GNB_¥ecs_1 - - - @UEID-ENB.c - -8  - ~"UEID-ENB.h -" - -10  - ~"Glob®ENB-ID.h -" - -11 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_ENB_1 -[] = { - -12 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_ENB -, -mME_UE_S1AP_ID -), - -13 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -15 & -a¢_DEF_MME_UE_S1AP_ID -, - -21 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_ENB -, -gUMMEI -), - -22 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -24 & -a¢_DEF_GUMMEI -, - -30 { -ATF_POINTER -, 3, -off£tof -( -UEID_ENB -, -m_eNB_UE_X2AP_ID -), - -31 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -33 & -a¢_DEF_ENB_UE_X2AP_ID -, - -39 { -ATF_POINTER -, 2, -off£tof -( -UEID_ENB -, -m_eNB_UE_X2AP_ID_Ex‹nsiÚ -), - -40 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -42 & -a¢_DEF_ENB_UE_X2AP_ID_Ex‹nsiÚ -, - -48 { -ATF_POINTER -, 1, -off£tof -( -UEID_ENB -, -glob®ENB_ID -), - -49 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -51 & -a¢_DEF_Glob®ENB_ID -, - -58 cÚ¡  - ga¢_MAP_UEID_ENB_oms_1 -[] = { 2, 3, 4 }; - -59 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_UEID_ENB_gs_1 -[] = { - -60 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -62 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_UEID_ENB_g2–_1 -[] = { - -63 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -64 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -65 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -66 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 }, - -67 { ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), 4, 0, 0 } - -69 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_UEID_ENB_¥ecs_1 - = { - -70 ( -UEID_ENB -), - -71 -off£tof -( -UEID_ENB -, -_a¢_ùx -), - -72 -a¢_MAP_UEID_ENB_g2–_1 -, - -74 -a¢_MAP_UEID_ENB_oms_1 -, - -78 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID_ENB - = { - -81 & -a¢_OP_SEQUENCE -, - -82 -a¢_DEF_UEID_ENB_gs_1 -, - -83 ( -a¢_DEF_UEID_ENB_gs_1 -) - -84 /( -a¢_DEF_UEID_ENB_gs_1 -[0]), - -85 -a¢_DEF_UEID_ENB_gs_1 -, - -86 ( -a¢_DEF_UEID_ENB_gs_1 -) - -87 /( -a¢_DEF_UEID_ENB_gs_1 -[0]), - -88 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -89 -a¢_MBR_UEID_ENB_1 -, - -91 & -a¢_SPC_UEID_ENB_¥ecs_1 - - - @UEID-GNB-CU-CP-E1AP-ID-Item.c - -8  - ~"UEID-GNB-CU-CP-E1AP-ID-I‹m.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_GNB_CU_CP_E1AP_ID_I‹m_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_GNB_CU_CP_E1AP_ID_I‹m -, -gNB_CU_CP_UE_E1AP_ID -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_GNB_CU_CP_UE_E1AP_ID -, - -21 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_UEID_GNB_CU_CP_E1AP_ID_I‹m_gs_1 -[] = { - -22 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -24 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_UEID_GNB_CU_CP_E1AP_ID_I‹m_g2–_1 -[] = { - -25 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -27 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_UEID_GNB_CU_CP_E1AP_ID_I‹m_¥ecs_1 - = { - -28 ( -UEID_GNB_CU_CP_E1AP_ID_I‹m -), - -29 -off£tof -( -UEID_GNB_CU_CP_E1AP_ID_I‹m -, -_a¢_ùx -), - -30 -a¢_MAP_UEID_GNB_CU_CP_E1AP_ID_I‹m_g2–_1 -, - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID_GNB_CU_CP_E1AP_ID_I‹m - = { - -38 & -a¢_OP_SEQUENCE -, - -39 -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_I‹m_gs_1 -, - -40 ( -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_I‹m_gs_1 -) - -41 /( -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_I‹m_gs_1 -[0]), - -42 -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_I‹m_gs_1 -, - -43 ( -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_I‹m_gs_1 -) - -44 /( -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_I‹m_gs_1 -[0]), - -45 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -46 -a¢_MBR_UEID_GNB_CU_CP_E1AP_ID_I‹m_1 -, - -48 & -a¢_SPC_UEID_GNB_CU_CP_E1AP_ID_I‹m_¥ecs_1 - - - @UEID-GNB-CU-CP-E1AP-ID-List.c - -8  - ~"UEID-GNB-CU-CP-E1AP-ID-Li¡.h -" - -10  - ~"UEID-GNB-CU-CP-E1AP-ID-I‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_UEID_GNB_CU_CP_E1AP_ID_Li¡_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 16, 16, 1, 65535 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_GNB_CU_CP_E1AP_ID_Li¡_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -18 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -20 & -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_I‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_UEID_GNB_CU_CP_E1AP_ID_Li¡_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_UEID_GNB_CU_CP_E1AP_ID_Li¡_¥ecs_1 - = { - -31 ( -UEID_GNB_CU_CP_E1AP_ID_Li¡ -), - -32 -off£tof -( -UEID_GNB_CU_CP_E1AP_ID_Li¡ -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID_GNB_CU_CP_E1AP_ID_Li¡ - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_Li¡_gs_1 -, - -40 ( -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_Li¡_gs_1 -) - -41 /( -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_Li¡_gs_1 -[0]), - -42 -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_Li¡_gs_1 -, - -43 ( -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_Li¡_gs_1 -) - -44 /( -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_Li¡_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_UEID_GNB_CU_CP_E1AP_ID_Li¡_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_UEID_GNB_CU_CP_E1AP_ID_Li¡_1 -, - -48 & -a¢_SPC_UEID_GNB_CU_CP_E1AP_ID_Li¡_¥ecs_1 - - - @UEID-GNB-CU-CP-F1AP-ID-Item.c - -8  - ~"UEID-GNB-CU-CP-F1AP-ID-I‹m.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_GNB_CU_CP_F1AP_ID_I‹m_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_GNB_CU_CP_F1AP_ID_I‹m -, -gNB_CU_UE_F1AP_ID -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_GNB_CU_UE_F1AP_ID -, - -21 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_UEID_GNB_CU_CP_F1AP_ID_I‹m_gs_1 -[] = { - -22 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -24 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_UEID_GNB_CU_CP_F1AP_ID_I‹m_g2–_1 -[] = { - -25 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -27 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_UEID_GNB_CU_CP_F1AP_ID_I‹m_¥ecs_1 - = { - -28 ( -UEID_GNB_CU_CP_F1AP_ID_I‹m -), - -29 -off£tof -( -UEID_GNB_CU_CP_F1AP_ID_I‹m -, -_a¢_ùx -), - -30 -a¢_MAP_UEID_GNB_CU_CP_F1AP_ID_I‹m_g2–_1 -, - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID_GNB_CU_CP_F1AP_ID_I‹m - = { - -38 & -a¢_OP_SEQUENCE -, - -39 -a¢_DEF_UEID_GNB_CU_CP_F1AP_ID_I‹m_gs_1 -, - -40 ( -a¢_DEF_UEID_GNB_CU_CP_F1AP_ID_I‹m_gs_1 -) - -41 /( -a¢_DEF_UEID_GNB_CU_CP_F1AP_ID_I‹m_gs_1 -[0]), - -42 -a¢_DEF_UEID_GNB_CU_CP_F1AP_ID_I‹m_gs_1 -, - -43 ( -a¢_DEF_UEID_GNB_CU_CP_F1AP_ID_I‹m_gs_1 -) - -44 /( -a¢_DEF_UEID_GNB_CU_CP_F1AP_ID_I‹m_gs_1 -[0]), - -45 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -46 -a¢_MBR_UEID_GNB_CU_CP_F1AP_ID_I‹m_1 -, - -48 & -a¢_SPC_UEID_GNB_CU_CP_F1AP_ID_I‹m_¥ecs_1 - - - @UEID-GNB-CU-F1AP-ID-List.c - -8  - ~"UEID-GNB-CU-F1AP-ID-Li¡.h -" - -10  - ~"UEID-GNB-CU-CP-F1AP-ID-I‹m.h -" - -11 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_UEID_GNB_CU_F1AP_ID_Li¡_cÚ¡r_1 - - gCC_NOTUSED - = { - -12 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -13 { -APC_CONSTRAINED -, 2, 2, 1, 4 } , - -16 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_GNB_CU_F1AP_ID_Li¡_1 -[] = { - -17 { -ATF_POINTER -, 0, 0, - -18 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)), - -20 & -a¢_DEF_UEID_GNB_CU_CP_F1AP_ID_I‹m -, - -27 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_UEID_GNB_CU_F1AP_ID_Li¡_gs_1 -[] = { - -28 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -30 -a¢_SET_OF_¥ecifics_t - - ga¢_SPC_UEID_GNB_CU_F1AP_ID_Li¡_¥ecs_1 - = { - -31 ( -UEID_GNB_CU_F1AP_ID_Li¡ -), - -32 -off£tof -( -UEID_GNB_CU_F1AP_ID_Li¡ -, -_a¢_ùx -), - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID_GNB_CU_F1AP_ID_Li¡ - = { - -38 & -a¢_OP_SEQUENCE_OF -, - -39 -a¢_DEF_UEID_GNB_CU_F1AP_ID_Li¡_gs_1 -, - -40 ( -a¢_DEF_UEID_GNB_CU_F1AP_ID_Li¡_gs_1 -) - -41 /( -a¢_DEF_UEID_GNB_CU_F1AP_ID_Li¡_gs_1 -[0]), - -42 -a¢_DEF_UEID_GNB_CU_F1AP_ID_Li¡_gs_1 -, - -43 ( -a¢_DEF_UEID_GNB_CU_F1AP_ID_Li¡_gs_1 -) - -44 /( -a¢_DEF_UEID_GNB_CU_F1AP_ID_Li¡_gs_1 -[0]), - -45 { 0, & -a¢_PER_ty³_UEID_GNB_CU_F1AP_ID_Li¡_cÚ¡r_1 -, -SEQUENCE_OF_cÚ¡¿št - }, - -46 -a¢_MBR_UEID_GNB_CU_F1AP_ID_Li¡_1 -, - -48 & -a¢_SPC_UEID_GNB_CU_F1AP_ID_Li¡_¥ecs_1 - - - @UEID-GNB-CU-UP.c - -8  - ~"UEID-GNB-CU-UP.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_GNB_CU_UP_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_GNB_CU_UP -, -gNB_CU_CP_UE_E1AP_ID -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_GNB_CU_CP_UE_E1AP_ID -, - -20 { -ATF_POINTER -, 1, -off£tof -( -UEID_GNB_CU_UP -, -¿n_UEID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_RANUEID -, - -30 cÚ¡  - ga¢_MAP_UEID_GNB_CU_UP_oms_1 -[] = { 1 }; - -31 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_UEID_GNB_CU_UP_gs_1 -[] = { - -32 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -34 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_UEID_GNB_CU_UP_g2–_1 -[] = { - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -36 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -38 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_UEID_GNB_CU_UP_¥ecs_1 - = { - -39 ( -UEID_GNB_CU_UP -), - -40 -off£tof -( -UEID_GNB_CU_UP -, -_a¢_ùx -), - -41 -a¢_MAP_UEID_GNB_CU_UP_g2–_1 -, - -43 -a¢_MAP_UEID_GNB_CU_UP_oms_1 -, - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID_GNB_CU_UP - = { - -50 & -a¢_OP_SEQUENCE -, - -51 -a¢_DEF_UEID_GNB_CU_UP_gs_1 -, - -52 ( -a¢_DEF_UEID_GNB_CU_UP_gs_1 -) - -53 /( -a¢_DEF_UEID_GNB_CU_UP_gs_1 -[0]), - -54 -a¢_DEF_UEID_GNB_CU_UP_gs_1 -, - -55 ( -a¢_DEF_UEID_GNB_CU_UP_gs_1 -) - -56 /( -a¢_DEF_UEID_GNB_CU_UP_gs_1 -[0]), - -57 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -58 -a¢_MBR_UEID_GNB_CU_UP_1 -, - -60 & -a¢_SPC_UEID_GNB_CU_UP_¥ecs_1 - - - @UEID-GNB-DU.c - -8  - ~"UEID-GNB-DU.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_GNB_DU_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_GNB_DU -, -gNB_CU_UE_F1AP_ID -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_GNB_CU_UE_F1AP_ID -, - -20 { -ATF_POINTER -, 1, -off£tof -( -UEID_GNB_DU -, -¿n_UEID -), - -21 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -23 & -a¢_DEF_RANUEID -, - -30 cÚ¡  - ga¢_MAP_UEID_GNB_DU_oms_1 -[] = { 1 }; - -31 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_UEID_GNB_DU_gs_1 -[] = { - -32 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -34 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_UEID_GNB_DU_g2–_1 -[] = { - -35 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -36 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 } - -38 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_UEID_GNB_DU_¥ecs_1 - = { - -39 ( -UEID_GNB_DU -), - -40 -off£tof -( -UEID_GNB_DU -, -_a¢_ùx -), - -41 -a¢_MAP_UEID_GNB_DU_g2–_1 -, - -43 -a¢_MAP_UEID_GNB_DU_oms_1 -, - -47 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID_GNB_DU - = { - -50 & -a¢_OP_SEQUENCE -, - -51 -a¢_DEF_UEID_GNB_DU_gs_1 -, - -52 ( -a¢_DEF_UEID_GNB_DU_gs_1 -) - -53 /( -a¢_DEF_UEID_GNB_DU_gs_1 -[0]), - -54 -a¢_DEF_UEID_GNB_DU_gs_1 -, - -55 ( -a¢_DEF_UEID_GNB_DU_gs_1 -) - -56 /( -a¢_DEF_UEID_GNB_DU_gs_1 -[0]), - -57 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -58 -a¢_MBR_UEID_GNB_DU_1 -, - -60 & -a¢_SPC_UEID_GNB_DU_¥ecs_1 - - - @UEID-GNB.c - -8  - ~"UEID-GNB.h -" - -10  - ~"UEID-GNB-CU-F1AP-ID-Li¡.h -" - -11  - ~"UEID-GNB-CU-CP-E1AP-ID-Li¡.h -" - -12  - ~"Glob®GNB-ID.h -" - -13  - ~"Glob®NGRANNodeID.h -" - -14 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_GNB_1 -[] = { - -15 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_GNB -, -amf_UE_NGAP_ID -), - -16 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -18 & -a¢_DEF_AMF_UE_NGAP_ID -, - -24 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_GNB -, -guami -), - -25 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -27 & -a¢_DEF_GUAMI -, - -33 { -ATF_POINTER -, 6, -off£tof -( -UEID_GNB -, -gNB_CU_UE_F1AP_ID_Li¡ -), - -34 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -36 & -a¢_DEF_UEID_GNB_CU_F1AP_ID_Li¡ -, - -42 { -ATF_POINTER -, 5, -off£tof -( -UEID_GNB -, -gNB_CU_CP_UE_E1AP_ID_Li¡ -), - -43 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -45 & -a¢_DEF_UEID_GNB_CU_CP_E1AP_ID_Li¡ -, - -51 { -ATF_POINTER -, 4, -off£tof -( -UEID_GNB -, -¿n_UEID -), - -52 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -54 & -a¢_DEF_RANUEID -, - -60 { -ATF_POINTER -, 3, -off£tof -( -UEID_GNB -, -m_NG_RAN_UE_XnAP_ID -), - -61 ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), - -63 & -a¢_DEF_NG_RANnodeUEXnAPID -, - -69 { -ATF_POINTER -, 2, -off£tof -( -UEID_GNB -, -glob®GNB_ID -), - -70 ( -ASN_TAG_CLASS_CONTEXT - | (6 << 2)), - -72 & -a¢_DEF_Glob®GNB_ID -, - -78 { -ATF_POINTER -, 1, -off£tof -( -UEID_GNB -, -glob®NG_RANNode_ID -), - -79 ( -ASN_TAG_CLASS_CONTEXT - | (7 << 2)), - -81 & -a¢_DEF_Glob®NGRANNodeID -, - -88 cÚ¡  - ga¢_MAP_UEID_GNB_oms_1 -[] = { 2, 3, 4, 5, 6, 7 }; - -89 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_UEID_GNB_gs_1 -[] = { - -90 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -92 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_UEID_GNB_g2–_1 -[] = { - -93 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -94 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -95 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -96 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 }, - -97 { ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), 4, 0, 0 }, - -98 { ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), 5, 0, 0 }, - -99 { ( -ASN_TAG_CLASS_CONTEXT - | (6 << 2)), 6, 0, 0 }, - -100 { ( -ASN_TAG_CLASS_CONTEXT - | (7 << 2)), 7, 0, 0 } - -102 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_UEID_GNB_¥ecs_1 - = { - -103 ( -UEID_GNB -), - -104 -off£tof -( -UEID_GNB -, -_a¢_ùx -), - -105 -a¢_MAP_UEID_GNB_g2–_1 -, - -107 -a¢_MAP_UEID_GNB_oms_1 -, - -111 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID_GNB - = { - -114 & -a¢_OP_SEQUENCE -, - -115 -a¢_DEF_UEID_GNB_gs_1 -, - -116 ( -a¢_DEF_UEID_GNB_gs_1 -) - -117 /( -a¢_DEF_UEID_GNB_gs_1 -[0]), - -118 -a¢_DEF_UEID_GNB_gs_1 -, - -119 ( -a¢_DEF_UEID_GNB_gs_1 -) - -120 /( -a¢_DEF_UEID_GNB_gs_1 -[0]), - -121 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -122 -a¢_MBR_UEID_GNB_1 -, - -124 & -a¢_SPC_UEID_GNB_¥ecs_1 - - - @UEID-NG-ENB-DU.c - -8  - ~"UEID-NG-ENB-DU.h -" - -10 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_NG_ENB_DU_1 -[] = { - -11 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_NG_ENB_DU -, -ng_eNB_CU_UE_W1AP_ID -), - -12 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -14 & -a¢_DEF_NGENB_CU_UE_W1AP_ID -, - -21 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_UEID_NG_ENB_DU_gs_1 -[] = { - -22 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -24 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_UEID_NG_ENB_DU_g2–_1 -[] = { - -25 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 } - -27 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_UEID_NG_ENB_DU_¥ecs_1 - = { - -28 ( -UEID_NG_ENB_DU -), - -29 -off£tof -( -UEID_NG_ENB_DU -, -_a¢_ùx -), - -30 -a¢_MAP_UEID_NG_ENB_DU_g2–_1 -, - -35 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID_NG_ENB_DU - = { - -38 & -a¢_OP_SEQUENCE -, - -39 -a¢_DEF_UEID_NG_ENB_DU_gs_1 -, - -40 ( -a¢_DEF_UEID_NG_ENB_DU_gs_1 -) - -41 /( -a¢_DEF_UEID_NG_ENB_DU_gs_1 -[0]), - -42 -a¢_DEF_UEID_NG_ENB_DU_gs_1 -, - -43 ( -a¢_DEF_UEID_NG_ENB_DU_gs_1 -) - -44 /( -a¢_DEF_UEID_NG_ENB_DU_gs_1 -[0]), - -45 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -46 -a¢_MBR_UEID_NG_ENB_DU_1 -, - -48 & -a¢_SPC_UEID_NG_ENB_DU_¥ecs_1 - - - @UEID-NG-ENB.c - -8  - ~"UEID-NG-ENB.h -" - -10  - ~"Glob®NgENB-ID.h -" - -11  - ~"Glob®NGRANNodeID.h -" - -12 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_NG_ENB_1 -[] = { - -13 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_NG_ENB -, -amf_UE_NGAP_ID -), - -14 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -16 & -a¢_DEF_AMF_UE_NGAP_ID -, - -22 { -ATF_NOFLAGS -, 0, -off£tof -( -UEID_NG_ENB -, -guami -), - -23 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -25 & -a¢_DEF_GUAMI -, - -31 { -ATF_POINTER -, 4, -off£tof -( -UEID_NG_ENB -, -ng_eNB_CU_UE_W1AP_ID -), - -32 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -34 & -a¢_DEF_NGENB_CU_UE_W1AP_ID -, - -40 { -ATF_POINTER -, 3, -off£tof -( -UEID_NG_ENB -, -m_NG_RAN_UE_XnAP_ID -), - -41 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -43 & -a¢_DEF_NG_RANnodeUEXnAPID -, - -49 { -ATF_POINTER -, 2, -off£tof -( -UEID_NG_ENB -, -glob®NgENB_ID -), - -50 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -52 & -a¢_DEF_Glob®NgENB_ID -, - -58 { -ATF_POINTER -, 1, -off£tof -( -UEID_NG_ENB -, -glob®NG_RANNode_ID -), - -59 ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), - -61 & -a¢_DEF_Glob®NGRANNodeID -, - -68 cÚ¡  - ga¢_MAP_UEID_NG_ENB_oms_1 -[] = { 2, 3, 4, 5 }; - -69 cÚ¡ -b”_Žv_g_t - - ga¢_DEF_UEID_NG_ENB_gs_1 -[] = { - -70 ( -ASN_TAG_CLASS_UNIVERSAL - | (16 << 2)) - -72 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_UEID_NG_ENB_g2–_1 -[] = { - -73 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -74 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -75 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -76 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 }, - -77 { ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), 4, 0, 0 }, - -78 { ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), 5, 0, 0 } - -80 -a¢_SEQUENCE_¥ecifics_t - - ga¢_SPC_UEID_NG_ENB_¥ecs_1 - = { - -81 ( -UEID_NG_ENB -), - -82 -off£tof -( -UEID_NG_ENB -, -_a¢_ùx -), - -83 -a¢_MAP_UEID_NG_ENB_g2–_1 -, - -85 -a¢_MAP_UEID_NG_ENB_oms_1 -, - -89 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID_NG_ENB - = { - -92 & -a¢_OP_SEQUENCE -, - -93 -a¢_DEF_UEID_NG_ENB_gs_1 -, - -94 ( -a¢_DEF_UEID_NG_ENB_gs_1 -) - -95 /( -a¢_DEF_UEID_NG_ENB_gs_1 -[0]), - -96 -a¢_DEF_UEID_NG_ENB_gs_1 -, - -97 ( -a¢_DEF_UEID_NG_ENB_gs_1 -) - -98 /( -a¢_DEF_UEID_NG_ENB_gs_1 -[0]), - -99 { 0, 0, -SEQUENCE_cÚ¡¿št - }, - -100 -a¢_MBR_UEID_NG_ENB_1 -, - -102 & -a¢_SPC_UEID_NG_ENB_¥ecs_1 - - - @UEID.c - -8  - ~"UEID.h -" - -10  - ~"UEID-GNB.h -" - -11  - ~"UEID-GNB-DU.h -" - -12  - ~"UEID-GNB-CU-UP.h -" - -13  - ~"UEID-NG-ENB.h -" - -14  - ~"UEID-NG-ENB-DU.h -" - -15  - ~"UEID-EN-GNB.h -" - -16  - ~"UEID-ENB.h -" - -17 -a¢_³r_cÚ¡¿šts_t - -a¢_PER_ty³_UEID_cÚ¡r_1 - - gCC_NOTUSED - = { - -18 { -APC_CONSTRAINED - | -APC_EXTENSIBLE -, 3, 3, 0, 6 } , - -19 { -APC_UNCONSTRAINED -, -1, -1, 0, 0 }, - -22 -a¢_TYPE_memb”_t - - ga¢_MBR_UEID_1 -[] = { - -23 { -ATF_POINTER -, 0, -off£tof -( -UEID -, -choiû -. -gNB_UEID -), - -24 ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), - -26 & -a¢_DEF_UEID_GNB -, - -32 { -ATF_POINTER -, 0, -off£tof -( -UEID -, -choiû -. -gNB_DU_UEID -), - -33 ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), - -35 & -a¢_DEF_UEID_GNB_DU -, - -41 { -ATF_POINTER -, 0, -off£tof -( -UEID -, -choiû -. -gNB_CU_UP_UEID -), - -42 ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), - -44 & -a¢_DEF_UEID_GNB_CU_UP -, - -50 { -ATF_POINTER -, 0, -off£tof -( -UEID -, -choiû -. -ng_eNB_UEID -), - -51 ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), - -53 & -a¢_DEF_UEID_NG_ENB -, - -59 { -ATF_POINTER -, 0, -off£tof -( -UEID -, -choiû -. -ng_eNB_DU_UEID -), - -60 ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), - -62 & -a¢_DEF_UEID_NG_ENB_DU -, - -68 { -ATF_POINTER -, 0, -off£tof -( -UEID -, -choiû -. -’_gNB_UEID -), - -69 ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), - -71 & -a¢_DEF_UEID_EN_GNB -, - -77 { -ATF_POINTER -, 0, -off£tof -( -UEID -, -choiû -. -eNB_UEID -), - -78 ( -ASN_TAG_CLASS_CONTEXT - | (6 << 2)), - -80 & -a¢_DEF_UEID_ENB -, - -87 cÚ¡ -a¢_TYPE_g2memb”_t - - ga¢_MAP_UEID_g2–_1 -[] = { - -88 { ( -ASN_TAG_CLASS_CONTEXT - | (0 << 2)), 0, 0, 0 }, - -89 { ( -ASN_TAG_CLASS_CONTEXT - | (1 << 2)), 1, 0, 0 }, - -90 { ( -ASN_TAG_CLASS_CONTEXT - | (2 << 2)), 2, 0, 0 }, - -91 { ( -ASN_TAG_CLASS_CONTEXT - | (3 << 2)), 3, 0, 0 }, - -92 { ( -ASN_TAG_CLASS_CONTEXT - | (4 << 2)), 4, 0, 0 }, - -93 { ( -ASN_TAG_CLASS_CONTEXT - | (5 << 2)), 5, 0, 0 }, - -94 { ( -ASN_TAG_CLASS_CONTEXT - | (6 << 2)), 6, 0, 0 } - -96 -a¢_CHOICE_¥ecifics_t - - ga¢_SPC_UEID_¥ecs_1 - = { - -97 ( -UEID -), - -98 -off£tof -( -UEID -, -_a¢_ùx -), - -99 -off£tof -( -UEID -, -´e£Á -), - -100 ((( -UEID - *)0)-> -´e£Á -), - -101 -a¢_MAP_UEID_g2–_1 -, - -106 -a¢_TYPE_desütÜ_t - - ga¢_DEF_UEID - = { - -109 & -a¢_OP_CHOICE -, - -114 { 0, & -a¢_PER_ty³_UEID_cÚ¡r_1 -, -CHOICE_cÚ¡¿št - }, - -115 -a¢_MBR_UEID_1 -, - -117 & -a¢_SPC_UEID_¥ecs_1 - - - @asn_SEQUENCE_OF.c - -5  - ~ - -6  - ~ - -8  - $A_SEQUENCE_OF -(è - ta¢_£qu’û -; - -11 - $a¢_£qu’û_d– -(* -a¢_£qu’û_of_x -,  -numb” -,  -_do_ä“ -) { - -12 -a¢_£qu’û - * -as - = (a¢_£qu’û *) -a¢_£qu’û_of_x -; - -14 if( -as -) { - -15 * -±r -; - -16  -n -; - -18 if( -numb” - < 0 ||‚umb” >ð -as --> -couÁ -) - -21 if( -_do_ä“ - && -as --> -ä“ -) { - -22 -±r - = -as --> -¬¿y -[ -numb” -]; - -24 -±r - = 0; - -30 -- -as --> -couÁ -; - -31  -n - = -numb” -;‚ < -as --> -couÁ -;‚++) - -32 -as --> -¬¿y -[ -n -] =‡s->array[n+1]; - -38 if( -±r -è -as --> - `ä“ -(ptr); - -40 - } -} - - @asn_SET_OF.c - -5  - ~ - -6  - ~ - -7  - ~<”ºo.h -> - -13 - $a¢_£t_add -(* -a¢_£t_of_x -, * -±r -) { - -14 -a¢_ªÚymous_£t_ - * -as - = - `_A_SET_FROM_VOID -( -a¢_£t_of_x -); - -16 if( -as - =ð0 || -±r - == 0) { - -17 -”ºo - = -EINVAL -; - -24 if( -as --> -couÁ - =ðas-> -size -) { - -25  -_Ãwsize - = -as --> -size - ? (as->size << 1) : 4; - -26 * -_Ãw_¬r -; - -27 -_Ãw_¬r - = - `REALLOC -( -as --> -¬¿y -, -_Ãwsize - * (as->array[0])); - -28 if( -_Ãw_¬r -) { - -29 -as --> -¬¿y - = (**) -_Ãw_¬r -; - -30 -as --> -size - = -_Ãwsize -; - -37 -as --> -¬¿y -[as-> -couÁ -++] = -±r -; - -40 - } -} - -43 - $a¢_£t_d– -(* -a¢_£t_of_x -,  -numb” -,  -_do_ä“ -) { - -44 -a¢_ªÚymous_£t_ - * -as - = - `_A_SET_FROM_VOID -( -a¢_£t_of_x -); - -46 if( -as -) { - -47 * -±r -; - -48 if( -numb” - < 0 ||‚umb” >ð -as --> -couÁ -) - -51 if( -_do_ä“ - && -as --> -ä“ -) { - -52 -±r - = -as --> -¬¿y -[ -numb” -]; - -54 -±r - = 0; - -57 -as --> -¬¿y -[ -numb” -] =‡s->¬¿y[--as-> -couÁ -]; - -63 if( -±r -è -as --> - `ä“ -(ptr); - -65 - } -} - -71 - $a¢_£t_em±y -(* -a¢_£t_of_x -) { - -72 -a¢_ªÚymous_£t_ - * -as - = - `_A_SET_FROM_VOID -( -a¢_£t_of_x -); - -74 if( -as -) { - -75 if( -as --> -¬¿y -) { - -76 if( -as --> -ä“ -) { - -77  -as --> -couÁ ---) - -78 -as --> - `ä“ -×s-> -¬¿y -[as-> -couÁ -]); - -80 - `FREEMEM -( -as --> -¬¿y -); - -81 -as --> -¬¿y - = 0; - -83 -as --> -couÁ - = 0; - -84 -as --> -size - = 0; - -87 - } -} - - @asn_application.c - -5  - ~ - -6  - ~ - -7  - ~<”ºo.h -> - -9  -a¢_’c_rv®_t - -a¢_’code_š‹º® -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -10 -a¢_Œªsãr_syÁax - -syÁax -, - -11 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -12 cÚ¡ * -¥Œ -, - -13 -a¢_­p_cÚsume_by‹s_f - * -ÿÎback -, - -14 * -ÿÎback_key -); - -17  - sÿÎback_couÁ_by‹s_key - { - -18 -a¢_­p_cÚsume_by‹s_f - * - mÿÎback -; - -19 * - mÿÎback_key -; - -20 -size_t - - mcompu‹d_size -; - -27 - $ÿÎback_couÁ_by‹s_cb -(cÚ¡ * -d©a -, -size_t - -size -, * -keyp -) { - -28  -ÿÎback_couÁ_by‹s_key - * -key - = -keyp -; - -29  -»t -; - -31 -»t - = -key --> - `ÿÎback -( -d©a -, -size -, key-> -ÿÎback_key -); - -32 if( -»t - >= 0) { - -33 -key --> -compu‹d_size - +ð -size -; - -36  -»t -; - -37 - } -} - -39  - sov”run_’cod”_key - { - -40 * - mbufãr -; - -41 -size_t - - mbufãr_size -; - -42 -size_t - - mcompu‹d_size -; - -45  - sdyÇmic_’cod”_key - { - -46 * - mbufãr -; - -47 -size_t - - mbufãr_size -; - -48 -size_t - - mcompu‹d_size -; - -51  - sÿÎback_çžu»_ÿtch_key - { - -52 -a¢_­p_cÚsume_by‹s_f - * - mÿÎback -; - -53 * - mÿÎback_key -; - -54  - mÿÎback_çžed -; - -62 - $ov”run_’cod”_cb -(cÚ¡ * -d©a -, -size_t - -size -, * -keyp -) { - -63  -ov”run_’cod”_key - * -key - = -keyp -; - -65 if( -key --> -compu‹d_size - + -size - > key-> -bufãr_size -) { - -70 -key --> -bufãr_size - = 0; - -72 - `memýy -((*) -key --> -bufãr - + key-> -compu‹d_size -, -d©a -, -size -); - -74 -key --> -compu‹d_size - +ð -size -; - -77 - } -} - -84 - $dyÇmic_’cod”_cb -(cÚ¡ * -d©a -, -size_t - -size -, * -keyp -) { - -85  -dyÇmic_’cod”_key - * -key - = -keyp -; - -87 if( -key --> -bufãr -) { - -88 if( -key --> -compu‹d_size - + -size - >ðkey-> -bufãr_size -) { - -89 * -p -; - -90 -size_t - -Ãw_size - = -key --> -bufãr_size -; - -93 -Ãw_size - *= 2; - -94 }  -Ãw_size - <ð -key --> -compu‹d_size - + -size -); - -96 -p - = - `REALLOC -( -key --> -bufãr -, -Ãw_size -); - -97 if( -p -) { - -98 -key --> -bufãr - = -p -; - -99 -key --> -bufãr_size - = -Ãw_size -; - -101 - `FREEMEM -( -key --> -bufãr -); - -102 -key --> -bufãr - = 0; - -103 -key --> -bufãr_size - = 0; - -104 -key --> -compu‹d_size - +ð -size -; - -108 - `memýy -((*) -key --> -bufãr - + key-> -compu‹d_size -, -d©a -, -size -); - -111 -key --> -compu‹d_size - +ð -size -; - -114 - } -} - -120 - $ÿÎback_çžu»_ÿtch_cb -(cÚ¡ * -d©a -, -size_t - -size -, * -keyp -) { - -121  -ÿÎback_çžu»_ÿtch_key - * -key - = -keyp -; - -122  -»t -; - -124 -»t - = -key --> - `ÿÎback -( -d©a -, -size -, key-> -ÿÎback_key -); - -125 if( -»t - < 0) { - -126 -key --> -ÿÎback_çžed - = 1; - -129  -»t -; - -130 - } -} - -132 -a¢_’c_rv®_t - - -133 - $a¢_’code -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -134 -a¢_Œªsãr_syÁax - -syÁax -, cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -135 cÚ¡ * -¥Œ -, -a¢_­p_cÚsume_by‹s_f - * -ÿÎback -, * -ÿÎback_key -) { - -136  -ÿÎback_çžu»_ÿtch_key - -cb_key -; - -137 -a¢_’c_rv®_t - -” - = {0,0,0}; - -139 if(! -ÿÎback -) { - -140 -”ºo - = -EINVAL -; - -141 -ASN__ENCODE_FAILED -; - -144 -cb_key -. -ÿÎback - = callback; - -145 -cb_key -. -ÿÎback_key - = callback_key; - -146 -cb_key -. -ÿÎback_çžed - = 0; - -148 -” - = - `a¢_’code_š‹º® -( -Ýt_codec_ùx -, -syÁax -, -td -, -¥Œ -, - -149 -ÿÎback_çžu»_ÿtch_cb -, & -cb_key -); - -150 if( -cb_key -. -ÿÎback_çžed -) { - -151 - `as£¹ -( -” -. -’coded - == -1); - -152 - `as£¹ -( -”ºo - =ð -EBADF -); - -153 -”ºo - = -EIO -; - -156  -” -; - -157 - } -} - -159 -a¢_’c_rv®_t - - -160 - $a¢_’code_to_bufãr -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -161 -a¢_Œªsãr_syÁax - -syÁax -, - -162 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -163 * -bufãr -, -size_t - -bufãr_size -) { - -164  -ov”run_’cod”_key - -buf_key -; - -165 -a¢_’c_rv®_t - -” - = {0,0,0}; - -167 if( -bufãr_size - > 0 && ! -bufãr -) { - -168 -”ºo - = -EINVAL -; - -169 -ASN__ENCODE_FAILED -; - -172 -buf_key -. -bufãr - = buffer; - -173 -buf_key -. -bufãr_size - = buffer_size; - -174 -buf_key -. -compu‹d_size - = 0; - -176 -” - = - `a¢_’code_š‹º® -( -Ýt_codec_ùx -, -syÁax -, -td -, -¥Œ -, - -177 -ov”run_’cod”_cb -, & -buf_key -); - -179 if( -” -. -’coded - >ð0 && ( -size_t -ër.’coded !ð -buf_key -. -compu‹d_size -) { - -180 - `ASN_DEBUG -("a¢_’code(è»tuºed %" -ASN_PRI_SSIZE - - -181 " y‘…roduûd %" -ASN_PRI_SIZE - " bytes", - -182 -” -. -’coded -, -buf_key -. -compu‹d_size -); - -183 - `as£¹ -( -” -. -’coded - < 0 || ( -size_t -ër.’coded =ð -buf_key -. -compu‹d_size -); - -186  -” -; - -187 - } -} - -189 -a¢_’code_to_Ãw_bufãr_»suÉ_t - - -190 - $a¢_’code_to_Ãw_bufãr -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -191 -a¢_Œªsãr_syÁax - -syÁax -, - -192 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -) { - -193  -dyÇmic_’cod”_key - -buf_key -; - -194 -a¢_’code_to_Ãw_bufãr_»suÉ_t - -»s -; - -196 -buf_key -. -bufãr_size - = 16; - -197 -buf_key -. -bufãr - = - `MALLOC -(buf_key. -bufãr_size -); - -198 -buf_key -. -compu‹d_size - = 0; - -200 -»s -. -»suÉ - = - `a¢_’code_š‹º® -( -Ýt_codec_ùx -, -syÁax -, -td -, -¥Œ -, - -201 -dyÇmic_’cod”_cb -, & -buf_key -); - -203 if( -»s -. -»suÉ -. -’coded - >= 0 - -204 && ( -size_t -) -»s -. -»suÉ -. -’coded - !ð -buf_key -. -compu‹d_size -) { - -205 - `ASN_DEBUG -("a¢_’code(è»tuºed %" -ASN_PRI_SSIZE - - -206 " y‘…roduûd %" -ASN_PRI_SIZE - " bytes", - -207 -»s -. -»suÉ -. -’coded -, -buf_key -. -compu‹d_size -); - -208 - `as£¹ -( -»s -. -»suÉ -. -’coded - < 0 - -209 || ( -size_t -) -»s -. -»suÉ -. -’coded - =ð -buf_key -. -compu‹d_size -); - -212 -»s -. -bufãr - = -buf_key -.buffer; - -215 if( -»s -. -bufãr -) { - -216 - `as£¹ -( -buf_key -. -compu‹d_size - < buf_key. -bufãr_size -); - -217 ((*) -»s -. -bufãr -)[ -buf_key -. -compu‹d_size -] = '\0'; - -220  -»s -; - -221 - } -} - -223  -a¢_’c_rv®_t - - -224 - $a¢_’code_š‹º® -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -225 -a¢_Œªsãr_syÁax - -syÁax -, - -226 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -227 -a¢_­p_cÚsume_by‹s_f - * -ÿÎback -, * -ÿÎback_key -) { - -228 -a¢_’c_rv®_t - -” - = {0,0,0}; - -229 -x”_’cod”_æags_e - -x”_æags - = -XER_F_CANONICAL -; - -231 () -Ýt_codec_ùx -; - -233 if(! -td - || ! -¥Œ -) { - -234 -”ºo - = -EINVAL -; - -235 -ASN__ENCODE_FAILED -; - -238  -syÁax -) { - -239  -ATS_NONSTANDARD_PLAINTEXT -: - -240 if( -td --> -Ý --> -´št_¡ruù -) { - -241  -ÿÎback_couÁ_by‹s_key - -cb_key -; - -242 -cb_key -. -ÿÎback - = callback; - -243 -cb_key -. -ÿÎback_key - = callback_key; - -244 -cb_key -. -compu‹d_size - = 0; - -245 if( -td --> -Ý --> - `´št_¡ruù -Ñd, -¥Œ -, 1, -ÿÎback_couÁ_by‹s_cb -, - -246 & -cb_key -) - -248 || - `ÿÎback_couÁ_by‹s_cb -("\n", 1, & -cb_key -) < 0) { - -249 -”ºo - = -EBADF -; - -250 -” -. -’coded - = -1; - -251 -” -. -çžed_ty³ - = -td -; - -252 -” -. -¡ruùu»_±r - = -¥Œ -; - -254 -” -. -’coded - = -cb_key -. -compu‹d_size -; - -255 -” -. -çžed_ty³ - = 0; - -256 -” -. -¡ruùu»_±r - = 0; - -259 -”ºo - = -ENOENT -; - -260 -ASN__ENCODE_FAILED -; - -264  -ATS_RANDOM -: - -265 -”ºo - = -ENOENT -; - -266 -ASN__ENCODE_FAILED -; - -268  -ATS_BER -: - -271  -ATS_DER -: - -272 if( -td --> -Ý --> -d”_’cod” -) { - -273 -” - = - `d”_’code -( -td -, -¥Œ -, -ÿÎback -, -ÿÎback_key -); - -274 if( -” -. -’coded - == -1) { - -275 if( -” -. -çžed_ty³ - &&ƒr.çžed_ty³-> -Ý --> -d”_’cod” -) { - -276 -”ºo - = -EBADF -; - -278 -”ºo - = -ENOENT -; - -282 -”ºo - = -ENOENT -; - -283 -ASN__ENCODE_FAILED -; - -286  -ATS_CER -: - -287 -”ºo - = -ENOENT -; - -288 -ASN__ENCODE_FAILED -; - -290 #ifdeà -ASN_DISABLE_OER_SUPPORT - - -291  -ATS_BASIC_OER -: - -292  -ATS_CANONICAL_OER -: - -293 -”ºo - = -ENOENT -; - -294 -ASN__ENCODE_FAILED -; - -297  -ATS_BASIC_OER -: - -300  -ATS_CANONICAL_OER -: - -301 if( -td --> -Ý --> -Ûr_’cod” -) { - -302 -” - = - `Ûr_’code -( -td -, -¥Œ -, -ÿÎback -, -ÿÎback_key -); - -303 if( -” -. -’coded - == -1) { - -304 if( -” -. -çžed_ty³ - &&ƒr.çžed_ty³-> -Ý --> -Ûr_’cod” -) { - -305 -”ºo - = -EBADF -; - -307 -”ºo - = -ENOENT -; - -311 -”ºo - = -ENOENT -; - -312 -ASN__ENCODE_FAILED -; - -317 #ifdeà -ASN_DISABLE_PER_SUPPORT - - -318  -ATS_UNALIGNED_BASIC_PER -: - -319  -ATS_UNALIGNED_CANONICAL_PER -: - -320  -ATS_ALIGNED_BASIC_PER -: - -321  -ATS_ALIGNED_CANONICAL_PER -: - -322 -”ºo - = -ENOENT -; - -323 -ASN__ENCODE_FAILED -; - -326  -ATS_UNALIGNED_BASIC_PER -: - -329  -ATS_UNALIGNED_CANONICAL_PER -: - -330 if( -td --> -Ý --> -u³r_’cod” -) { - -331 -” - = - `u³r_’code -( -td -, 0, -¥Œ -, -ÿÎback -, -ÿÎback_key -); - -332 if( -” -. -’coded - == -1) { - -333 if( -” -. -çžed_ty³ - &&ƒr.çžed_ty³-> -Ý --> -u³r_’cod” -) { - -334 -”ºo - = -EBADF -; - -336 -”ºo - = -ENOENT -; - -339 - `ASN_DEBUG -("Com¶‘’coded iÀ%ld b™s", () -” -. -’coded -); - -340 if( -” -. -’coded - == 0) { - -342 if( - `ÿÎback -("\0", 1, -ÿÎback_key -) < 0) { - -343 -”ºo - = -EBADF -; - -344 -ASN__ENCODE_FAILED -; - -346 -” -. -’coded - = 8; - -349 -” -. -’coded - = (er.encoded + 7) >> 3; - -352 -”ºo - = -ENOENT -; - -353 -ASN__ENCODE_FAILED -; - -356  -ATS_ALIGNED_BASIC_PER -: - -359  -ATS_ALIGNED_CANONICAL_PER -: - -360 if( -td --> -Ý --> -­”_’cod” -) { - -361 -” - = - `­”_’code -( -td -, 0, -¥Œ -, -ÿÎback -, -ÿÎback_key -); - -362 if( -” -. -’coded - == -1) { - -363 if( -” -. -çžed_ty³ - &&ƒr.çžed_ty³-> -Ý --> -­”_’cod” -) { - -364 -”ºo - = -EBADF -; - -366 -”ºo - = -ENOENT -; - -369 - `ASN_DEBUG -("Com¶‘’coded iÀ%ld b™s", () -” -. -’coded -); - -370 if( -” -. -’coded - == 0) { - -372 if( - `ÿÎback -("\0", 1, -ÿÎback_key -) < 0) { - -373 -”ºo - = -EBADF -; - -374 -ASN__ENCODE_FAILED -; - -376 -” -. -’coded - = 8; - -379 -” -. -’coded - = (er.encoded + 7) >> 3; - -382 -”ºo - = -ENOENT -; - -383 -ASN__ENCODE_FAILED -; - -388  -ATS_BASIC_XER -: - -390 -x”_æags - &ð~ -XER_F_CANONICAL -; - -391 -x”_æags - |ð -XER_F_BASIC -; - -393  -ATS_CANONICAL_XER -: - -394 if( -td --> -Ý --> -x”_’cod” -) { - -395 -” - = - `x”_’code -( -td -, -¥Œ -, -x”_æags -, -ÿÎback -, -ÿÎback_key -); - -396 if( -” -. -’coded - == -1) { - -397 if( -” -. -çžed_ty³ - &&ƒr.çžed_ty³-> -Ý --> -x”_’cod” -) { - -398 -”ºo - = -EBADF -; - -400 -”ºo - = -ENOENT -; - -404 -”ºo - = -ENOENT -; - -405 -ASN__ENCODE_FAILED -; - -410 -”ºo - = -ENOENT -; - -411 -ASN__ENCODE_FAILED -; - -414  -” -; - -415 - } -} - -417 -a¢_dec_rv®_t - - -418 - $a¢_decode -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -419 -a¢_Œªsãr_syÁax - -syÁax -, cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -420 ** -¥Œ -, cÚ¡ * -bufãr -, -size_t - -size -) { - -421 if(! -td - || !td-> -Ý - || ! -¥Œ - || ( -size - && ! -bufãr -)) { - -422 -ASN__DECODE_FAILED -; - -425  -syÁax -) { - -426  -ATS_CER -: - -427  -ATS_NONSTANDARD_PLAINTEXT -: - -429 -”ºo - = -ENOENT -; - -430 -ASN__DECODE_FAILED -; - -432  -ATS_RANDOM -: - -433 if(! -td --> -Ý --> -¿ndom_fžl -) { - -434 -ASN__DECODE_FAILED -; - -436 if( - `a¢_¿ndom_fžl -( -td -, -¥Œ -, 16000) == 0) { - -437 -a¢_dec_rv®_t - -»t - = { -RC_OK -, 0}; - -438  -»t -; - -440 -ASN__DECODE_FAILED -; - -445  -ATS_DER -: - -446  -ATS_BER -: - -447  - `b”_decode -( -Ýt_codec_ùx -, -td -, -¥Œ -, -bufãr -, -size -); - -449  -ATS_BASIC_OER -: - -450  -ATS_CANONICAL_OER -: - -451 #ifdeà -ASN_DISABLE_OER_SUPPORT - - -452 -”ºo - = -ENOENT -; - -453 -ASN__DECODE_FAILED -; - -455  - `Ûr_decode -( -Ýt_codec_ùx -, -td -, -¥Œ -, -bufãr -, -size -); - -458  -ATS_UNALIGNED_BASIC_PER -: - -459  -ATS_UNALIGNED_CANONICAL_PER -: - -460 #ifdeà -ASN_DISABLE_PER_SUPPORT - - -461 -”ºo - = -ENOENT -; - -462 -ASN__DECODE_FAILED -; - -464  - `u³r_decode_com¶‘e -( -Ýt_codec_ùx -, -td -, -¥Œ -, -bufãr -, -size -); - -467  -ATS_ALIGNED_BASIC_PER -: - -468  -ATS_ALIGNED_CANONICAL_PER -: - -469 #ifdeà -ASN_DISABLE_PER_SUPPORT - - -470 -”ºo - = -ENOENT -; - -471 -ASN__DECODE_FAILED -; - -473  - `­”_decode_com¶‘e -( -Ýt_codec_ùx -, -td -, -¥Œ -, -bufãr -, -size -); - -476  -ATS_BASIC_XER -: - -477  -ATS_CANONICAL_XER -: - -478  - `x”_decode -( -Ýt_codec_ùx -, -td -, -¥Œ -, -bufãr -, -size -); - -480 - } -} - - @asn_bit_data.c - -6  - ~ - -7  - ~ - -8  - ~ - -14 -a¢_b™_d©a_t - * - -15 - $a¢_b™_d©a_Ãw_cÚtiguous -(cÚ¡ * -d©a -, -size_t - -size_b™s -) { - -16 -size_t - -size_by‹s - = ( -size_b™s - + 7) / 8; - -17 -a¢_b™_d©a_t - * -pd -; - -18 -ušt8_t - * -by‹s -; - -21 -pd - = - `CALLOC -(1, (*pdè+ -size_by‹s - + 1); - -22 if(! -pd -) { - -23  -NULL -; - -25 -by‹s - = (*)(((*) -pd -) + (*pd)); - -26 - `memýy -( -by‹s -, -d©a -, -size_by‹s -); - -27 -by‹s -[ -size_by‹s -] = 0; - -28 -pd --> -bufãr - = -by‹s -; - -29 -pd --> -nboff - = 0; - -30 -pd --> -nb™s - = -size_b™s -; - -32  -pd -; - -33 - } -} - -37 - $a¢_b™_d©a_¡ršg -( -a¢_b™_d©a_t - * -pd -) { - -38  -buf -[2][32]; - -39  -n -; - -40 -n - = (n+1) % 2; - -41 - `¢´štf -( -buf -[ -n -], (buf[n]), - -42 "{m=%" -ASN_PRI_SIZE - " span %" ASN_PRI_SIZE "[%" ASN_PRI_SIZE - -43 "..%" -ASN_PRI_SIZE - "] (%" ASN_PRI_SIZE ")}", - -44 -pd --> -moved -, (( -ušŒ_t -)Õd-> -bufãr -è& 0xf),…d-> -nboff -,…d-> -nb™s -, - -45 -pd --> -nb™s - -…d-> -nboff -); - -46  -buf -[ -n -]; - -47 - } -} - -50 - $a¢_g‘_undo -( -a¢_b™_d©a_t - * -pd -,  -nb™s -) { - -51 if(( -ssize_t -) -pd --> -nboff - < -nb™s -) { - -52 - `as£¹ -(( -ssize_t -) -pd --> -nboff - < -nb™s -); - -54 -pd --> -nboff - -ð -nb™s -; - -55 -pd --> -moved - -ð -nb™s -; - -57 - } -} - -62 -št32_t - - -63 - $a¢_g‘_ãw_b™s -( -a¢_b™_d©a_t - * -pd -,  -nb™s -) { - -64 -size_t - -off -; - -65 -ssize_t - -Æeá -; - -66 -ušt32_t - -accum -; - -67 cÚ¡ -ušt8_t - * -buf -; - -69 if( -nb™s - < 0) - -72 -Æeá - = -pd --> -nb™s - -…d-> -nboff -; - -73 if( -nb™s - > -Æeá -) { - -74 -št32_t - -žv -, -vh—d -; - -75 if(! -pd --> -»fžl - || -nb™s - > 31)  -1; - -77 - `ASN_DEBUG -("Obtainhe„est %d bits (want %d)", - -78 () -Æeá -, () -nb™s -); - -79 -žv - = - `a¢_g‘_ãw_b™s -( -pd -, -Æeá -); - -80 if( -žv - < 0)  -1; - -82 if( -pd --> - `»fžl -(pd)) - -84 -nb™s - -ð -Æeá -; - -85 -vh—d - = - `a¢_g‘_ãw_b™s -( -pd -, -nb™s -); - -87 -žv - = (žv << -nb™s -è| -vh—d -; - -88  -žv -; - -94 if( -pd --> -nboff - >= 8) { - -95 -pd --> -bufãr - +ðÕd-> -nboff - >> 3); - -96 -pd --> -nb™s - -ðÕd-> -nboff - & ~0x07); - -97 -pd --> -nboff - &= 0x07; - -99 -pd --> -moved - +ð -nb™s -; - -100 -pd --> -nboff - +ð -nb™s -; - -101 -off - = -pd --> -nboff -; - -102 -buf - = -pd --> -bufãr -; - -107 if( -off - <= 8) - -108 -accum - = -nb™s - ? ( -buf -[0]è>> (8 - -off -) : 0; - -109 if( -off - <= 16) - -110 -accum - = (( -buf -[0] << 8è+ buf[1]è>> (16 - -off -); - -111 if( -off - <= 24) - -112 -accum - = (( -buf -[0] << 16è+ (buf[1] << 8è+ buf[2]è>> (24 - -off -); - -113 if( -off - <= 31) - -114 -accum - = ((( -ušt32_t -) -buf -[0] << 24) + (buf[1] << 16) - -115 + ( -buf -[2] << 8è+ (buf[3])è>> (32 - -off -); - -116 if( -nb™s - <= 31) { - -117 -a¢_b™_d©a_t - -d - = * -pd -; - -119 - `a¢_g‘_undo -(& -d -, -nb™s -); - -123 -accum - = - `a¢_g‘_ãw_b™s -(& -d -, -nb™s - - 24) << 24; - -124 -accum - |ð - `a¢_g‘_ãw_b™s -(& -d -, 24); - -126 - `a¢_g‘_undo -( -pd -, -nb™s -); - -130 -accum - &ð((( -ušt32_t -)1 << -nb™s -) - 1); - -132 - `ASN_DEBUG -(" [PER got %2d<=%2d bits => span %d %+ld[%d..%d]:%02x (%d) => 0x%x]", - -133 () -nb™s -, () -Æeá -, - -134 () -pd --> -moved -, - -135 ((() -pd --> -bufãr -) & 0xf), - -136 () -pd --> -nboff -, (íd-> -nb™s -, - -137 (( -pd --> -bufãr - !ð -NULL -)?pd->buffer[0]:0), - -138 ()( -pd --> -nb™s - -…d-> -nboff -), - -139 () -accum -); - -141  -accum -; - -142 - } -} - -148 - $a¢_g‘_mªy_b™s -( -a¢_b™_d©a_t - * -pd -, -ušt8_t - * -d¡ -,  -®right -,  -nb™s -) { - -149 -št32_t - -v®ue -; - -151 if( -®right - && ( -nb™s - & 7)) { - -153 -v®ue - = - `a¢_g‘_ãw_b™s -( -pd -, -nb™s - & 0x07); - -154 if( -v®ue - < 0)  -1; - -155 * -d¡ -++ = -v®ue -; - -156 -nb™s - &= ~7; - -159  -nb™s -) { - -160 if( -nb™s - >= 24) { - -161 -v®ue - = - `a¢_g‘_ãw_b™s -( -pd -, 24); - -162 if( -v®ue - < 0)  -1; - -163 *( -d¡ -++èð -v®ue - >> 16; - -164 *( -d¡ -++èð -v®ue - >> 8; - -165 *( -d¡ -++èð -v®ue -; - -166 -nb™s - -= 24; - -168 -v®ue - = - `a¢_g‘_ãw_b™s -( -pd -, -nb™s -); - -169 if( -v®ue - < 0)  -1; - -170 if( -nb™s - & 7) { - -171 -v®ue - <<ð8 - ( -nb™s - & 7), - -172 -nb™s - += 8 - (nbits & 7); - -173 if( -nb™s - > 24) - -174 * -d¡ -++ = -v®ue - >> 24; - -176 if( -nb™s - > 16) - -177 * -d¡ -++ = -v®ue - >> 16; - -178 if( -nb™s - > 8) - -179 * -d¡ -++ = -v®ue - >> 8; - -180 * -d¡ -++ = -v®ue -; - -186 - } -} - -192 - $a¢_put_ãw_b™s -( -a¢_b™_ou_t - * -po -, -ušt32_t - -b™s -,  -ob™s -) { - -193 -size_t - -off -; - -194 -size_t - -omsk -; - -195 -ušt8_t - * -buf -; - -197 if( -ob™s - <= 0 || obits >= 32)  obits ? -1 : 0; - -199 - `ASN_DEBUG -("[PER…ut %d bits %xo %p+%d bits]", - -200 -ob™s -, () -b™s -, (*) -po --> -bufãr -, (ío-> -nboff -); - -205 if( -po --> -nboff - >= 8) { - -206 -po --> -bufãr - +ðÕo-> -nboff - >> 3); - -207 -po --> -nb™s - -ðÕo-> -nboff - & ~0x07); - -208 -po --> -nboff - &= 0x07; - -214 if( -po --> -nboff - + -ob™s - >…o-> -nb™s -) { - -215 -size_t - -com¶‘e_by‹s -; - -216 if(! -po --> -bufãr -èpo->bufã¸ðpo-> -tmp¥aû -; - -217 -com¶‘e_by‹s - = ( -po --> -bufãr - -…o-> -tmp¥aû -); - -218 - `ASN_DEBUG -("[PER output %ld complete + %ld]", - -219 () -com¶‘e_by‹s -, () -po --> -æushed_by‹s -); - -220 if( -po --> - `ouut -Õo-> -tmp¥aû -, -com¶‘e_by‹s -,…o-> -Ý_key -) < 0) - -222 if( -po --> -nboff -) - -223 -po --> -tmp¥aû -[0] =…o-> -bufãr -[0]; - -224 -po --> -bufãr - =…o-> -tmp¥aû -; - -225 -po --> -nb™s - = 8 * Õo-> -tmp¥aû -); - -226 -po --> -æushed_by‹s - +ð -com¶‘e_by‹s -; - -232 -buf - = -po --> -bufãr -; - -233 -omsk - = ~((1 << (8 - -po --> -nboff -)) - 1); - -234 -off - = ( -po --> -nboff - + -ob™s -); - -237 -b™s - &ð((( -ušt32_t -)1 << -ob™s -) - 1); - -239 - `ASN_DEBUG -("[PER ouˆ%d %u/%x (t=%d,o=%dè%x&%x=%x]", -ob™s -, - -240 () -b™s -, ()bits, - -241 () -po --> -nboff -, () -off -, - -242 -buf -[0], ()( -omsk -&0xff), - -243 ()( -buf -[0] & -omsk -)); - -245 if( -off - <= 8) - -246 -po --> -nboff - = -off -, - -247 -b™s - <<ð(8 - -off -), - -248 -buf -[0] = (buf[0] & -omsk -è| -b™s -; - -249 if( -off - <= 16) - -250 -po --> -nboff - = -off -, - -251 -b™s - <<ð(16 - -off -), - -252 -buf -[0] = (buf[0] & -omsk -è| ( -b™s - >> 8), - -253 -buf -[1] = -b™s -; - -254 if( -off - <= 24) - -255 -po --> -nboff - = -off -, - -256 -b™s - <<ð(24 - -off -), - -257 -buf -[0] = (buf[0] & -omsk -è| ( -b™s - >> 16), - -258 -buf -[1] = -b™s - >> 8, - -259 -buf -[2] = -b™s -; - -260 if( -off - <= 31) - -261 -po --> -nboff - = -off -, - -262 -b™s - <<ð(32 - -off -), - -263 -buf -[0] = (buf[0] & -omsk -è| ( -b™s - >> 24), - -264 -buf -[1] = -b™s - >> 16, - -265 -buf -[2] = -b™s - >> 8, - -266 -buf -[3] = -b™s -; - -268 if( - `a¢_put_ãw_b™s -( -po -, -b™s - >> ( -ob™s - - 24), 24))  -1; - -269 if( - `a¢_put_ãw_b™s -( -po -, -b™s -, -ob™s - - 24))  -1; - -272 - `ASN_DEBUG -("[PER out %u/%x => %02x buf+%ld]", - -273 () -b™s -, ()b™s, -buf -[0], - -274 ()( -po --> -bufãr - -…o-> -tmp¥aû -)); - -277 - } -} - -284 - $a¢_put_mªy_b™s -( -a¢_b™_ou_t - * -po -, cÚ¡ -ušt8_t - * -¤c -,  -nb™s -) { - -286  -nb™s -) { - -287 -ušt32_t - -v®ue -; - -289 if( -nb™s - >= 24) { - -290 -v®ue - = ( -¤c -[0] << 16) | (src[1] << 8) | src[2]; - -291 -¤c - += 3; - -292 -nb™s - -= 24; - -293 if( - `a¢_put_ãw_b™s -( -po -, -v®ue -, 24)) - -296 -v®ue - = -¤c -[0]; - -297 if( -nb™s - > 8) - -298 -v®ue - = (v®u<< 8è| -¤c -[1]; - -299 if( -nb™s - > 16) - -300 -v®ue - = (v®u<< 8è| -¤c -[2]; - -301 if( -nb™s - & 0x07) - -302 -v®ue - >>ð(8 - ( -nb™s - & 0x07)); - -303 if( - `a¢_put_ãw_b™s -( -po -, -v®ue -, -nb™s -)) - -310 - } -} - -314 - $a¢_put_®igÃd_æush -( -a¢_b™_ou_t - * -po -) { - -315 -ušt32_t - -unu£d_b™s - = (0x7 & (8 - ( -po --> -nboff - & 0x07))); - -316 -size_t - -com¶‘e_by‹s - = - -317 ( -po --> -bufãr - ?…o->bufã¸-…o-> -tmp¥aû - : 0è+ (Õo-> -nboff - + 7) >> 3); - -319 if( -unu£d_b™s -) { - -320 -po --> -bufãr -[po-> -nboff - >> 3] &ð~0u << -unu£d_b™s -; - -323 if( -po --> - `ouut -Õo-> -tmp¥aû -, -com¶‘e_by‹s -,…o-> -Ý_key -) < 0) { - -326 -po --> -bufãr - =…o-> -tmp¥aû -; - -327 -po --> -nboff - = 0; - -328 -po --> -nb™s - = 8 * Õo-> -tmp¥aû -); - -329 -po --> -æushed_by‹s - +ð -com¶‘e_by‹s -; - -332 - } -} - - @asn_codecs_prim.c - -5  - ~ - -6  - ~ - -7  - ~<”ºo.h -> - -12 -a¢_dec_rv®_t - - -13 - $b”_decode_´im™ive -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -14 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -15 cÚ¡ * -buf_±r -, -size_t - -size -,  -g_mode -) { - -16 -ASN__PRIMITIVE_TYPE_t - * -¡ - = (ASN__PRIMITIVE_TYPE_ˆ*)* -¥Œ -; - -17 -a¢_dec_rv®_t - -rv® -; - -18 -b”_Žv_Ën_t - -Ëngth - = 0; - -23 if( -¡ - =ð -NULL -) { - -24 -¡ - = ( -ASN__PRIMITIVE_TYPE_t - *) - `CALLOC -(1, (*st)); - -25 if( -¡ - =ð -NULL -è -ASN__DECODE_FAILED -; - -26 * -¥Œ - = (*) -¡ -; - -29 - `ASN_DEBUG -("Decoding %s‡s…lain…rimitive (tm=%d)", - -30 -td --> -Çme -, -g_mode -); - -35 -rv® - = - `b”_check_gs -( -Ýt_codec_ùx -, -td -, 0, -buf_±r -, -size -, - -36 -g_mode -, 0, & -Ëngth -, 0); - -37 if( -rv® -. -code - !ð -RC_OK -) - -38  -rv® -; - -40 - `ASN_DEBUG -("% Ëngth i %d by‹s", -td --> -Çme -, () -Ëngth -); - -45 -buf_±r - = ((cÚ¡ *)buf_±rè+ -rv® -. -cÚsumed -; - -46 -size - -ð -rv® -. -cÚsumed -; - -47 if( -Ëngth - > ( -b”_Žv_Ën_t -) -size -) { - -48 -rv® -. -code - = -RC_WMORE -; - -49 -rv® -. -cÚsumed - = 0; - -50  -rv® -; - -53 -¡ --> -size - = () -Ëngth -; - -55 if(( -¡ --> -size -è!ð( -Ëngth -) - -56 && ( -b”_Žv_Ën_t -) -¡ --> -size - !ð -Ëngth -) { - -57 -¡ --> -size - = 0; - -58 -ASN__DECODE_FAILED -; - -61 -¡ --> -buf - = ( -ušt8_t - *) - `MALLOC -( -Ëngth - + 1); - -62 if(! -¡ --> -buf -) { - -63 -¡ --> -size - = 0; - -64 -ASN__DECODE_FAILED -; - -67 - `memýy -( -¡ --> -buf -, -buf_±r -, -Ëngth -); - -68 -¡ --> -buf -[ -Ëngth -] = '\0'; - -70 -rv® -. -code - = -RC_OK -; - -71 -rv® -. -cÚsumed - +ð -Ëngth -; - -73 - `ASN_DEBUG -("Took %ld/%ld bytesoƒncode %s", - -74 () -rv® -. -cÚsumed -, - -75 () -Ëngth -, -td --> -Çme -); - -77  -rv® -; - -78 - } -} - -83 -a¢_’c_rv®_t - - -84 - $d”_’code_´im™ive -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -85  -g_mode -, -b”_Žv_g_t - -g -, - -86 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -87 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -88 cÚ¡ -ASN__PRIMITIVE_TYPE_t - * -¡ - = (cÚ¡ ASN__PRIMITIVE_TYPE_ˆ*) -¥Œ -; - -90 - `ASN_DEBUG -("%s %s‡s‡…rimitiveype (tm=%d)", - -91 -cb -?"Encodšg":"E¡im©šg", -td --> -Çme -, -g_mode -); - -93 -”v® -. -’coded - = - `d”_wr™e_gs -( -td -, -¡ --> -size -, -g_mode -, 0, -g -, - -94 -cb -, -­p_key -); - -95 - `ASN_DEBUG -("% wrِg %d", -td --> -Çme -, () -”v® -. -’coded -); - -96 if( -”v® -. -’coded - == -1) { - -97 -”v® -. -çžed_ty³ - = -td -; - -98 -”v® -. -¡ruùu»_±r - = -¥Œ -; - -99  -”v® -; - -102 if( -cb - && -¡ --> -buf -) { - -103 if( - `cb -( -¡ --> -buf -, st-> -size -, -­p_key -) < 0) { - -104 -”v® -. -’coded - = -1; - -105 -”v® -. -çžed_ty³ - = -td -; - -106 -”v® -. -¡ruùu»_±r - = -¥Œ -; - -107  -”v® -; - -110 - `as£¹ -( -¡ --> -buf - || st-> -size - == 0); - -113 -”v® -. -’coded - +ð -¡ --> -size -; - -114 - `ASN__ENCODED_OK -( -”v® -); - -115 - } -} - -118 - $ASN__PRIMITIVE_TYPE_ä“ -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -119 -a¢_¡ruù_ä“_m‘hod - -m‘hod -) { - -120 -ASN__PRIMITIVE_TYPE_t - * -¡ - = (ASN__PRIMITIVE_TYPE_ˆ*) -¥Œ -; - -122 if(! -td - || ! -¥Œ -) - -125 - `ASN_DEBUG -("F»ešg % a ¨´im™ivty³", -td --> -Çme -); - -127 if( -¡ --> -buf -) - -128 - `FREEMEM -( -¡ --> -buf -); - -130  -m‘hod -) { - -131  -ASFM_FREE_EVERYTHING -: - -132 - `FREEMEM -( -¥Œ -); - -134  -ASFM_FREE_UNDERLYING -: - -136  -ASFM_FREE_UNDERLYING_AND_RESET -: - -137 - `mem£t -( -¥Œ -, 0, ( -ASN__PRIMITIVE_TYPE_t -)); - -140 - } -} - -146  - sxdp_¬g_s - { - -147 cÚ¡ -a¢_TYPE_desütÜ_t - * - mty³_desütÜ -; - -148 * - m¡ruù_key -; - -149 -x”_´im™ive_body_decod”_f - * - m´im_body_decod” -; - -150  - mdecoded_som‘hšg -; - -151  - mwªt_mÜe -; - -160 - $x”_decode__uÃx³ùed_g -(* -key -, cÚ¡ * -chunk_buf -, -size_t - -chunk_size -) { - -161  -xdp_¬g_s - * -¬g - = (xdp_¬g_ *) -key -; - -162 -x”_pbd_rv® - -b»t -; - -167 - `as£¹ -( -chunk_size - && ((cÚ¡ *) -chunk_buf -)[0] == 0x3c); - -172 if( -¬g --> -decoded_som‘hšg -) - -175 -b»t - = -¬g --> - `´im_body_decod” -×rg-> -ty³_desütÜ -, - -176 -¬g --> -¡ruù_key -, -chunk_buf -, -chunk_size -); - -177  -b»t -) { - -178  -XPBD_SYSTEM_FAILURE -: - -179  -XPBD_DECODER_LIMIT -: - -180  -XPBD_BROKEN_ENCODING -: - -182  -XPBD_BODY_CONSUMED -: - -184 -¬g --> -decoded_som‘hšg - = 1; - -186  -XPBD_NOT_BODY_IGNORE -: - -191 - } -} - -193  -ssize_t - - -194 - $x”_decode__´im™ive_body -(* -key -, cÚ¡ * -chunk_buf -, -size_t - -chunk_size -,  -have_mÜe -) { - -195  -xdp_¬g_s - * -¬g - = (xdp_¬g_ *) -key -; - -196 -x”_pbd_rv® - -b»t -; - -197 -size_t - -Ëad_w¥_size -; - -199 if( -¬g --> -decoded_som‘hšg -) { - -200 if( - `x”_wh™e¥aû_¥ª -( -chunk_buf -, -chunk_size -) == chunk_size) { - -206  -chunk_size -; - -214 if(! -have_mÜe -) { - -223 -¬g --> -wªt_mÜe - = 1; - -227 -Ëad_w¥_size - = - `x”_wh™e¥aû_¥ª -( -chunk_buf -, -chunk_size -); - -228 -chunk_buf - = (cÚ¡ *)chunk_buà+ -Ëad_w¥_size -; - -229 -chunk_size - -ð -Ëad_w¥_size -; - -231 -b»t - = -¬g --> - `´im_body_decod” -×rg-> -ty³_desütÜ -, - -232 -¬g --> -¡ruù_key -, -chunk_buf -, -chunk_size -); - -233  -b»t -) { - -234  -XPBD_SYSTEM_FAILURE -: - -235  -XPBD_DECODER_LIMIT -: - -236  -XPBD_BROKEN_ENCODING -: - -238  -XPBD_BODY_CONSUMED -: - -240 -¬g --> -decoded_som‘hšg - = 1; - -242  -XPBD_NOT_BODY_IGNORE -: - -243  -Ëad_w¥_size - + -chunk_size -; - -247 - } -} - -250 -a¢_dec_rv®_t - - -251 - $x”_decode_´im™ive -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -252 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -253 -size_t - -¡ruù_size -, cÚ¡ * -Ýt_mÇme -, - -254 cÚ¡ * -buf_±r -, -size_t - -size -, - -255 -x”_´im™ive_body_decod”_f - * -´im_body_decod” -) { - -256 cÚ¡ * -xml_g - = -Ýt_mÇme - ? o±_mÇm: -td -->xml_tag; - -257 -a¢_¡ruù_ùx_t - -s_ùx -; - -258  -xdp_¬g_s - -s_¬g -; - -259 -a¢_dec_rv®_t - -rc -; - -264 if(!* -¥Œ -) { - -265 * -¥Œ - = - `CALLOC -(1, -¡ruù_size -); - -266 if(!* -¥Œ -è -ASN__DECODE_FAILED -; - -269 - `mem£t -(& -s_ùx -, 0, (s_ctx)); - -270 -s_¬g -. -ty³_desütÜ - = -td -; - -271 -s_¬g -. -¡ruù_key - = * -¥Œ -; - -272 -s_¬g -. -´im_body_decod” - =…rim_body_decoder; - -273 -s_¬g -. -decoded_som‘hšg - = 0; - -274 -s_¬g -. -wªt_mÜe - = 0; - -276 -rc - = - `x”_decode_g’”® -( -Ýt_codec_ùx -, & -s_ùx -, & -s_¬g -, - -277 -xml_g -, -buf_±r -, -size -, - -278 -x”_decode__uÃx³ùed_g -, -x”_decode__´im™ive_body -); - -279  -rc -. -code -) { - -280  -RC_OK -: - -281 if(! -s_¬g -. -decoded_som‘hšg -) { - -282  -ch -; - -283 - `ASN_DEBUG -("Primitive body is‚ot„ecognized, " - -290 if( - `´im_body_decod” -( -s_¬g -. -ty³_desütÜ -, - -291 -s_¬g -. -¡ruù_key -, & -ch -, 0) - -292 !ð -XPBD_BODY_CONSUMED -) { - -296 -ASN__DECODE_FAILED -; - -300  -RC_WMORE -: - -305 -rc -. -cÚsumed - = 0; - -307  -RC_FAIL -: - -308 -rc -. -cÚsumed - = 0; - -309 if( -s_¬g -. -wªt_mÜe -) - -310 -rc -. -code - = -RC_WMORE -; - -312 -ASN__DECODE_FAILED -; - -315  -rc -; - -316 - } -} - - @asn_internal.c - -1  - ~ - -3 -ssize_t - - -4 - $a¢__fÜm©_to_ÿÎback -((* -cb -)(cÚ¡ *, -size_t -, * -key -), *key, - -5 cÚ¡ * -fmt -, ...) { - -6  -sü©ch -[64]; - -7 * -buf - = -sü©ch -; - -8 -size_t - -buf_size - = ( -sü©ch -); - -9  -wrÙe -; - -10  -cb_»t -; - -13 -va_li¡ - -¬gs -; - -14 - `va_¡¬t -( -¬gs -, -fmt -); - -16 -wrÙe - = - `v¢´štf -( -buf -, -buf_size -, -fmt -, -¬gs -); - -17 if( -wrÙe - < ( -ssize_t -) -buf_size -) { - -18 if( -wrÙe - < 0) { - -19 if( -buf - !ð -sü©ch -è - `FREEMEM -(buf); - -20 - `va_’d -( -¬gs -); - -26 -buf_size - <<= 1; - -27 if( -buf - =ð -sü©ch -) { - -28 -buf - = - `MALLOC -( -buf_size -); - -29 if(! -buf -è{ - `va_’d -( -¬gs -);  -1; } - -31 * -p - = - `REALLOC -( -buf -, -buf_size -); - -32 if(! -p -) { - -33 - `FREEMEM -( -buf -); - -34 - `va_’d -( -¬gs -); - -37 -buf - = -p -; - -41 -cb_»t - = - `cb -( -buf -, -wrÙe -, -key -); - -42 if( -buf - !ð -sü©ch -è - `FREEMEM -(buf); - -43 if( -cb_»t - < 0) { - -47  -wrÙe -; - -48 - } -} - - @asn_random_fill.c - -6  - ~ - -7  - ~ - -8  - ~ - -11 - $a¢_¿ndom_fžl -(cÚ¡  -a¢_TYPE_desütÜ_s - * -td -, ** -¡ruù_±r -, - -12 -size_t - -Ëngth -) { - -14 if( -td - &&d-> -Ý --> -¿ndom_fžl -) { - -15 -a¢_¿ndom_fžl_»suÉ_t - -»s - = - -16 -td --> -Ý --> - `¿ndom_fžl -Ñd, -¡ruù_±r -, 0, -Ëngth -); - -17  ( -»s -. -code - =ð -ARFILL_OK -) ? 0 : -1; - -21 - } -} - -23  -uštmax_t - - -24 - $a¢__štmax_¿nge -( -štmax_t - -lb -, iÁmax_ˆ -ub -) { - -25 - `as£¹ -( -lb - <ð -ub -); - -26 if(( -ub - < 0è=ð( -lb - < 0)) { - -27  -ub - - -lb -; - -28 } if( -lb - < 0) { - -29  1 + (( -uštmax_t -) -ub - + (uštmax_t)-( -lb - + 1)); - -31 - `as£¹ -(!"Unreachable"); - -34 - } -} - -36 -štmax_t - - -37 - $a¢_¿ndom_b‘w“n -( -štmax_t - -lb -, iÁmax_ˆ -rb -) { - -38 if( -lb - =ð -rb -) { - -39  -lb -; - -41 cÚ¡ -uštmax_t - -štmax_max - = ((~(uintmax_t)0) >> 1); - -42 -uštmax_t - -¿nge - = - `a¢__štmax_¿nge -( -lb -, -rb -); - -43 -uštmax_t - -v®ue - = 0; - -44 -uštmax_t - -gÙ_’ŒÝy - = 0; - -46 - `as£¹ -( -RAND_MAX - > 0xffffff); - -47 - `as£¹ -( -¿nge - < -štmax_max -); - -49 ; -gÙ_’ŒÝy - < -¿nge -;) { - -50 -gÙ_’ŒÝy - = (got_entropy << 24) | 0xffffff; - -51 -v®ue - = (v®u<< 24è| ( - `¿ndom -() % 0xffffff); - -54  -lb - + ( -štmax_t -)( -v®ue - % ( -¿nge - + 1)); - -56 - } -} - - @ber_decoder.c - -5  - ~ - -7 #undeà -ADVANCE - - -8  - #ADVANCE -( -num_by‹s -) do { \ - -9 -size_t - -num - = -num_by‹s -; \ - -10 -±r - = ((cÚ¡ *íŒè+ -num -; \ - -11 -size - -ð -num -; \ - -12 -cÚsumed_my£lf - +ð -num -; \ - -13 } 0) - - ) - -14 #undeà -RETURN - - -15  - #RETURN -( -_code -) do { \ - -16 -a¢_dec_rv®_t - -rv® -; \ - -17 -rv® -. -code - = -_code -; \ - -18 if( -Ýt_ùx -èÝt_ùx-> -¡• - = step; \ - -19 if( -_code - =ð -RC_OK - || -Ýt_ùx -) \ - -20 -rv® -. -cÚsumed - = -cÚsumed_my£lf -; \ - -22 -rv® -. -cÚsumed - = 0; \ - -23  -rv® -; \ - -24 } 0) - - ) - -29 -a¢_dec_rv®_t - - -30 - $b”_decode -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -31 cÚ¡ -a¢_TYPE_desütÜ_t - * -ty³_desütÜ -, ** -¡ruù_±r -, - -32 cÚ¡ * -±r -, -size_t - -size -) { - -33 -a¢_codec_ùx_t - -s_codec_ùx -; - -39 if( -Ýt_codec_ùx -) { - -40 if( -Ýt_codec_ùx --> -max_¡ack_size -) { - -41 -s_codec_ùx - = * -Ýt_codec_ùx -; - -42 -Ýt_codec_ùx - = & -s_codec_ùx -; - -46 - `mem£t -(& -s_codec_ùx -, 0, (s_codec_ctx)); - -47 -s_codec_ùx -. -max_¡ack_size - = -ASN__DEFAULT_STACK_MAX -; - -48 -Ýt_codec_ùx - = & -s_codec_ùx -; - -54  -ty³_desütÜ --> -Ý --> - `b”_decod” -( -Ýt_codec_ùx -,ype_descriptor, - -55 -¡ruù_±r -, - -56 -±r -, -size -, - -59 - } -} - -64 -a¢_dec_rv®_t - - -65 - $b”_check_gs -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -66 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, -a¢_¡ruù_ùx_t - * -Ýt_ùx -, - -67 cÚ¡ * -±r -, -size_t - -size -,  -g_mode -,  -Ï¡_g_fÜm -, - -68 -b”_Žv_Ën_t - * -Ï¡_Ëngth -, * -Ýt_Žv_fÜm -) { - -69 -ssize_t - -cÚsumed_my£lf - = 0; - -70 -ssize_t - -g_Ën -; - -71 -ssize_t - -Ën_Ën -; - -72 -b”_Žv_g_t - -Žv_g -; - -73 -b”_Žv_Ën_t - -Žv_Ën -; - -74 -b”_Žv_Ën_t - -lim™_Ën - = -1; - -75  -ex³ù_00_‹rmš©Üs - = 0; - -76  -Žv_cÚ¡r - = -1; - -77  -¡• - = -Ýt_ùx - ? opt_ctx->step : 0; - -78  -gno -; - -83 if( - `ASN__STACK_OVERFLOW_CHECK -( -Ýt_codec_ùx -)) - -84 - `RETURN -( -RC_FAIL -); - -108 -gno - = -¡• - - -109 + ( -g_mode -==1?-1:0) - -111 - `ASN_DEBUG -("ber_check_tags(%s, size=%ld,m=%d, step=%d,agno=%d)", - -112 -td --> -Çme -, () -size -, -g_mode -, -¡• -, -gno -); - -115 if( -g_mode - =ð0 && -gno - =ð() -td --> -gs_couÁ -) { - -121 -g_Ën - = - `b”_ãtch_g -( -±r -, -size -, & -Žv_g -); - -122  -g_Ën -) { - -123 -1: - `RETURN -( -RC_FAIL -); - -124 0: - `RETURN -( -RC_WMORE -); - -126 -Žv_cÚ¡r - = - `BER_TLV_CONSTRUCTED -( -±r -); - -127 -Ën_Ën - = - `b”_ãtch_Ëngth -( -Žv_cÚ¡r -, - -128 (cÚ¡ *) -±r - + -g_Ën -, -size - -ag_Ën, & -Žv_Ën -); - -129  -Ën_Ën -) { - -130 -1: - `RETURN -( -RC_FAIL -); - -131 0: - `RETURN -( -RC_WMORE -); - -133 - `ASN_DEBUG -("Advancing %ld in ANY case", - -134 ()( -g_Ën - + -Ën_Ën -)); - -135 - `ADVANCE -( -g_Ën - + -Ën_Ën -); - -137 - `as£¹ -( -gno - < () -td --> -gs_couÁ -); - -139 () -gno -;agnØ< () -td --> -gs_couÁ -;agno++, -¡• -++) { - -144 -g_Ën - = - `b”_ãtch_g -( -±r -, -size -, & -Žv_g -); - -145 - `ASN_DEBUG -("Fetchingag from {%p,%ld}: " - -147 -±r -, () -size -, - -148 () -g_Ën -, -¡• -, -gno -, - -149 - `b”_Žv_g_¡ršg -( -Žv_g -)); - -150  -g_Ën -) { - -151 -1: - `RETURN -( -RC_FAIL -); - -152 0: - `RETURN -( -RC_WMORE -); - -155 -Žv_cÚ¡r - = - `BER_TLV_CONSTRUCTED -( -±r -); - -161 if( -g_mode - !ð0 && -¡• - == 0) { - -168 - `as£¹ -( -gno - >= 0); - -169 if( -Žv_g - !ð -td --> -gs -[ -gno -]) { - -173 - `ASN_DEBUG -("Expected: %s, " - -175 - `b”_Žv_g_¡ršg -( -td --> -gs -[ -gno -]), - -176 -gno -, -g_mode - - -178 - `RETURN -( -RC_FAIL -); - -189 if( -gno - < (() -td --> -gs_couÁ - - 1)) { - -190 if( -Žv_cÚ¡r - == 0) { - -191 - `ASN_DEBUG -("tlv_constr = %d,ƒxpfail", - -192 -Žv_cÚ¡r -); - -193 - `RETURN -( -RC_FAIL -); - -196 if( -Ï¡_g_fÜm - !ð -Žv_cÚ¡r - - -197 && -Ï¡_g_fÜm - != -1) { - -198 - `ASN_DEBUG -("last_tag_form %d != %d", - -199 -Ï¡_g_fÜm -, -Žv_cÚ¡r -); - -200 - `RETURN -( -RC_FAIL -); - -207 -Ën_Ën - = - `b”_ãtch_Ëngth -( -Žv_cÚ¡r -, - -208 (cÚ¡ *) -±r - + -g_Ën -, -size - -ag_Ën, & -Žv_Ën -); - -209 - `ASN_DEBUG -("F‘chšg†’ = %ld", () -Ën_Ën -); - -210  -Ën_Ën -) { - -211 -1: - `RETURN -( -RC_FAIL -); - -212 0: - `RETURN -( -RC_WMORE -); - -222 if( -Žv_Ën - == -1) { - -226 if( -lim™_Ën - == -1) { - -227 -ex³ù_00_‹rmš©Üs -++; - -229 - `ASN_DEBUG -("Unexpected indefinite†ength " - -231 - `RETURN -( -RC_FAIL -); - -233 - `ADVANCE -( -g_Ën - + -Ën_Ën -); - -236 if( -ex³ù_00_‹rmš©Üs -) { - -237 - `ASN_DEBUG -("Unexpected definite†ength " - -239 - `RETURN -( -RC_FAIL -); - -247 if( -lim™_Ën - == -1) { - -248 -lim™_Ën - = -Žv_Ën - + -g_Ën - + -Ën_Ën -; - -249 if( -lim™_Ën - < 0) { - -251 - `RETURN -( -RC_FAIL -); - -253 } if( -lim™_Ën - !ð -Žv_Ën - + -g_Ën - + -Ën_Ën -) { - -258 - `ASN_DEBUG -("Outer TLV is %ld‡nd inner is %ld", - -259 () -lim™_Ën -, () -Žv_Ën -); - -260 - `RETURN -( -RC_FAIL -); - -263 - `ADVANCE -( -g_Ën - + -Ën_Ën -); - -265 -lim™_Ën - -ð( -g_Ën - + -Ën_Ën -); - -266 if(( -ssize_t -) -size - > -lim™_Ën -) { - -271 -size - = -lim™_Ën -; - -275 if( -Ýt_Žv_fÜm -) - -276 * -Ýt_Žv_fÜm - = -Žv_cÚ¡r -; - -277 if( -ex³ù_00_‹rmš©Üs -) - -278 * -Ï¡_Ëngth - = - -ex³ù_00_‹rmš©Üs -; - -280 * -Ï¡_Ëngth - = -Žv_Ën -; - -282 - `RETURN -( -RC_OK -); - -283 - } -} - - @ber_tlv_length.c - -5  - ~ - -6  - ~ - -7  - ~ - -9 -ssize_t - - -10 - $b”_ãtch_Ëngth -( -_is_cÚ¡ruùed -, cÚ¡ * -buåŒ -, -size_t - -size -, - -11 -b”_Žv_Ën_t - * -Ën_r -) { - -12 cÚ¡ -ušt8_t - * -buf - = (cÚ¡ ušt8_ˆ*) -buåŒ -; - -13  -où -; - -15 if( -size - == 0) - -18 -où - = *(cÚ¡ -ušt8_t - *) -buf -; - -19 if(( -où - & 0x80) == 0) { - -23 * -Ën_r - = -où -; - -26 -b”_Žv_Ën_t - -Ën -; - -27 -size_t - -sk³d -; - -29 if( -_is_cÚ¡ruùed - && -où - == 0x80) { - -30 * -Ën_r - = -1; - -34 if( -où - == 0xff) { - -39 -où - &= 0x7F; - -40  -Ën - = 0, -buf -++, -sk³d - = 1; - -41 -où - && (++ -sk³d - <ð -size -); -buf -++, oct--) { - -44 if(!( -Ën - >> ((8 * (len)) - (8+1)))) { - -45 -Ën - = (ËÀ<< 8è| * -buf -; - -52 if( -où - == 0) { - -53 if( -Ën - < 0 ||†’ > -RSSIZE_MAX -) { - -58 * -Ën_r - = -Ën -; - -59  -sk³d -; - -65 - } -} - -67 -ssize_t - - -68 - $b”_sk_Ëngth -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -69  -_is_cÚ¡ruùed -, cÚ¡ * -±r -, -size_t - -size -) { - -70 -b”_Žv_Ën_t - -vËn -; - -71 -ssize_t - -Ž -; - -72 -ssize_t - -Î -; - -73 -size_t - -sk -; - -78 if( - `ASN__STACK_OVERFLOW_CHECK -( -Ýt_codec_ùx -)) - -84 -Î - = - `b”_ãtch_Ëngth -( -_is_cÚ¡ruùed -, -±r -, -size -, & -vËn -); - -85 if( -Î - <= 0) †l; - -90 if( -vËn - >= 0) { - -91 -sk - = -Î - + -vËn -; - -92 if( -sk - > -size -) - -94  -sk -; - -100 - `ASN_DEBUG -("Skipping indefinite†ength"); - -101  -sk - = -Î -, -±r - = ((cÚ¡ *íŒè+†l, -size - -=†l;;) { - -102 -b”_Žv_g_t - -g -; - -105 -Ž - = - `b”_ãtch_g -( -±r -, -size -, & -g -); - -106 if( -Ž - <= 0) l; - -108 -Î - = - `b”_sk_Ëngth -( -Ýt_codec_ùx -, - -109 - `BER_TLV_CONSTRUCTED -( -±r -), - -110 ((cÚ¡ *) -±r -è+ -Ž -, -size - -l); - -111 if( -Î - <= 0) †l; - -113 -sk - +ð -Ž - + -Î -; - -120 if(((cÚ¡ -ušt8_t - *) -±r -)[0] == 0 - -121 && ((cÚ¡ -ušt8_t - *) -±r -)[1] == 0) - -122  -sk -; - -124 -±r - = ((cÚ¡ *íŒè+ -Ž - + -Î -; - -125 -size - -ð -Ž - + -Î -; - -129 - } -} - -131 -size_t - - -132 - $d”_Žv_Ëngth_£rŸlize -( -b”_Žv_Ën_t - -Ën -, * -buå -, -size_t - -size -) { - -133 -size_t - -»quœed_size -; - -134 -ušt8_t - * -buf - = (ušt8_ˆ*) -buå -; - -135 -ušt8_t - * -’d -; - -136  -i -; - -138 if( -Ën - <= 127) { - -140 if( -size -è* -buf - = ( -ušt8_t -) -Ën -; - -147  -»quœed_size - = 1, -i - = 8; i < 8 * ()( -Ën -); i += 8) { - -148 if( -Ën - >> -i -) - -149 -»quœed_size -++; - -154 if( -size - <ð -»quœed_size -) - -155  -»quœed_size - + 1; - -157 * -buf -++ = ( -ušt8_t -)(0x80 | -»quœed_size -); - -162 -’d - = -buf - + -»quœed_size -; - -163  -i - -ð8; -buf - < -’d -; i -= 8, buf++) - -164 * -buf - = ( -ušt8_t -)( -Ën - >> -i -); - -166  -»quœed_size - + 1; - -167 - } -} - - @ber_tlv_tag.c - -5  - ~ - -6  - ~ - -7  - ~<”ºo.h -> - -9 -ssize_t - - -10 - $b”_ãtch_g -(cÚ¡ * -±r -, -size_t - -size -, -b”_Žv_g_t - * -g_r -) { - -11 -b”_Žv_g_t - -v® -; - -12 -b”_Žv_g_t - -tþass -; - -13 -size_t - -sk³d -; - -15 if( -size - == 0) - -18 -v® - = *(cÚ¡ -ušt8_t - *) -±r -; - -19 -tþass - = ( -v® - >> 6); - -20 if(( -v® - &= 0x1F) != 0x1F) { - -25 * -g_r - = ( -v® - << 2è| -tþass -; - -33  -v® - = 0, -±r - = ((cÚ¡ *íŒè+ 1, -sk³d - = 2; - -34 -sk³d - <ð -size -; - -35 -±r - = ((cÚ¡ *íŒè+ 1, -sk³d -++) { - -36  -où - = *(cÚ¡ -ušt8_t - *) -±r -; - -37 if( -où - & 0x80) { - -38 -v® - = (v® << 7è| ( -où - & 0x7F); - -43 if( -v® - >> ((8 * (val)) - 9)) { - -51 -v® - = (v® << 7è| -où -; - -52 * -g_r - = ( -v® - << 2è| -tþass -; - -53  -sk³d -; - -58 - } -} - -61 -ssize_t - - -62 - $b”_Žv_g_fwr™e -( -b”_Žv_g_t - -g -, -FILE - * -f -) { - -63  -buf -[("[APPLICATION ]") + 32]; - -64 -ssize_t - -»t -; - -66 -»t - = - `b”_Žv_g_¢´št -( -g -, -buf -, (buf)); - -67 if( -»t - >ð( -ssize_t -)( -buf -) ||„et < 2) { - -68 -”ºo - = -EPERM -; - -72  - `fwr™e -( -buf -, 1, -»t -, -f -); - -73 - } -} - -75 -ssize_t - - -76 - $b”_Žv_g_¢´št -( -b”_Žv_g_t - -g -, * -buf -, -size_t - -size -) { - -77 cÚ¡ * -ty³ - = 0; - -78  -»t -; - -80  -g - & 0x3) { - -81  -ASN_TAG_CLASS_UNIVERSAL -: -ty³ - = "UNIVERSAL "; ; - -82  -ASN_TAG_CLASS_APPLICATION -: -ty³ - = "APPLICATION "; ; - -83  -ASN_TAG_CLASS_CONTEXT -: -ty³ - = ""; ; - -84  -ASN_TAG_CLASS_PRIVATE -: -ty³ - = "PRIVATE "; ; - -87 -»t - = - `¢´štf -( -buf -, -size -, "[%s%u]", -ty³ -, (() -g -) >> 2); - -88 if( -»t - <ð0 && -size -è -buf -[0] = '\0'; - -90  -»t -; - -91 - } -} - -94 - $b”_Žv_g_¡ršg -( -b”_Žv_g_t - -g -) { - -95  -buf -[("[APPLICATION ]") + 32]; - -97 () - `b”_Žv_g_¢´št -( -g -, -buf -, (buf)); - -99  -buf -; - -100 - } -} - -103 -size_t - - -104 - $b”_Žv_g_£rŸlize -( -b”_Žv_g_t - -g -, * -buå -, -size_t - -size -) { - -105  -tþass - = - `BER_TAG_CLASS -( -g -); - -106 -b”_Žv_g_t - -tv® - = - `BER_TAG_VALUE -( -g -); - -107 -ušt8_t - * -buf - = (ušt8_ˆ*) -buå -; - -108 -ušt8_t - * -’d -; - -109 -size_t - -»quœed_size -; - -110 -size_t - -i -; - -112 if( -tv® - <= 30) { - -114 if( -size -è -buf -[0] = ( -tþass - << 6è| -tv® -; - -116 } if( -size -) { - -117 * -buf -++ = ( -tþass - << 6) | 0x1F; - -118 -size ---; - -124  -»quœed_size - = 1, -i - = 7; i < 8 * ( -tv® -); i += 7) { - -125 if( -tv® - >> -i -) - -126 -»quœed_size -++; - -131 if( -size - < -»quœed_size -) - -132  -»quœed_size - + 1; - -137 -’d - = -buf - + -»quœed_size - - 1; - -138  -i - -ð7; -buf - < -’d -; i -= 7, buf++) - -139 * -buf - = 0x80 | (( -tv® - >> -i -) & 0x7F); - -140 * -buf - = ( -tv® - & 0x7F); - -142  -»quœed_size - + 1; - -143 - } -} - - @constr_CHOICE.c - -5  - ~ - -6  - ~ - -7  - ~<³r_ݒty³.h -> - -14  - #LEFT - (( -size -<( -size_t -) -ùx --> -Ëá -)?size:(size_t)ùx->Ëá) - - ) - -27  - #SIZE_VIOLATION - ( -ùx --> -Ëá - >ð0 && ( -size_t -)ùx->Ëá <ð -size -) - - ) - -33 #undeà -ADVANCE - - -34  - #ADVANCE -( -num_by‹s -) do { \ - -35 -size_t - -num - = -num_by‹s -; \ - -36 -±r - = ((cÚ¡ *íŒè+ -num -;\ - -37 -size - -ð -num -; \ - -38 if( -ùx --> -Ëá - >= 0) \ - -39 -ùx --> -Ëá - -ð -num -; \ - -40 -cÚsumed_my£lf - +ð -num -; \ - -41 } 0) - - ) - -46 #undeà -NEXT_PHASE - - -47  - #NEXT_PHASE -( -ùx -) do { \ - -48 -ùx --> -pha£ -++; \ - -49 -ùx --> -¡• - = 0; \ - -50 } 0) - - ) - -55 #undeà -RETURN - - -56  - #RETURN -( -_code -) do { \ - -57 -rv® -. -code - = -_code -; \ - -58 -rv® -. -cÚsumed - = -cÚsumed_my£lf -;\ - -59  -rv® -; \ - -60 } 0) - - ) - -65  -_ãtch_´e£Á_idx -(cÚ¡ * -¡ruù_±r -,  -off -, - -66  -size -); - -67  -_£t_´e£Á_idx -(* -¥Œ -,  -off£t -,  -size -, - -68  -´es -); - -69 cÚ¡ * -_g‘_memb”_±r -(cÚ¡ -a¢_TYPE_desütÜ_t - *, - -70 cÚ¡ * -¥Œ -, -a¢_TYPE_memb”_t - ** -–m -, - -71 * -´e£Á -); - -77 - $_£¬ch4g -(cÚ¡ * -­ -, cÚ¡ * -bp -) { - -78 cÚ¡ -a¢_TYPE_g2memb”_t - * -a - = (cÚ¡‡¢_TYPE_g2memb”_ˆ*) -­ -; - -79 cÚ¡ -a¢_TYPE_g2memb”_t - * -b - = (cÚ¡‡¢_TYPE_g2memb”_ˆ*) -bp -; - -81  -a_þass - = - `BER_TAG_CLASS -( -a --> -–_g -); - -82  -b_þass - = - `BER_TAG_CLASS -( -b --> -–_g -); - -84 if( -a_þass - =ð -b_þass -) { - -85 -b”_Žv_g_t - -a_v®ue - = - `BER_TAG_VALUE -( -a --> -–_g -); - -86 -b”_Žv_g_t - -b_v®ue - = - `BER_TAG_VALUE -( -b --> -–_g -); - -88 if( -a_v®ue - =ð -b_v®ue -) - -90 if( -a_v®ue - < -b_v®ue -) - -94 } if( -a_þass - < -b_þass -) { - -99 - } -} - -104 -a¢_dec_rv®_t - - -105 - $CHOICE_decode_b” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -106 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¡ruù_±r -, - -107 cÚ¡ * -±r -, -size_t - -size -,  -g_mode -) { - -111 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = - -112 (cÚ¡ -a¢_CHOICE_¥ecifics_t - *) -td --> -¥ecifics -; - -113 -a¢_TYPE_memb”_t - * -–em’ts - = -td -->elements; - -118 * -¡ - = * -¡ruù_±r -; - -119 -a¢_¡ruù_ùx_t - * -ùx -; - -121 -b”_Žv_g_t - -Žv_g -; - -122 -ssize_t - -g_Ën -; - -123 -a¢_dec_rv®_t - -rv® -; - -125 -ssize_t - -cÚsumed_my£lf - = 0; - -127 - `ASN_DEBUG -("Decodšg % a CHOICE", -td --> -Çme -); - -132 if( -¡ - == 0) { - -133 -¡ - = * -¡ruù_±r - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -134 if( -¡ - == 0) { - -135 - `RETURN -( -RC_FAIL -); - -142 -ùx - = ( -a¢_¡ruù_ùx_t - *)((*) -¡ - + -¥ecs --> -ùx_off£t -); - -147  -ùx --> -pha£ -) { - -155 if( -g_mode - || -td --> -gs_couÁ -) { - -156 -rv® - = - `b”_check_gs -( -Ýt_codec_ùx -, -td -, -ùx -, -±r -, -size -, - -157 -g_mode -, -1, & -ùx --> -Ëá -, 0); - -158 if( -rv® -. -code - !ð -RC_OK -) { - -159 - `ASN_DEBUG -("%sagging check failed: %d", - -160 -td --> -Çme -, -rv® -. -code -); - -161  -rv® -; - -164 if( -ùx --> -Ëá - >= 0) { - -166 -ùx --> -Ëá - +ð -rv® -. -cÚsumed -; - -168 - `ADVANCE -( -rv® -. -cÚsumed -); - -170 -ùx --> -Ëá - = -1; - -173 - `NEXT_PHASE -( -ùx -); - -175 - `ASN_DEBUG -("Structure consumes %ld bytes, buffer %ld", - -176 () -ùx --> -Ëá -, () -size -); - -183 -g_Ën - = - `b”_ãtch_g -( -±r -, -LEFT -, & -Žv_g -); - -184 - `ASN_DEBUG -("IÀ% CHOICEag†’gth %d", -td --> -Çme -, () -g_Ën -); - -185  -g_Ën -) { - -186 0: if(! -SIZE_VIOLATION -è - `RETURN -( -RC_WMORE -); - -188 -1: - `RETURN -( -RC_FAIL -); - -192 cÚ¡ -a¢_TYPE_g2memb”_t - * -t2m -; - -193 -a¢_TYPE_g2memb”_t - -key -; - -195 -key -. -–_g - = -Žv_g -; - -196 -t2m - = (cÚ¡ -a¢_TYPE_g2memb”_t - *) - `b£¬ch -(& -key -, - -197 -¥ecs --> -g2– -, s³cs-> -g2–_couÁ -, - -198 ( -¥ecs --> -g2– -[0]), -_£¬ch4g -); - -199 if( -t2m -) { - -203 - `NEXT_PHASE -( -ùx -); - -204 -ùx --> -¡• - = -t2m --> -–_no -; - -206 } if( -¥ecs --> -ext_¡¬t - == -1) { - -207 - `ASN_DEBUG -("Unexpectedag %s " - -209 - `b”_Žv_g_¡ršg -( -Žv_g -), -td --> -Çme -); - -210 - `RETURN -( -RC_FAIL -); - -213 -ssize_t - -sk -; - -215 - `ASN_DEBUG -("Skipping unknownag %s", - -216 - `b”_Žv_g_¡ršg -( -Žv_g -)); - -218 -sk - = - `b”_sk_Ëngth -( -Ýt_codec_ùx -, - -219 - `BER_TLV_CONSTRUCTED -( -±r -), - -220 (cÚ¡ *) -±r - + -g_Ën -, - -221 -LEFT - - -g_Ën -); - -223  -sk -) { - -224 0: if(! -SIZE_VIOLATION -è - `RETURN -( -RC_WMORE -); - -226 -1: - `RETURN -( -RC_FAIL -); - -229 - `ADVANCE -( -sk - + -g_Ën -); - -230 - `RETURN -( -RC_OK -); - -240 -a¢_TYPE_memb”_t - * -–m -; - -241 * -memb_±r -; - -242 ** -memb_±r2 -; - -244 -–m - = & -–em’ts -[ -ùx --> -¡• -]; - -251 if( -–m --> -æags - & -ATF_POINTER -) { - -253 -memb_±r2 - = (**)((*) -¡ - + -–m --> -memb_off£t -); - -259 -memb_±r - = (*) -¡ - + -–m --> -memb_off£t -; - -260 -memb_±r2 - = & -memb_±r -; - -263 - `_£t_´e£Á_idx -( -¡ -, -¥ecs --> -´es_off£t -, - -264 -¥ecs --> -´es_size -, -ùx --> -¡• - + 1); - -268 -rv® - = -–m --> -ty³ --> -Ý --> - `b”_decod” -( -Ýt_codec_ùx -,ƒlm->type, - -269 -memb_±r2 -, -±r -, -LEFT -, -–m --> -g_mode -); - -270  -rv® -. -code -) { - -271  -RC_OK -: - -273  -RC_WMORE -: - -274 if(! -SIZE_VIOLATION -) { - -275 - `ADVANCE -( -rv® -. -cÚsumed -); - -276 - `RETURN -( -RC_WMORE -); - -278 - `RETURN -( -RC_FAIL -); - -279  -RC_FAIL -: - -280 - `RETURN -( -rv® -. -code -); - -283 - `ADVANCE -( -rv® -. -cÚsumed -); - -286 - `NEXT_PHASE -( -ùx -); - -290 - `ASN_DEBUG -("CHOICE %s Leftover: %ld, size = %ld,m=%d,c=%d", - -291 -td --> -Çme -, () -ùx --> -Ëá -, () -size -, - -292 -g_mode -, -td --> -gs_couÁ -); - -294 if( -ùx --> -Ëá - > 0) { - -299 - `RETURN -( -RC_FAIL -); - -302 if( -ùx --> -Ëá - == -1 - -303 && !( -g_mode - || -td --> -gs_couÁ -)) { - -310 - `NEXT_PHASE -( -ùx -); - -317  -ùx --> -Ëá - < 0) { - -318 -ssize_t - -Ž -; - -320 -Ž - = - `b”_ãtch_g -( -±r -, -LEFT -, & -Žv_g -); - -321  -Ž -) { - -322 0: if(! -SIZE_VIOLATION -è - `RETURN -( -RC_WMORE -); - -324 -1: - `RETURN -( -RC_FAIL -); - -330 if(((cÚ¡ -ušt8_t - *) -±r -)[0] == 0) { - -331 if( -LEFT - < 2) { - -332 if( -SIZE_VIOLATION -) - -333 - `RETURN -( -RC_FAIL -); - -335 - `RETURN -( -RC_WMORE -); - -336 } if(((cÚ¡ -ušt8_t - *) -±r -)[1] == 0) { - -340 - `ADVANCE -(2); - -341 -ùx --> -Ëá -++; - -345 - `ASN_DEBUG -("Unexpected continuation in %s", - -346 -td --> -Çme -); - -347 - `RETURN -( -RC_FAIL -); - -353 - `NEXT_PHASE -( -ùx -); - -359 - `RETURN -( -RC_OK -); - -360 - } -} - -362 -a¢_’c_rv®_t - - -363 - $CHOICE_’code_d” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -364  -g_mode -, -b”_Žv_g_t - -g -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -365 * -­p_key -) { - -366 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_CHOICE_¥ecifics_ˆ*) -td --> -¥ecifics -; - -367 -a¢_TYPE_memb”_t - * -–m -; - -368 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -369 cÚ¡ * -memb_±r -; - -370 -size_t - -compu‹d_size - = 0; - -371  -´e£Á -; - -373 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -375 - `ASN_DEBUG -("%s %s‡s CHOICE", - -376 -cb -?"Encodšg":"E¡im©šg", -td --> -Çme -); - -378 -´e£Á - = - `_ãtch_´e£Á_idx -( -¥Œ -, - -379 -¥ecs --> -´es_off£t -, s³cs-> -´es_size -); - -385 if( -´e£Á - =ð0 ||…»£Á > -td --> -–em’ts_couÁ -) { - -386 if( -´e£Á - =ð0 && -td --> -–em’ts_couÁ - == 0) { - -388 -”v® -. -’coded - = 0; - -389 - `ASN__ENCODED_OK -( -”v® -); - -391 -ASN__ENCODE_FAILED -; - -397 -–m - = & -td --> -–em’ts -[ -´e£Á --1]; - -398 if( -–m --> -æags - & -ATF_POINTER -) { - -399 -memb_±r - = - -400 *(cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -401 if( -memb_±r - == 0) { - -402 if( -–m --> -ÝtiÚ® -) { - -403 -”v® -. -’coded - = 0; - -404 - `ASN__ENCODED_OK -( -”v® -); - -407 -ASN__ENCODE_FAILED -; - -410 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -418 if( -g_mode - =ð1 || -td --> -gs_couÁ -) { - -422 -ssize_t - -»t -; - -425 -”v® - = -–m --> -ty³ --> -Ý --> - `d”_’cod” -Ólm->ty³, -memb_±r -, - -426 -–m --> -g_mode -,ƒlm-> -g -, 0, 0); - -427 if( -”v® -. -’coded - == -1) - -428  -”v® -; - -431 -»t - = - `d”_wr™e_gs -( -td -, -”v® -. -’coded -, -g_mode -, 1, -g -, - -432 -cb -, -­p_key -); - -433 if( -»t - == -1) - -434 -ASN__ENCODE_FAILED -; - -435 -compu‹d_size - +ð -»t -; - -441 -”v® - = -–m --> -ty³ --> -Ý --> - `d”_’cod” -Ólm->ty³, -memb_±r -, - -442 -–m --> -g_mode -,ƒlm-> -g -, -cb -, -­p_key -); - -443 if( -”v® -. -’coded - == -1) - -444  -”v® -; - -446 - `ASN_DEBUG -("Encoded CHOICE member in %ld bytes (+%ld)", - -447 () -”v® -. -’coded -, () -compu‹d_size -); - -449 -”v® -. -’coded - +ð -compu‹d_size -; - -451  -”v® -; - -452 - } -} - -454 -b”_Žv_g_t - - -455 - $CHOICE_outmo¡_g -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -±r -,  -g_mode -, -b”_Žv_g_t - -g -) { - -456 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_CHOICE_¥ecifics_ˆ*) -td --> -¥ecifics -; - -457  -´e£Á -; - -459 - `as£¹ -( -g_mode - == 0); ()tag_mode; - -460 - `as£¹ -( -g - == 0); ()tag; - -465 -´e£Á - = - `_ãtch_´e£Á_idx -( -±r -, -¥ecs --> -´es_off£t -, s³cs-> -´es_size -); - -467 if( -´e£Á - > 0 &&…»£Á <ð -td --> -–em’ts_couÁ -) { - -468 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -´e£Á --1]; - -469 cÚ¡ * -memb_±r -; - -471 if( -–m --> -æags - & -ATF_POINTER -) { - -472 -memb_±r - = *(const * const *) - -473 ((cÚ¡ *) -±r - + -–m --> -memb_off£t -); - -475 -memb_±r - = (const *) - -476 ((cÚ¡ *) -±r - + -–m --> -memb_off£t -); - -479  - `a¢_TYPE_outmo¡_g -( -–m --> -ty³ -, -memb_±r -, - -480 -–m --> -g_mode -,ƒlm-> -g -); - -482  ( -b”_Žv_g_t -)-1; - -484 - } -} - -487 - $CHOICE_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -488 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -489 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = - -490 (cÚ¡ -a¢_CHOICE_¥ecifics_t - *) -td --> -¥ecifics -; - -491  -´e£Á -; - -493 if(! -¥Œ -) { - -494 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -496 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -503 -´e£Á - = - `_ãtch_´e£Á_idx -( -¥Œ -, -¥ecs --> -´es_off£t -,¥ecs-> -´es_size -); - -504 if( -´e£Á - > 0 &&…»£Á <ð -td --> -–em’ts_couÁ -) { - -505 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -´e£Á --1]; - -506 cÚ¡ * -memb_±r -; - -508 if( -–m --> -æags - & -ATF_POINTER -) { - -509 -memb_±r - = *(cÚ¡ * cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -510 if(! -memb_±r -) { - -511 if( -–m --> -ÝtiÚ® -) - -513 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -515 -td --> -Çme -, -–m -->Çme, -__FILE__ -, -__LINE__ -); - -519 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -522 if( -–m --> -’codšg_cÚ¡¿šts -. -g’”®_cÚ¡¿šts -) { - -523  -–m --> -’codšg_cÚ¡¿šts -. - `g’”®_cÚ¡¿šts -Ólm-> -ty³ -, -memb_±r -, - -524 -ùçžcb -, -­p_key -); - -526  -–m --> -ty³ --> -’codšg_cÚ¡¿šts -. - `g’”®_cÚ¡¿šts -(elm->type, - -527 -memb_±r -, -ùçžcb -, -­p_key -); - -530 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -532 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -535 - } -} - -537 #undeà -XER_ADVANCE - - -538  - #XER_ADVANCE -( -num_by‹s -) do { \ - -539 -size_t - -num - = -num_by‹s -; \ - -540 -buf_±r - = (cÚ¡ *)(((cÚ¡ *)buf_±rè+ -num -); \ - -541 -size - -ð -num -; \ - -542 -cÚsumed_my£lf - +ð -num -; \ - -543 } 0) - - ) - -548 -a¢_dec_rv®_t - - -549 - $CHOICE_decode_x” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -550 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¡ruù_±r -, - -551 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, -size_t - -size -) { - -555 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_CHOICE_¥ecifics_ˆ*) -td --> -¥ecifics -; - -556 cÚ¡ * -xml_g - = -Ýt_mÇme - ? o±_mÇm: -td -->xml_tag; - -561 * -¡ - = * -¡ruù_±r -; - -562 -a¢_¡ruù_ùx_t - * -ùx -; - -564 -a¢_dec_rv®_t - -rv® -; - -565 -ssize_t - -cÚsumed_my£lf - = 0; - -566 -size_t - -edx -; - -571 if( -¡ - == 0) { - -572 -¡ - = * -¡ruù_±r - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -573 if( -¡ - =ð0è - `RETURN -( -RC_FAIL -); - -579 -ùx - = ( -a¢_¡ruù_ùx_t - *)((*) -¡ - + -¥ecs --> -ùx_off£t -); - -580 if( -ùx --> -pha£ - =ð0 && !* -xml_g -) - -581 -ùx --> -pha£ - = 1; - -592  -edx - = -ùx --> -¡• -; ctx-> -pha£ - <= 4;) { - -593 -px”_chunk_ty³_e - -ch_ty³ -; - -594 -ssize_t - -ch_size -; - -595 -x”_check_g_e - -tcv -; - -596 -a¢_TYPE_memb”_t - * -–m -; - -601 if( -ùx --> -pha£ - == 2) { - -602 -a¢_dec_rv®_t - -tm´v® -; - -603 * -memb_±r -; - -604 ** -memb_±r2 -; - -605  -Þd_´e£Á -; - -607 -–m - = & -td --> -–em’ts -[ -edx -]; - -609 if( -–m --> -æags - & -ATF_POINTER -) { - -611 -memb_±r2 - = (**)((*) -¡ - - -612 + -–m --> -memb_off£t -); - -614 -memb_±r - = (*) -¡ - + -–m --> -memb_off£t -; - -615 -memb_±r2 - = & -memb_±r -; - -619 -tm´v® - = -–m --> -ty³ --> -Ý --> - `x”_decod” -( -Ýt_codec_ùx -, - -620 -–m --> -ty³ -, -memb_±r2 -,ƒlm-> -Çme -, - -621 -buf_±r -, -size -); - -622 - `XER_ADVANCE -( -tm´v® -. -cÚsumed -); - -623 - `ASN_DEBUG -("XER/CHOICE: itdf: [%s] code=%d", - -624 -–m --> -ty³ --> -Çme -, -tm´v® -. -code -); - -625 -Þd_´e£Á - = - `_ãtch_´e£Á_idx -( -¡ -, - -626 -¥ecs --> -´es_off£t -, s³cs-> -´es_size -); - -627 - `as£¹ -( -Þd_´e£Á - =ð0 || old_´e£Á =ð -edx - + 1); - -629 - `_£t_´e£Á_idx -( -¡ -, - -630 -¥ecs --> -´es_off£t -, s³cs-> -´es_size -, -edx - + 1); - -631 if( -tm´v® -. -code - !ð -RC_OK -) - -632 - `RETURN -( -tm´v® -. -code -); - -633 -ùx --> -pha£ - = 3; - -638 if( -ùx --> -pha£ - =ð3 && !* -xml_g -) { - -639 -ùx --> -pha£ - = 5; - -640 - `RETURN -( -RC_OK -); - -646 -ch_size - = - `x”_Ãxt_tok’ -(& -ùx --> -cڋxt -, -buf_±r -, -size -, & -ch_ty³ -); - -647 if( -ch_size - == -1) { - -648 - `RETURN -( -RC_FAIL -); - -650  -ch_ty³ -) { - -651  -PXER_WMORE -: - -652 - `RETURN -( -RC_WMORE -); - -653  -PXER_COMMENT -: - -654  -PXER_TEXT -: - -655 - `XER_ADVANCE -( -ch_size -); - -657  -PXER_TAG -: - -662 -tcv - = - `x”_check_g -( -buf_±r -, -ch_size -, -xml_g -); - -663 - `ASN_DEBUG -("XER/CHOICE checked [%c%c%c%c] vs [%s],cv=%d", - -664 -ch_size ->0?((cÚ¡ -ušt8_t - *) -buf_±r -)[0]:'?', - -665 -ch_size ->1?((cÚ¡ -ušt8_t - *) -buf_±r -)[1]:'?', - -666 -ch_size ->2?((cÚ¡ -ušt8_t - *) -buf_±r -)[2]:'?', - -667 -ch_size ->3?((cÚ¡ -ušt8_t - *) -buf_±r -)[3]:'?', - -668 -xml_g -, -tcv -); - -671 if( -ùx --> -pha£ - == 4) { - -672 - `ASN_DEBUG -("skip_unknown(%d, %ld)", - -673 -tcv -, () -ùx --> -Ëá -); - -674  - `x”_sk_unknown -( -tcv -, & -ùx --> -Ëá -)) { - -676 -ùx --> -pha£ - = 5; - -677 - `RETURN -( -RC_FAIL -); - -679 -ùx --> -pha£ - = 3; - -682 - `XER_ADVANCE -( -ch_size -); - -685 -ùx --> -pha£ - = 3; - -690  -tcv -) { - -691  -XCT_BOTH -: - -693  -XCT_CLOSING -: - -694 if( -ùx --> -pha£ - != 3) - -696 - `XER_ADVANCE -( -ch_size -); - -697 -ùx --> -pha£ - = 5; - -698 - `RETURN -( -RC_OK -); - -699  -XCT_OPENING -: - -700 if( -ùx --> -pha£ - == 0) { - -701 - `XER_ADVANCE -( -ch_size -); - -702 -ùx --> -pha£ - = 1; - -706  -XCT_UNKNOWN_OP -: - -707  -XCT_UNKNOWN_BO -: - -709 if( -ùx --> -pha£ - != 1) - -715  -edx - = 0;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -716 -–m - = & -td --> -–em’ts -[ -edx -]; - -717 -tcv - = - `x”_check_g -( -buf_±r -, -ch_size -, -–m --> -Çme -); - -718  -tcv -) { - -719  -XCT_BOTH -: - -720  -XCT_OPENING -: - -724 -ùx --> -¡• - = -edx -; - -725 -ùx --> -pha£ - = 2; - -727  -XCT_UNKNOWN_OP -: - -728  -XCT_UNKNOWN_BO -: - -731 -edx - = -td --> -–em’ts_couÁ -; - -736 if( -edx - !ð -td --> -–em’ts_couÁ -) - -740 if( -¥ecs --> -ext_¡¬t - != -1) { - -741 - `ASN_DEBUG -("Got‡nticipatedƒxtension"); - -747 if( -tcv - & -XCT_CLOSING -) { - -749 -ùx --> -pha£ - = 3; - -751 -ùx --> -Ëá - = 1; - -752 -ùx --> -pha£ - = 4; - -754 - `XER_ADVANCE -( -ch_size -); - -763 - `ASN_DEBUG -("Unexpected XMLag [%c%c%c%c] in CHOICE [%s]" - -765 -ch_size ->0?((cÚ¡ -ušt8_t - *) -buf_±r -)[0]:'?', - -766 -ch_size ->1?((cÚ¡ -ušt8_t - *) -buf_±r -)[1]:'?', - -767 -ch_size ->2?((cÚ¡ -ušt8_t - *) -buf_±r -)[2]:'?', - -768 -ch_size ->3?((cÚ¡ -ušt8_t - *) -buf_±r -)[3]:'?', - -769 -td --> -Çme -, -ùx --> -pha£ -, -xml_g -); - -773 -ùx --> -pha£ - = 5; - -774 - `RETURN -( -RC_FAIL -); - -775 - } -} - -778 -a¢_’c_rv®_t - - -779 - $CHOICE_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -780 -x”_’cod”_æags_e - -æags -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -781 * -­p_key -) { - -782 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = - -783 (cÚ¡ -a¢_CHOICE_¥ecifics_t - *) -td --> -¥ecifics -; - -784 -a¢_’c_rv®_t - -” - = {0,0,0}; - -785  -´e£Á - = 0; - -787 if(! -¥Œ -) - -788 -ASN__ENCODE_FAILED -; - -793 -´e£Á - = - `_ãtch_´e£Á_idx -( -¥Œ -, -¥ecs --> -´es_off£t -,¥ecs-> -´es_size -); - -795 if( -´e£Á - =ð0 ||…»£Á > -td --> -–em’ts_couÁ -) { - -796 -ASN__ENCODE_FAILED -; - -798 -a¢_’c_rv®_t - -tm³r - = {0,0,0}; - -799 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -´e£Á --1]; - -800 cÚ¡ * -memb_±r - = -NULL -; - -801 cÚ¡ * -mÇme - = -–m --> -Çme -; - -802  -mËn - = - `¡¾’ -( -mÇme -); - -804 if( -–m --> -æags - & -ATF_POINTER -) { - -805 -memb_±r - = - -806 *(cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -807 if(! -memb_±r -è -ASN__ENCODE_FAILED -; - -809 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -812 -” -. -’coded - = 0; - -814 if(!( -æags - & -XER_F_CANONICAL -)è - `ASN__TEXT_INDENT -(1, -žev– -); - -815 - `ASN__CALLBACK3 -("<", 1, -mÇme -, -mËn -, ">", 1); - -817 -tm³r - = -–m --> -ty³ --> -Ý --> - `x”_’cod” -Ólm->ty³, -memb_±r -, - -818 -žev– - + 1, -æags -, -cb -, -­p_key -); - -819 if( -tm³r -. -’coded - == -1) mper; - -820 -” -. -’coded - +ð -tm³r -.encoded; - -822 - `ASN__CALLBACK3 -("", 1); - -825 if(!( -æags - & -XER_F_CANONICAL -)è - `ASN__TEXT_INDENT -(1, -žev– - - 1); - -827 - `ASN__ENCODED_OK -( -” -); - -828 -cb_çžed -: - -829 -ASN__ENCODE_FAILED -; - -830 - } -} - -832 -a¢_dec_rv®_t - - -833 - $CHOICE_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -834 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -835 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -836 -a¢_³r_d©a_t - * -pd -) { - -837 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = - -838 (cÚ¡ -a¢_CHOICE_¥ecifics_t - *) -td --> -¥ecifics -; - -839 -a¢_dec_rv®_t - -rv -; - -840 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -841 -a¢_TYPE_memb”_t - * -–m -; - -842 * -memb_±r -; - -843 ** -memb_±r2 -; - -844 * -¡ - = * -¥Œ -; - -845  -v®ue -; - -847 if( - `ASN__STACK_OVERFLOW_CHECK -( -Ýt_codec_ùx -)) - -848 -ASN__DECODE_FAILED -; - -853 if(! -¡ -) { - -854 -¡ - = * -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -855 if(! -¡ -è -ASN__DECODE_FAILED -; - -858 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -v®ue -; - -859 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -è -ù - = &td->’codšg_cÚ¡¿šts.³r_cÚ¡¿šts-> -v®ue -; - -860 -ù - = 0; - -862 if( -ù - && ct-> -æags - & -APC_EXTENSIBLE -) { - -863 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -864 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -865 if( -v®ue -è -ù - = 0; - -868 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -869 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, -ù --> -¿nge_b™s -); - -870 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -871 - `ASN_DEBUG -("CHOICE %s got index %d in„ange %d", - -872 -td --> -Çme -, -v®ue -, -ù --> -¿nge_b™s -); - -873 if( -v®ue - > -ù --> -uµ”_bound -) - -874 -ASN__DECODE_FAILED -; - -876 if( -¥ecs --> -ext_¡¬t - == -1) - -877 -ASN__DECODE_FAILED -; - -878 -v®ue - = - `u³r_g‘_n¢nwn -( -pd -); - -879 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -880 -v®ue - +ð -¥ecs --> -ext_¡¬t -; - -881 if(() -v®ue - >ð -td --> -–em’ts_couÁ -) - -882 -ASN__DECODE_FAILED -; - -886 if( -¥ecs --> -äom_ÿnÚiÿl_Üd” -) { - -887 - `ASN_DEBUG -("CHOICE…»£nû from wœ%d", -v®ue -); - -888 -v®ue - = -¥ecs --> -äom_ÿnÚiÿl_Üd” -[value]; - -889 - `ASN_DEBUG -("CHOICE…»£nû indexƒfãùiv%d", -v®ue -); - -893 - `_£t_´e£Á_idx -( -¡ -, -¥ecs --> -´es_off£t -, s³cs-> -´es_size -, -v®ue - + 1); - -895 -–m - = & -td --> -–em’ts -[ -v®ue -]; - -896 if( -–m --> -æags - & -ATF_POINTER -) { - -898 -memb_±r2 - = (**)((*) -¡ - + -–m --> -memb_off£t -); - -900 -memb_±r - = (*) -¡ - + -–m --> -memb_off£t -; - -901 -memb_±r2 - = & -memb_±r -; - -903 - `ASN_DEBUG -("Discov”ed CHOICE % ’code %s", -td --> -Çme -, -–m -->name); - -905 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -906 -rv - = -–m --> -ty³ --> -Ý --> - `u³r_decod” -( -Ýt_codec_ùx -,ƒlm->type, - -907 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, -memb_±r2 -, -pd -); - -909 -rv - = - `u³r_ݒ_ty³_g‘ -( -Ýt_codec_ùx -, -–m --> -ty³ -, - -910 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, -memb_±r2 -, -pd -); - -913 if( -rv -. -code - !ð -RC_OK -) - -914 - `ASN_DEBUG -("Failedo decode %s in %s (CHOICE) %d", - -915 -–m --> -Çme -, -td -->Çme, -rv -. -code -); - -916  -rv -; - -917 - } -} - -919 -a¢_’c_rv®_t - - -920 - $CHOICE_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -921 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -922 -a¢_³r_ou_t - * -po -) { - -923 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_CHOICE_¥ecifics_ˆ*) -td --> -¥ecifics -; - -924 -a¢_TYPE_memb”_t - * -–m -; - -925 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -926 cÚ¡ * -memb_±r -; - -927  -´e£Á -; - -928  -´e£Á_’c -; - -930 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -932 - `ASN_DEBUG -("Encodšg % a CHOICE", -td --> -Çme -); - -934 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -v®ue -; - -935 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -936 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -v®ue -; - -937 -ù - = 0; - -939 -´e£Á - = - `_ãtch_´e£Á_idx -( -¥Œ -, -¥ecs --> -´es_off£t -, s³cs-> -´es_size -); - -945 if( -´e£Á - =ð0 ||…»£Á > -td --> -–em’ts_couÁ -) - -946 -ASN__ENCODE_FAILED -; - -948 -´e£Á ---; - -950 - `ASN_DEBUG -("Encodšg % CHOICEƒËm’ˆ%d", -td --> -Çme -, -´e£Á -); - -953 if( -¥ecs --> -to_ÿnÚiÿl_Üd” -) - -954 -´e£Á_’c - = -¥ecs --> -to_ÿnÚiÿl_Üd” -[ -´e£Á -]; - -956 -´e£Á_’c - = -´e£Á -; - -958 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -959 if( -´e£Á_’c - < -ù --> -low”_bound - - -960 || -´e£Á_’c - > -ù --> -uµ”_bound -) { - -961 if( -ù --> -æags - & -APC_EXTENSIBLE -) { - -962 - `ASN_DEBUG -( - -964 -´e£Á -, -´e£Á_’c -, -ù --> -low”_bound -, ct-> -uµ”_bound -); - -965 if( - `³r_put_ãw_b™s -( -po -, 1, 1)) - -966 -ASN__ENCODE_FAILED -; - -968 -ASN__ENCODE_FAILED -; - -970 -ù - = 0; - -973 if( -ù - && ct-> -æags - & -APC_EXTENSIBLE -) { - -974 - `ASN_DEBUG -("CHOICE member %d (enc %d) is‚ot‡nƒxtension (%ld..%ld)", - -975 -´e£Á -, -´e£Á_’c -, -ù --> -low”_bound -, ct-> -uµ”_bound -); - -976 if( - `³r_put_ãw_b™s -( -po -, 0, 1)) - -977 -ASN__ENCODE_FAILED -; - -981 -–m - = & -td --> -–em’ts -[ -´e£Á -]; - -982 - `ASN_DEBUG -("CHOICE memb” \"%s\" %d (a %d)", -–m --> -Çme -, -´e£Á -, - -983 -´e£Á_’c -); - -984 if( -–m --> -æags - & -ATF_POINTER -) { - -986 -memb_±r - = - -987 *(cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -988 if(! -memb_±r -è -ASN__ENCODE_FAILED -; - -990 -memb_±r - = (cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -; - -993 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -994 if( - `³r_put_ãw_b™s -( -po -, -´e£Á_’c -, -ù --> -¿nge_b™s -)) - -995 -ASN__ENCODE_FAILED -; - -997  -–m --> -ty³ --> -Ý --> - `u³r_’cod” -( - -998 -–m --> -ty³ -,ƒlm-> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, -memb_±r -, -po -); - -1000 -a¢_’c_rv®_t - -rv® - = {0,0,0}; - -1001 if( -¥ecs --> -ext_¡¬t - =ð-1è -ASN__ENCODE_FAILED -; - -1002 if( - `u³r_put_n¢nwn -( -po -, -´e£Á_’c - - -¥ecs --> -ext_¡¬t -)) - -1003 -ASN__ENCODE_FAILED -; - -1004 if( - `u³r_ݒ_ty³_put -( -–m --> -ty³ -, - -1005 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, - -1006 -memb_±r -, -po -)) - -1007 -ASN__ENCODE_FAILED -; - -1008 -rv® -. -’coded - = 0; - -1009 - `ASN__ENCODED_OK -( -rv® -); - -1011 - } -} - -1013 -a¢_dec_rv®_t - - -1014 - $CHOICE_decode_­” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -1015 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1016 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -1017 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_CHOICE_¥ecifics_ˆ*) -td --> -¥ecifics -; - -1018 -a¢_dec_rv®_t - -rv -; - -1019 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -1020 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ext_ù - = -NULL -; - -1021 -a¢_TYPE_memb”_t - * -–m -; - -1022 * -memb_±r -; - -1023 ** -memb_±r2 -; - -1024 * -¡ - = * -¥Œ -; - -1025  -v®ue -; - -1027 if( - `ASN__STACK_OVERFLOW_CHECK -( -Ýt_codec_ùx -)) - -1028 -ASN__DECODE_FAILED -; - -1033 if(! -¡ -) { - -1034 -¡ - = * -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -1035 if(! -¡ -è -ASN__DECODE_FAILED -; - -1038 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -v®ue -; - -1039 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -1040 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -v®ue -; - -1041 -ù - = 0; - -1043 if( -ù - && ct-> -æags - & -APC_EXTENSIBLE -) { - -1044 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -1045 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -1046 if( -v®ue -) { - -1047 -ext_ù - = -ù -; - -1048 -ù - = 0; - -1053 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -1054 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, -ù --> -¿nge_b™s -); - -1055 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -1056 - `ASN_DEBUG -("CHOICE %s got index %d in„ange %d", - -1057 -td --> -Çme -, -v®ue -, -ù --> -¿nge_b™s -); - -1058 if( -v®ue - > -ù --> -uµ”_bound -) - -1059 -ASN__DECODE_FAILED -; - -1061 if( -¥ecs --> -ext_¡¬t - == -1) - -1062 -ASN__DECODE_FAILED -; - -1063 -v®ue - = - `­”_g‘_n¢nwn -( -pd -, -ext_ù --> -¿nge_b™s -); - -1064 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -1065 -v®ue - +ð -¥ecs --> -ext_¡¬t -; - -1066 if(() -v®ue - >ð -td --> -–em’ts_couÁ -) - -1067 -ASN__DECODE_FAILED -; - -1071 if( -¥ecs --> -äom_ÿnÚiÿl_Üd” -) - -1072 -v®ue - = -¥ecs --> -äom_ÿnÚiÿl_Üd” -[value]; - -1075 - `_£t_´e£Á_idx -( -¡ -, -¥ecs --> -´es_off£t -, s³cs-> -´es_size -, -v®ue - + 1); - -1077 -–m - = & -td --> -–em’ts -[ -v®ue -]; - -1078 if( -–m --> -æags - & -ATF_POINTER -) { - -1080 -memb_±r2 - = (**)((*) -¡ - + -–m --> -memb_off£t -); - -1082 -memb_±r - = (*) -¡ - + -–m --> -memb_off£t -; - -1083 -memb_±r2 - = & -memb_±r -; - -1085 - `ASN_DEBUG -("Discov”ed CHOICE % ’code %s", -td --> -Çme -, -–m -->name); - -1087 if( -ù - && ct-> -¿nge_b™s - >= 0) { - -1088 -rv - = -–m --> -ty³ --> -Ý --> - `­”_decod” -( -Ýt_codec_ùx -,ƒlm->type, - -1089 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, -memb_±r2 -, -pd -); - -1091 -rv - = - `­”_ݒ_ty³_g‘ -( -Ýt_codec_ùx -, -–m --> -ty³ -, - -1092 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, -memb_±r2 -, -pd -); - -1095 if( -rv -. -code - !ð -RC_OK -) - -1096 - `ASN_DEBUG -("Failedo decode %s in %s (CHOICE) %d", - -1097 -–m --> -Çme -, -td -->Çme, -rv -. -code -); - -1098  -rv -; - -1099 - } -} - -1101 -a¢_’c_rv®_t - - -1102 - $CHOICE_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1103 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -1104 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -1105 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_CHOICE_¥ecifics_ˆ*) -td --> -¥ecifics -; - -1106 cÚ¡ -a¢_TYPE_memb”_t - * -–m -; - -1107 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù - = -NULL -; - -1108 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ext_ù - = -NULL -; - -1109 cÚ¡ * -memb_±r -; - -1110  -´e£Á -; - -1111  -´e£Á_’c -; - -1113 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -1115 - `ASN_DEBUG -("Encodšg % a CHOICE usšg ALIGNED PER", -td --> -Çme -); - -1117 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -v®ue -; - -1118 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -1119 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -v®ue -; - -1120 -ù - = -NULL -; - -1122 -´e£Á - = - `_ãtch_´e£Á_idx -( -¥Œ -, - -1123 -¥ecs --> -´es_off£t -, s³cs-> -´es_size -); - -1129 if( -´e£Á - <ð0 || (í»£Á > -td --> -–em’ts_couÁ -) - -1130 -ASN__ENCODE_FAILED -; - -1132 -´e£Á ---; - -1135 if( -¥ecs --> -to_ÿnÚiÿl_Üd” -) - -1136 -´e£Á_’c - = -¥ecs --> -to_ÿnÚiÿl_Üd” -[ -´e£Á -]; - -1138 -´e£Á_’c - = -´e£Á -; - -1140 - `ASN_DEBUG -("Encodšg % CHOICEƒËm’ˆ%d", -td --> -Çme -, -´e£Á -); - -1142 if( -ù - && (ù-> -¿nge_b™s - >= 0)) { - -1144 if( -´e£Á - < -ù --> -low”_bound - ||…»£Á > ct-> -uµ”_bound -) { - -1145 if( -ù --> -æags - & -APC_EXTENSIBLE -) { - -1146 - `ASN_DEBUG -("CHOICE member %d (enc %d) is‡nƒxtension (%ld..%ld)", - -1147 -´e£Á -, -´e£Á_’c -, -ù --> -low”_bound -, ct-> -uµ”_bound -); - -1149 if( - `³r_put_ãw_b™s -( -po -, 1, 1)) { - -1150 -ASN__ENCODE_FAILED -; - -1153 -ASN__ENCODE_FAILED -; - -1156 -ext_ù - = -ù -; - -1157 -ù - = -NULL -; - -1161 if( -ù - && (ù-> -æags - & -APC_EXTENSIBLE -)) { - -1162 - `ASN_DEBUG -("CHOICE member %d (enc %d) is‚ot‡nƒxtension (%ld..%ld)", - -1163 -´e£Á -,…»£Á, -ù --> -low”_bound -, ct-> -uµ”_bound -); - -1165 if( - `³r_put_ãw_b™s -( -po -, 0, 1)) { - -1166 -ASN__ENCODE_FAILED -; - -1170 -–m - = & -td --> -–em’ts -[ -´e£Á -]; - -1171 if( -–m --> -æags - & -ATF_POINTER -) { - -1173 -memb_±r - = *(cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1174 if(! -memb_±r -è -ASN__ENCODE_FAILED -; - -1176 -memb_±r - = (cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -; - -1179 if( -ù - && (ù-> -¿nge_b™s - >= 0)) { - -1182 if( - `³r_put_ãw_b™s -( -po -, -´e£Á_’c -, -ù --> -¿nge_b™s -)) - -1183 -ASN__ENCODE_FAILED -; - -1185  -–m --> -ty³ --> -Ý --> - `­”_’cod” -Ólm->ty³,ƒlm-> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, - -1186 -memb_±r -, -po -); - -1188 -a¢_’c_rv®_t - -rv® - = {0,0,0}; - -1189 if( -¥ecs --> -ext_¡¬t - == -1) - -1190 -ASN__ENCODE_FAILED -; - -1193 if( -ext_ù - && - `­”_put_n¢nwn -( -po -,ƒxt_ù-> -¿nge_b™s -, -´e£Á_’c - - -¥ecs --> -ext_¡¬t -)) - -1194 -ASN__ENCODE_FAILED -; - -1195 if( - `­”_ݒ_ty³_put -( -–m --> -ty³ -,ƒlm-> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, - -1196 -memb_±r -, -po -)) - -1197 -ASN__ENCODE_FAILED -; - -1198 -rv® -. -’coded - = 0; - -1199 - `ASN__ENCODED_OK -( -rv® -); - -1201 - } -} - -1204 - $CHOICE_´št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -1205 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -1206 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_CHOICE_¥ecifics_ˆ*) -td --> -¥ecifics -; - -1207  -´e£Á -; - -1209 if(! -¥Œ -è ( - `cb -("", 8, -­p_key -) < 0) ? -1 : 0; - -1214 -´e£Á - = - `_ãtch_´e£Á_idx -( -¥Œ -, -¥ecs --> -´es_off£t -,¥ecs-> -´es_size -); - -1219 if( -´e£Á - > 0 &&…»£Á <ð -td --> -–em’ts_couÁ -) { - -1220 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -´e£Á --1]; - -1221 cÚ¡ * -memb_±r -; - -1223 if( -–m --> -æags - & -ATF_POINTER -) { - -1224 -memb_±r - = *(cÚ¡ * cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1225 if(! -memb_±r -è ( - `cb -("", 8, -­p_key -) < 0) ? -1 : 0; - -1227 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1232 if( - `cb -( -–m --> -Çme -, - `¡¾’ -Ólm->Çme), -­p_key -) < 0 - -1233 || - `cb -(": ", 2, -­p_key -) < 0) - -1237  -–m --> -ty³ --> -Ý --> - `´št_¡ruù -Ólm->ty³, -memb_±r -, -žev– -, - -1238 -cb -, -­p_key -); - -1240  ( - `cb -("", 8, -­p_key -) < 0) ? -1 : 0; - -1242 - } -} - -1245 - $CHOICE_ä“ -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -±r -, - -1246 -a¢_¡ruù_ä“_m‘hod - -m‘hod -) { - -1247 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = - -1248 (cÚ¡ -a¢_CHOICE_¥ecifics_t - *) -td --> -¥ecifics -; - -1249  -´e£Á -; - -1251 if(! -td - || ! -±r -) - -1254 - `ASN_DEBUG -("F»ešg % a CHOICE", -td --> -Çme -); - -1259 -´e£Á - = - `_ãtch_´e£Á_idx -( -±r -, -¥ecs --> -´es_off£t -, s³cs-> -´es_size -); - -1264 if( -´e£Á - > 0 &&…»£Á <ð -td --> -–em’ts_couÁ -) { - -1265 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -´e£Á --1]; - -1266 * -memb_±r -; - -1268 if( -–m --> -æags - & -ATF_POINTER -) { - -1269 -memb_±r - = *(**)((*) -±r - + -–m --> -memb_off£t -); - -1270 if( -memb_±r -) - -1271 - `ASN_STRUCT_FREE -(* -–m --> -ty³ -, -memb_±r -); - -1273 -memb_±r - = (*)((*) -±r - + -–m --> -memb_off£t -); - -1274 - `ASN_STRUCT_FREE_CONTENTS_ONLY -(* -–m --> -ty³ -, -memb_±r -); - -1278  -m‘hod -) { - -1279  -ASFM_FREE_EVERYTHING -: - -1280 - `FREEMEM -( -±r -); - -1282  -ASFM_FREE_UNDERLYING -: - -1284  -ASFM_FREE_UNDERLYING_AND_RESET -: - -1285 - `mem£t -( -±r -, 0, -¥ecs --> -¡ruù_size -); - -1288 - } -} - -1301 - $_ãtch_´e£Á_idx -(cÚ¡ * -¡ruù_±r -,  -´es_off£t -, - -1302  -´es_size -) { - -1303 cÚ¡ * -´e£Á_±r -; - -1304  -´e£Á -; - -1306 -´e£Á_±r - = ((cÚ¡ *) -¡ruù_±r -è+ -´es_off£t -; - -1308  -´es_size -) { - -1309 (): -´e£Á - = *(cÚ¡ *) -´e£Á_±r -; ; - -1310 (): -´e£Á - = *(cÚ¡ *) -´e£Á_±r -; ; - -1311 (): -´e£Á - = *(cÚ¡ *) -´e£Á_±r -; ; - -1314 - `as£¹ -( -´es_size - != ()); - -1318  -´e£Á -; - -1319 - } -} - -1322 - $_£t_´e£Á_idx -(* -¡ruù_±r -,  -´es_off£t -,  -´es_size -, - -1323  -´e£Á -) { - -1324 * -´e£Á_±r -; - -1325 -´e£Á_±r - = ((*) -¡ruù_±r -è+ -´es_off£t -; - -1327  -´es_size -) { - -1328 (): *(*) -´e£Á_±r - = -´e£Á -; ; - -1329 (): *(*) -´e£Á_±r - = -´e£Á -; ; - -1330 (): *(*) -´e£Á_±r - = -´e£Á -; ; - -1333 - `as£¹ -( -´es_size - != ()); - -1335 - } -} - -1338 - $_g‘_memb”_±r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -1339 -a¢_TYPE_memb”_t - ** -–m_±r -, * -´e£Á_out -) { - -1340 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = - -1341 (cÚ¡ -a¢_CHOICE_¥ecifics_t - *) -td --> -¥ecifics -; - -1342  -´e£Á -; - -1344 if(! -¥Œ -) { - -1345 * -–m_±r - = -NULL -; - -1346 * -´e£Á_out - = 0; - -1347  -NULL -; - -1353 -´e£Á - = - `_ãtch_´e£Á_idx -( -¥Œ -, -¥ecs --> -´es_off£t -, s³cs-> -´es_size -); - -1354 * -´e£Á_out - = -´e£Á -; - -1360 if( -´e£Á - > 0 &&…»£Á <ð -td --> -–em’ts_couÁ -) { - -1361 -a¢_TYPE_memb”_t - *cÚ¡ -–m - = & -td --> -–em’ts -[ -´e£Á - - 1]; - -1362 cÚ¡ * -memb_±r -; - -1364 if( -–m --> -æags - & -ATF_POINTER -) { - -1365 -memb_±r - = - -1366 *(cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1368 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1370 * -–m_±r - = -–m -; - -1371  -memb_±r -; - -1373 * -–m_±r - = -NULL -; - -1374  -NULL -; - -1377 - } -} - -1380 - $CHOICE_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -­Œ -, cÚ¡ * -b±r -) { - -1381 -a¢_TYPE_memb”_t - * -«lm -; - -1382 -a¢_TYPE_memb”_t - * -b–m -; - -1383  -­»£Á - = 0; - -1384  -b´e£Á - = 0; - -1385 cÚ¡ * -amemb” - = - `_g‘_memb”_±r -( -td -, -­Œ -, & -«lm -, & -­»£Á -); - -1386 cÚ¡ * -bmemb” - = - `_g‘_memb”_±r -( -td -, -b±r -, & -b–m -, & -b´e£Á -); - -1388 if( -amemb” - && -bmemb” -) { - -1389 if( -­»£Á - =ð -b´e£Á -) { - -1390 - `as£¹ -( -«lm - =ð -b–m -); - -1391  -«lm --> -ty³ --> -Ý --> - `com·»_¡ruù -זm->ty³, -amemb” -, -bmemb” -); - -1392 } if( -­»£Á - < -b´e£Á -) { - -1397 } if(! -amemb” -) { - -1402 - } -} - -1409 - $CHOICE_v¬ŸÁ_g‘_´e£nû -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -) { - -1410 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = - -1411 (cÚ¡ -a¢_CHOICE_¥ecifics_t - *) -td --> -¥ecifics -; - -1412  - `_ãtch_´e£Á_idx -( -¥Œ -, -¥ecs --> -´es_off£t -, s³cs-> -´es_size -); - -1413 - } -} - -1422 - $CHOICE_v¬ŸÁ_£t_´e£nû -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -1423  -´e£Á -) { - -1424 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = - -1425 (cÚ¡ -a¢_CHOICE_¥ecifics_t - *) -td --> -¥ecifics -; - -1426  -Þd_´e£Á -; - -1428 if(! -¥Œ -) { - -1432 if( -´e£Á - > -td --> -–em’ts_couÁ -) - -1435 -Þd_´e£Á - = - -1436 - `_ãtch_´e£Á_idx -( -¥Œ -, -¥ecs --> -´es_off£t -, s³cs-> -´es_size -); - -1437 if( -´e£Á - =ð -Þd_´e£Á -) - -1440 if( -Þd_´e£Á - != 0) { - -1441 - `as£¹ -( -Þd_´e£Á - <ð -td --> -–em’ts_couÁ -); - -1442 - `ASN_STRUCT_RESET -(* -td -, -¥Œ -); - -1445 - `_£t_´e£Á_idx -( -¥Œ -, -¥ecs --> -´es_off£t -, s³cs-> -´es_size -, -´e£Á -); - -1448 - } -} - -1451 -a¢_¿ndom_fžl_»suÉ_t - - -1452 - $CHOICE_¿ndom_fžl -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -1453 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡r -, - -1454 -size_t - -max_Ëngth -) { - -1455 cÚ¡ -a¢_CHOICE_¥ecifics_t - * -¥ecs - = - -1456 (cÚ¡ -a¢_CHOICE_¥ecifics_t - *) -td --> -¥ecifics -; - -1457 -a¢_¿ndom_fžl_»suÉ_t - -»s -; - -1458 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_çžed - = { -ARFILL_FAILED -, 0}; - -1459 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_sk³d - = { -ARFILL_SKIPPED -, 0}; - -1460 cÚ¡ -a¢_TYPE_memb”_t - * -–m -; - -1461  -´e£Á -; - -1462 * -memb_±r -; - -1463 ** -memb_±r2 -; - -1464 * -¡ - = * -¥Œ -; - -1466 if( -max_Ëngth - =ð0è -»suÉ_sk³d -; - -1468 () -cÚ¡r -; - -1470 if( -¡ - =ð -NULL -) { - -1471 -¡ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -1472 if( -¡ - =ð -NULL -) { - -1473  -»suÉ_çžed -; - -1477 -´e£Á - = - `a¢_¿ndom_b‘w“n -(1, -td --> -–em’ts_couÁ -); - -1478 -–m - = & -td --> -–em’ts -[ -´e£Á - - 1]; - -1480 if( -–m --> -æags - & -ATF_POINTER -) { - -1482 -memb_±r2 - = (**)((*) -¡ - + -–m --> -memb_off£t -); - -1484 -memb_±r - = (*) -¡ - + -–m --> -memb_off£t -; - -1485 -memb_±r2 - = & -memb_±r -; - -1488 -»s - = -–m --> -ty³ --> -Ý --> - `¿ndom_fžl -Ólm->ty³, -memb_±r2 -, - -1489 & -–m --> -’codšg_cÚ¡¿šts -, -max_Ëngth -); - -1490 - `_£t_´e£Á_idx -( -¡ -, -¥ecs --> -´es_off£t -, s³cs-> -´es_size -, -´e£Á -); - -1491 if( -»s -. -code - =ð -ARFILL_OK -) { - -1492 * -¥Œ - = -¡ -; - -1494 if( -¡ - =ð* -¥Œ -) { - -1495 - `ASN_STRUCT_RESET -(* -td -, -¡ -); - -1497 - `ASN_STRUCT_FREE -(* -td -, -¡ -); - -1501  -»s -; - -1502 - } -} - -1505 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_CHOICE - = { - -1506 -CHOICE_ä“ -, - -1507 -CHOICE_´št -, - -1508 -CHOICE_com·» -, - -1509 -CHOICE_decode_b” -, - -1510 -CHOICE_’code_d” -, - -1511 -CHOICE_decode_x” -, - -1512 -CHOICE_’code_x” -, - -1513 #ifdef -ASN_DISABLE_OER_SUPPORT - - -1517 -CHOICE_decode_Ûr -, - -1518 -CHOICE_’code_Ûr -, - -1520 #ifdeà -ASN_DISABLE_PER_SUPPORT - - -1526 -CHOICE_decode_u³r -, - -1527 -CHOICE_’code_u³r -, - -1528 -CHOICE_decode_­” -, - -1529 -CHOICE_’code_­” -, - -1531 -CHOICE_¿ndom_fžl -, - -1532 -CHOICE_outmo¡_g - - - @constr_SEQUENCE.c - -6  - ~ - -7  - ~ - -8  - ~ - -9  - ~<³r_ݒty³.h -> - -16  - #LEFT - (( -size -<( -size_t -) -ùx --> -Ëá -)?size:(size_t)ùx->Ëá) - - ) - -29  - #SIZE_VIOLATION - ( -ùx --> -Ëá - >ð0 && ( -size_t -)ùx->Ëá <ð -size -) - - ) - -35 #undeà -ADVANCE - - -36  - #ADVANCE -( -num_by‹s -) do { \ - -37 -size_t - -num - = -num_by‹s -; \ - -38 -±r - = ((cÚ¡ *íŒè+ -num -; \ - -39 -size - -ð -num -; \ - -40 if( -ùx --> -Ëá - >= 0) \ - -41 -ùx --> -Ëá - -ð -num -; \ - -42 -cÚsumed_my£lf - +ð -num -; \ - -43 } 0) - - ) - -48 #undeà -NEXT_PHASE - - -49 #undeà -PHASE_OUT - - -50  - #NEXT_PHASE -( -ùx -) do { \ - -51 -ùx --> -pha£ -++; \ - -52 -ùx --> -¡• - = 0; \ - -53 } 0) - - ) - -54  - #PHASE_OUT -( -ùx -èdØ{ ctx-> -pha£ - = 10; } 0) - - ) - -59 #undeà -RETURN - - -60  - #RETURN -( -_code -) do { \ - -61 -rv® -. -code - = -_code -; \ - -62 -rv® -. -cÚsumed - = -cÚsumed_my£lf -;\ - -63  -rv® -; \ - -64 } 0) - - ) - -69  - #IN_EXTENSION_GROUP -( -¥ecs -, -memb_idx -) \ - -70 (( -¥ecs -)-> -fœ¡_ex‹nsiÚ - >= 0 \ - -71 && ()( -¥ecs -)-> -fœ¡_ex‹nsiÚ - <ð( -memb_idx -)) - - ) - -77 - $_t2e_cmp -(cÚ¡ * -­ -, cÚ¡ * -bp -) { - -78 cÚ¡ -a¢_TYPE_g2memb”_t - * -a - = (cÚ¡‡¢_TYPE_g2memb”_ˆ*) -­ -; - -79 cÚ¡ -a¢_TYPE_g2memb”_t - * -b - = (cÚ¡‡¢_TYPE_g2memb”_ˆ*) -bp -; - -81  -a_þass - = - `BER_TAG_CLASS -( -a --> -–_g -); - -82  -b_þass - = - `BER_TAG_CLASS -( -b --> -–_g -); - -84 if( -a_þass - =ð -b_þass -) { - -85 -b”_Žv_g_t - -a_v®ue - = - `BER_TAG_VALUE -( -a --> -–_g -); - -86 -b”_Žv_g_t - -b_v®ue - = - `BER_TAG_VALUE -( -b --> -–_g -); - -88 if( -a_v®ue - =ð -b_v®ue -) { - -89 if( -a --> -–_no - > -b -->el_no) - -96 } if( -a_v®ue - < -b_v®ue -) - -100 } if( -a_þass - < -b_þass -) { - -105 - } -} - -111 -a¢_dec_rv®_t - - -112 - $SEQUENCE_decode_b” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -113 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¡ruù_±r -, - -114 cÚ¡ * -±r -, -size_t - -size -,  -g_mode -) { - -118 cÚ¡ -a¢_SEQUENCE_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_SEQUENCE_¥ecifics_ˆ*) -td --> -¥ecifics -; - -119 cÚ¡ -a¢_TYPE_memb”_t - * -–em’ts - = -td -->elements; - -124 * -¡ - = * -¡ruù_±r -; - -125 -a¢_¡ruù_ùx_t - * -ùx -; - -127 -b”_Žv_g_t - -Žv_g -; - -128 -a¢_dec_rv®_t - -rv® -; - -130 -ssize_t - -cÚsumed_my£lf - = 0; - -131 -size_t - -edx -; - -133 - `ASN_DEBUG -("Decodšg % a SEQUENCE", -td --> -Çme -); - -138 if( -¡ - == 0) { - -139 -¡ - = * -¡ruù_±r - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -140 if( -¡ - == 0) { - -141 - `RETURN -( -RC_FAIL -); - -148 -ùx - = ( -a¢_¡ruù_ùx_t - *)((*) -¡ - + -¥ecs --> -ùx_off£t -); - -153  -ùx --> -pha£ -) { - -161 -rv® - = - `b”_check_gs -( -Ýt_codec_ùx -, -td -, -ùx -, -±r -, -size -, - -162 -g_mode -, 1, & -ùx --> -Ëá -, 0); - -163 if( -rv® -. -code - !ð -RC_OK -) { - -164 - `ASN_DEBUG -("%sagging check failed: %d", - -165 -td --> -Çme -, -rv® -. -code -); - -166  -rv® -; - -169 if( -ùx --> -Ëá - >= 0) - -170 -ùx --> -Ëá - +ð -rv® -. -cÚsumed -; - -171 - `ADVANCE -( -rv® -. -cÚsumed -); - -173 - `NEXT_PHASE -( -ùx -); - -175 - `ASN_DEBUG -("Structure consumes %ld bytes, buffer %ld", - -176 () -ùx --> -Ëá -, () -size -); - -190  -edx - = (( -size_t -) -ùx --> -¡• - >> 1);ƒdx < -td --> -–em’ts_couÁ -; - -191 -edx -++, -ùx --> -¡• - = (ctx->step & ~1) + 2) { - -192 * -memb_±r -; - -193 ** -memb_±r2 -; - -194 -ssize_t - -g_Ën -; - -195 -size_t - -Ýt_edx_’d -; - -196 -size_t - -n -; - -197  -u£_b£¬ch -; - -199 if( -ùx --> -¡• - & 1) - -200  -miüÝha£2 -; - -205 - `ASN_DEBUG -("IÀ% SEQUENCE†eá %d,ƒdx=%" -ASN_PRI_SIZE - " flags=%d" - -207 -td --> -Çme -, () -ùx --> -Ëá -, -edx -, - -208 -–em’ts -[ -edx -]. -æags -,ƒËm’ts[edx]. -ÝtiÚ® -, - -209 -td --> -–em’ts_couÁ -); - -211 if( -ùx --> -Ëá - == 0 - -214 ( -edx - + -–em’ts -[edx]. -ÝtiÚ® - =ð -td --> -–em’ts_couÁ -) || - -216 - `IN_EXTENSION_GROUP -( -¥ecs -, -edx -))) { - -217 - `ASN_DEBUG -("End oàSEQUENCE %s", -td --> -Çme -); - -221 - `PHASE_OUT -( -ùx -); - -222 - `RETURN -( -RC_OK -); - -228 -g_Ën - = - `b”_ãtch_g -( -±r -, -LEFT -, & -Žv_g -); - -229 - `ASN_DEBUG -("Cu¼’ˆg iÀ% SEQUENCE f܃Ëm’ˆ%" -ASN_PRI_SIZE - " " - -231 -td --> -Çme -, -edx -, -–em’ts -[edx].name, - -232 - `b”_Žv_g_¡ršg -( -Žv_g -), () -g_Ën -, () -LEFT -); - -233  -g_Ën -) { - -234 0: if(! -SIZE_VIOLATION -è - `RETURN -( -RC_WMORE -); - -236 -1: - `RETURN -( -RC_FAIL -); - -239 if( -ùx --> -Ëá - < 0 && ((cÚ¡ -ušt8_t - *) -±r -)[0] == 0) { - -240 if( -LEFT - < 2) { - -241 if( -SIZE_VIOLATION -) { - -242 - `RETURN -( -RC_FAIL -); - -244 - `RETURN -( -RC_WMORE -); - -246 } if(((cÚ¡ -ušt8_t - *) -±r -)[1] == 0) { - -247 - `ASN_DEBUG -("edx = %" -ASN_PRI_SIZE - ", o± = %d,ƒc=%d", -edx -, - -248 -–em’ts -[ -edx -]. -ÝtiÚ® -, -td --> -–em’ts_couÁ -); - -249 if(( -edx - + -–em’ts -[edx]. -ÝtiÚ® - =ð -td --> -–em’ts_couÁ -) - -250 || - `IN_EXTENSION_GROUP -( -¥ecs -, -edx -)) { - -260  -pha£3 -; - -268 -u£_b£¬ch - = 0; - -269 -Ýt_edx_’d - = -edx - + -–em’ts -[edx]. -ÝtiÚ® - + 1; - -270 if( -Ýt_edx_’d - > -td --> -–em’ts_couÁ -) - -271 -Ýt_edx_’d - = -td --> -–em’ts_couÁ -; - -272 if( -Ýt_edx_’d - - -edx - > 8) { - -274 -Ýt_edx_’d - = -edx - + 8; - -275 -u£_b£¬ch - = 1; - -278  -n - = -edx -;‚ < -Ýt_edx_’d -;‚++) { - -279 if( - `BER_TAGS_EQUAL -( -Žv_g -, -–em’ts -[ -n -]. -g -)) { - -285 -edx - = -n -; - -286 -ùx --> -¡• - = 1 + 2 * -edx -; - -287  -miüÝha£2 -; - -288 } if( -–em’ts -[ -n -]. -æags - & -ATF_ANY_TYPE -) { - -293 -edx - = -n -; - -294 -ùx --> -¡• - = 1 + 2 * -edx -; - -295  -miüÝha£2 -; - -296 } if( -–em’ts -[ -n -]. -g - =ð( -b”_Žv_g_t -)-1) { - -297 -u£_b£¬ch - = 1; - -301 if( -u£_b£¬ch -) { - -306 cÚ¡ -a¢_TYPE_g2memb”_t - * -t2m -; - -307 -a¢_TYPE_g2memb”_t - -key - = {0, 0, 0, 0}; - -308 -key -. -–_g - = -Žv_g -; - -309 -key -. -–_no - = -edx -; - -310 -t2m - = (cÚ¡ -a¢_TYPE_g2memb”_t - *) - `b£¬ch -(& -key -, - -311 -¥ecs --> -g2– -, s³cs-> -g2–_couÁ -, - -312 ( -¥ecs --> -g2– -[0]), -_t2e_cmp -); - -313 if( -t2m -) { - -314 cÚ¡ -a¢_TYPE_g2memb”_t - * -be¡ - = 0; - -315 cÚ¡ -a¢_TYPE_g2memb”_t - * -t2m_f -, * -t2m_l -; - -316 -size_t - -edx_max - = -edx - + -–em’ts -[edx]. -ÝtiÚ® -; - -321 -t2m_f - = -t2m - +2m-> -toff_fœ¡ -; - -322 -t2m_l - = -t2m - +2m-> -toff_Ï¡ -; - -323  -t2m - = -t2m_f -;2m <ð -t2m_l -;2m++) { - -324 if( -t2m --> -–_no - > -edx_max -) ; - -325 if( -t2m --> -–_no - < -edx -) ; - -326 -be¡ - = -t2m -; - -328 if( -be¡ -) { - -329 -edx - = -be¡ --> -–_no -; - -330 -ùx --> -¡• - = 1 + 2 * -edx -; - -331  -miüÝha£2 -; - -334 -n - = -Ýt_edx_’d -; - -336 if( -n - =ð -Ýt_edx_’d -) { - -343 if(! - `IN_EXTENSION_GROUP -( -¥ecs -, - -344 -edx - + -–em’ts -[edx]. -ÝtiÚ® -)) { - -345 - `ASN_DEBUG -("UÃx³ùedag % ×ˆ%" -ASN_PRI_SIZE - ")", - -346 - `b”_Žv_g_¡ršg -( -Žv_g -), -edx -); - -347 - `ASN_DEBUG -("Expectedag %s (%s)%s", - -348 - `b”_Žv_g_¡ršg -( -–em’ts -[ -edx -]. -g -), - -349 -–em’ts -[ -edx -]. -Çme -, - -350 -–em’ts -[ -edx -]. -ÝtiÚ® - - -352 - `RETURN -( -RC_FAIL -); - -355 -ssize_t - -sk -; - -356 -edx - +ð -–em’ts -[edx]. -ÝtiÚ® -; - -358 - `ASN_DEBUG -("Skpšg uÃx³ùed % ×ˆ%" -ASN_PRI_SIZE - ")", - -359 - `b”_Žv_g_¡ršg -( -Žv_g -), -edx -); - -360 -sk - = - `b”_sk_Ëngth -( -Ýt_codec_ùx -, - -361 - `BER_TLV_CONSTRUCTED -( -±r -), - -362 (cÚ¡ *) -±r - + -g_Ën -, - -363 -LEFT - - -g_Ën -); - -364 - `ASN_DEBUG -("Skip†ength %d in %s", - -365 () -sk -, -td --> -Çme -); - -366  -sk -) { - -367 0: if(! -SIZE_VIOLATION -è - `RETURN -( -RC_WMORE -); - -369 -1: - `RETURN -( -RC_FAIL -); - -372 - `ADVANCE -( -sk - + -g_Ën -); - -373 -ùx --> -¡• - -= 2; - -374 -edx ---; - -382 -ùx --> -¡• - |= 1; - -383 -miüÝha£2 -: - -384 - `ASN_DEBUG -("InsidSEQUENCE % MF2", -td --> -Çme -); - -391 if( -–em’ts -[ -edx -]. -æags - & -ATF_POINTER -) { - -393 -memb_±r2 - = (**)((*) -¡ - + -–em’ts -[ -edx -]. -memb_off£t -); - -399 -memb_±r - = (*) -¡ - + -–em’ts -[ -edx -]. -memb_off£t -; - -400 -memb_±r2 - = & -memb_±r -; - -405 if( -–em’ts -[ -edx -]. -æags - & -ATF_OPEN_TYPE -) { - -406 -rv® - = - `OPEN_TYPE_b”_g‘ -( -Ýt_codec_ùx -, -td -, -¡ -, & -–em’ts -[ -edx -], -±r -, -LEFT -); - -408 -rv® - = -–em’ts -[ -edx -]. -ty³ --> -Ý --> - `b”_decod” -( -Ýt_codec_ùx -, - -409 -–em’ts -[ -edx -]. -ty³ -, - -410 -memb_±r2 -, -±r -, -LEFT -, - -411 -–em’ts -[ -edx -]. -g_mode -); - -413 - `ASN_DEBUG -("IÀ% SEQUENCE decoded %" -ASN_PRI_SIZE - " %s of %d " - -415 -td --> -Çme -, -edx -, -–em’ts -[edx]. -ty³ -->name, - -416 () -LEFT -, () -rv® -. -cÚsumed -,„v®. -code -, () -size -); - -417  -rv® -. -code -) { - -418  -RC_OK -: - -420  -RC_WMORE -: - -421 if(! -SIZE_VIOLATION -) { - -422 - `ADVANCE -( -rv® -. -cÚsumed -); - -423 - `RETURN -( -RC_WMORE -); - -425 - `ASN_DEBUG -("Size violation (c->l=%ld <= s=%ld)", - -426 () -ùx --> -Ëá -, () -size -); - -428  -RC_FAIL -: - -429 - `RETURN -( -RC_FAIL -); - -432 - `ADVANCE -( -rv® -. -cÚsumed -); - -435 -pha£3 -: - -436 -ùx --> -pha£ - = 3; - -441 - `ASN_DEBUG -("SEQUENCE %s Leftover: %ld, size = %ld", - -442 -td --> -Çme -, () -ùx --> -Ëá -, () -size -); - -447  -ùx --> -Ëá -) { - -448 -ssize_t - -Ž -, -Î -; - -450 -Ž - = - `b”_ãtch_g -( -±r -, -LEFT -, & -Žv_g -); - -451  -Ž -) { - -452 0: if(! -SIZE_VIOLATION -è - `RETURN -( -RC_WMORE -); - -454 -1: - `RETURN -( -RC_FAIL -); - -460 if( -ùx --> -Ëá - < 0 - -461 && ((cÚ¡ -ušt8_t - *) -±r -)[0] == 0) { - -462 if( -LEFT - < 2) { - -463 if( -SIZE_VIOLATION -) - -464 - `RETURN -( -RC_FAIL -); - -466 - `RETURN -( -RC_WMORE -); - -467 } if(((cÚ¡ -ušt8_t - *) -±r -)[1] == 0) { - -471 - `ADVANCE -(2); - -472 -ùx --> -Ëá -++; - -473 -ùx --> -pha£ - = 4; - -478 if(! - `IN_EXTENSION_GROUP -( -¥ecs -, -td --> -–em’ts_couÁ -) - -479 || -ùx --> -pha£ - == 4) { - -480 - `ASN_DEBUG -("Unexpected continuation " - -483 -td --> -Çme -, - -484 - `b”_Žv_g_¡ršg -( -Žv_g -)); - -485 - `RETURN -( -RC_FAIL -); - -488 -Î - = - `b”_sk_Ëngth -( -Ýt_codec_ùx -, - -489 - `BER_TLV_CONSTRUCTED -( -±r -), - -490 (cÚ¡ *) -±r - + -Ž -, -LEFT - -l); - -491  -Î -) { - -492 0: if(! -SIZE_VIOLATION -è - `RETURN -( -RC_WMORE -); - -494 -1: - `RETURN -( -RC_FAIL -); - -497 - `ADVANCE -( -Ž - + -Î -); - -500 - `PHASE_OUT -( -ùx -); - -503 - `RETURN -( -RC_OK -); - -504 - } -} - -510 -a¢_’c_rv®_t - - -511 - $SEQUENCE_’code_d” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -512  -g_mode -, -b”_Žv_g_t - -g -, - -513 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -514 -size_t - -compu‹d_size - = 0; - -515 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -516 -ssize_t - -»t -; - -517 -size_t - -edx -; - -519 - `ASN_DEBUG -("%s %s‡s SEQUENCE", - -520 -cb -?"Encodšg":"E¡im©šg", -td --> -Çme -); - -525  -edx - = 0;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -526 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -528 cÚ¡ * -memb_±r -; - -529 cÚ¡ *cÚ¡ * -memb_±r2 -; - -531 if( -–m --> -æags - & -ATF_POINTER -) { - -532 -memb_±r2 - = - -533 (cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -534 if(!* -memb_±r2 -) { - -535 - `ASN_DEBUG -("EËm’ˆ% %" -ASN_PRI_SIZE - "‚ot…resent", - -536 -–m --> -Çme -, -edx -); - -537 if( -–m --> -ÝtiÚ® -) - -540 -ASN__ENCODE_FAILED -; - -543 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -544 -memb_±r2 - = & -memb_±r -; - -548 if( -–m --> -deçuÉ_v®ue_cmp - &&ƒlm-> - `deçuÉ_v®ue_cmp -(* -memb_±r2 -) == 0) - -551 -”v® - = -–m --> -ty³ --> -Ý --> - `d”_’cod” -Ólm->ty³, * -memb_±r2 -, - -552 -–m --> -g_mode -,ƒlm-> -g -, - -554 if( -”v® -. -’coded - == -1) - -555  -”v® -; - -556 -compu‹d_size - +ð -”v® -. -’coded -; - -557 - `ASN_DEBUG -("Memb” %" -ASN_PRI_SIZE - " %sƒstimated %ld bytes", - -558 -edx -, -–m --> -Çme -, () -”v® -. -’coded -); - -564 -»t - = - `d”_wr™e_gs -( -td -, -compu‹d_size -, -g_mode -, 1, -g -, -cb -, -­p_key -); - -565 - `ASN_DEBUG -("Wrِgs: %ld (+%ld)", () -»t -, () -compu‹d_size -); - -566 if( -»t - == -1) - -567 -ASN__ENCODE_FAILED -; - -568 -”v® -. -’coded - = -compu‹d_size - + -»t -; - -570 if(! -cb -è - `ASN__ENCODED_OK -( -”v® -); - -575  -edx - = 0;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -576 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -577 -a¢_’c_rv®_t - -tm³rv® - = {0,0,0}; - -578 cÚ¡ * -memb_±r -; - -579 cÚ¡ *cÚ¡ * -memb_±r2 -; - -581 if( -–m --> -æags - & -ATF_POINTER -) { - -582 -memb_±r2 - = - -583 (cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -584 if(!* -memb_±r2 -) ; - -586 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -587 -memb_±r2 - = & -memb_±r -; - -591 if( -–m --> -deçuÉ_v®ue_cmp - &&ƒlm-> - `deçuÉ_v®ue_cmp -(* -memb_±r2 -) == 0) - -594 -tm³rv® - = -–m --> -ty³ --> -Ý --> - `d”_’cod” -Ólm->ty³, * -memb_±r2 -, - -595 -–m --> -g_mode -,ƒlm-> -g -, -cb -, -­p_key -); - -596 if( -tm³rv® -. -’coded - == -1) - -597  -tm³rv® -; - -598 -compu‹d_size - -ð -tm³rv® -. -’coded -; - -599 - `ASN_DEBUG -("Memb” %" -ASN_PRI_SIZE - " %s of SEQUENCE %sƒncoded in %ld bytes", - -600 -edx -, -–m --> -Çme -, -td -->Çme, () -tm³rv® -. -’coded -); - -603 if( -compu‹d_size - != 0) - -607 -ASN__ENCODE_FAILED -; - -609 - `ASN__ENCODED_OK -( -”v® -); - -610 - } -} - -613 #undeà -XER_ADVANCE - - -614  - #XER_ADVANCE -( -num_by‹s -) \ - -616 -size_t - -num - = ( -num_by‹s -); \ - -617 -±r - = ((cÚ¡ *íŒè+ -num -; \ - -618 -size - -ð -num -; \ - -619 -cÚsumed_my£lf - +ð -num -; \ - -620 } 0) - - ) - -625 -a¢_dec_rv®_t - - -626 - $SEQUENCE_decode_x” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -627 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¡ruù_±r -, - -628 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -±r -, -size_t - -size -) { - -632 cÚ¡ -a¢_SEQUENCE_¥ecifics_t - * -¥ecs - - -633 ð(cÚ¡ -a¢_SEQUENCE_¥ecifics_t - *) -td --> -¥ecifics -; - -634 -a¢_TYPE_memb”_t - * -–em’ts - = -td -->elements; - -635 cÚ¡ * -xml_g - = -Ýt_mÇme - ? o±_mÇm: -td -->xml_tag; - -640 * -¡ - = * -¡ruù_±r -; - -641 -a¢_¡ruù_ùx_t - * -ùx -; - -643 -a¢_dec_rv®_t - -rv® -; - -644 -ssize_t - -cÚsumed_my£lf - = 0; - -645 -size_t - -edx -; - -650 if( -¡ - == 0) { - -651 -¡ - = * -¡ruù_±r - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -652 if( -¡ - =ð0è - `RETURN -( -RC_FAIL -); - -658 -ùx - = ( -a¢_¡ruù_ùx_t - *)((*) -¡ - + -¥ecs --> -ùx_off£t -); - -669  -edx - = -ùx --> -¡• -; ctx-> -pha£ - <= 3;) { - -670 -px”_chunk_ty³_e - -ch_ty³ -; - -671 -ssize_t - -ch_size -; - -672 -x”_check_g_e - -tcv -; - -673 -a¢_TYPE_memb”_t - * -–m -; - -678 if( -ùx --> -pha£ - == 2) { - -679 -a¢_dec_rv®_t - -tm´v® -; - -680 * -memb_±r_dÚtu£ -; - -681 ** -memb_±r2 -; - -683 -–m - = & -td --> -–em’ts -[ -edx -]; - -685 if( -–m --> -æags - & -ATF_POINTER -) { - -687 -memb_±r2 - = (**)((*) -¡ - + -–m --> -memb_off£t -); - -689 -memb_±r_dÚtu£ - = (*) -¡ - + -–m --> -memb_off£t -; - -690 -memb_±r2 - = & -memb_±r_dÚtu£ -; - -693 if( -–m --> -æags - & -ATF_OPEN_TYPE -) { - -694 -tm´v® - = - `OPEN_TYPE_x”_g‘ -( -Ýt_codec_ùx -, -td -, -¡ -, -–m -, -±r -, -size -); - -697 -tm´v® - = -–m --> -ty³ --> -Ý --> - `x”_decod” -( -Ýt_codec_ùx -, - -698 -–m --> -ty³ -, -memb_±r2 -,ƒlm-> -Çme -, - -699 -±r -, -size -); - -701 - `XER_ADVANCE -( -tm´v® -. -cÚsumed -); - -702 if( -tm´v® -. -code - !ð -RC_OK -) - -703 - `RETURN -( -tm´v® -. -code -); - -704 -ùx --> -pha£ - = 1; - -705 -ùx --> -¡• - = ++ -edx -; - -706 - `ASN_DEBUG -("XER/SEQUENCE…hase => %d, step => %d", - -707 -ùx --> -pha£ -, ctx-> -¡• -); - -714 -ch_size - = - `x”_Ãxt_tok’ -(& -ùx --> -cڋxt -, -±r -, -size -, - -715 & -ch_ty³ -); - -716 if( -ch_size - == -1) { - -717 - `RETURN -( -RC_FAIL -); - -719  -ch_ty³ -) { - -720  -PXER_WMORE -: - -721 - `RETURN -( -RC_WMORE -); - -722  -PXER_COMMENT -: - -723  -PXER_TEXT -: - -724 - `XER_ADVANCE -( -ch_size -); - -726  -PXER_TAG -: - -731 -tcv - = - `x”_check_g -( -±r -, -ch_size -, -xml_g -); - -732 - `ASN_DEBUG -("XER/SEQUENCE:cv = %d,…h=%d [%s]", - -733 -tcv -, -ùx --> -pha£ -, -xml_g -); - -736 if( -ùx --> -pha£ - == 3) { - -737  - `x”_sk_unknown -( -tcv -, & -ùx --> -Ëá -)) { - -739 -ùx --> -pha£ - = 4; - -740 - `RETURN -( -RC_FAIL -); - -742 - `XER_ADVANCE -( -ch_size -); - -745 - `XER_ADVANCE -( -ch_size -); - -746 -ùx --> -pha£ - = 1; - -749 -ùx --> -pha£ - = 1; - -754  -tcv -) { - -755  -XCT_CLOSING -: - -756 if( -ùx --> -pha£ - == 0) ; - -757 -ùx --> -pha£ - = 0; - -759  -XCT_BOTH -: - -760 if( -ùx --> -pha£ - == 0) { - -761 if( -edx - >ð -td --> -–em’ts_couÁ - || - -763 ( -edx - + -–em’ts -[edx]. -ÝtiÚ® - =ð -td --> -–em’ts_couÁ -) || - -765 - `IN_EXTENSION_GROUP -( -¥ecs -, -edx -)) { - -766 - `XER_ADVANCE -( -ch_size -); - -767 -ùx --> -pha£ - = 4; - -768 - `RETURN -( -RC_OK -); - -770 - `ASN_DEBUG -("Prematureƒnd of XER SEQUENCE"); - -771 - `RETURN -( -RC_FAIL -); - -775  -XCT_OPENING -: - -776 if( -ùx --> -pha£ - == 0) { - -777 - `XER_ADVANCE -( -ch_size -); - -778 -ùx --> -pha£ - = 1; - -782  -XCT_UNKNOWN_OP -: - -783  -XCT_UNKNOWN_BO -: - -785 - `ASN_DEBUG -("XER/SEQUENCE:cv=%d,…h=%d,ƒdx=%" -ASN_PRI_SIZE - "", - -786 -tcv -, -ùx --> -pha£ -, -edx -); - -787 if( -ùx --> -pha£ - != 1) { - -791 if( -edx - < -td --> -–em’ts_couÁ -) { - -795 -size_t - -n -; - -796 -size_t - -edx_’d - = -edx - + -–em’ts -[edx]. -ÝtiÚ® - + 1; - -797 if( -edx_’d - > -td --> -–em’ts_couÁ -) - -798 -edx_’d - = -td --> -–em’ts_couÁ -; - -799  -n - = -edx -;‚ < -edx_’d -;‚++) { - -800 -–m - = & -td --> -–em’ts -[ -n -]; - -801 -tcv - = - `x”_check_g -( -±r -, -ch_size -, -–m --> -Çme -); - -802  -tcv -) { - -803  -XCT_BOTH -: - -804  -XCT_OPENING -: - -808 -ùx --> -¡• - = -edx - = -n -; - -809 -ùx --> -pha£ - = 2; - -811  -XCT_UNKNOWN_OP -: - -812  -XCT_UNKNOWN_BO -: - -815 -n - = -edx_’d -; - -820 if( -n - !ð -edx_’d -) - -823 - `ASN_DEBUG -("Ouˆoàdefšed memb”s: %" -ASN_PRI_SIZE - "/%u", - -824 -edx -, -td --> -–em’ts_couÁ -); - -828 if( - `IN_EXTENSION_GROUP -( -¥ecs -, - -829 -edx - + (edx < -td --> -–em’ts_couÁ - - -830 ? -–em’ts -[ -edx -]. -ÝtiÚ® - : 0))) { - -831 - `ASN_DEBUG -("GهÁic©edƒx‹nsiڇˆ%" -ASN_PRI_SIZE - "", - -832 -edx -); - -838 if( -tcv - & -XCT_CLOSING -) { - -841 -ùx --> -Ëá - = 1; - -842 -ùx --> -pha£ - = 3; - -844 - `XER_ADVANCE -( -ch_size -); - -853 - `ASN_DEBUG -("Unexpected XMLag in SEQUENCE [%c%c%c%c%c%c]", - -854 -size ->0?((cÚ¡ *) -±r -)[0]:'.', - -855 -size ->1?((cÚ¡ *) -±r -)[1]:'.', - -856 -size ->2?((cÚ¡ *) -±r -)[2]:'.', - -857 -size ->3?((cÚ¡ *) -±r -)[3]:'.', - -858 -size ->4?((cÚ¡ *) -±r -)[4]:'.', - -859 -size ->5?((cÚ¡ *) -±r -)[5]:'.'); - -863 -ùx --> -pha£ - = 4; - -864 - `RETURN -( -RC_FAIL -); - -865 - } -} - -867 -a¢_’c_rv®_t - - -868 - $SEQUENCE_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -869  -žev– -, -x”_’cod”_æags_e - -æags -, - -870 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -871 -a¢_’c_rv®_t - -” - = {0,0,0}; - -872  -xÿn - = ( -æags - & -XER_F_CANONICAL -); - -873 -a¢_TYPE_desütÜ_t - * -tmp_def_v®_td - = 0; - -874 * -tmp_def_v® - = 0; - -875 -size_t - -edx -; - -877 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -879 -” -. -’coded - = 0; - -881  -edx - = 0;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -882 -a¢_’c_rv®_t - -tm³r - = {0,0,0}; - -883 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -884 cÚ¡ * -memb_±r -; - -885 cÚ¡ * -mÇme - = -–m --> -Çme -; - -886  -mËn - = - `¡¾’ -( -mÇme -); - -888 if( -–m --> -æags - & -ATF_POINTER -) { - -889 -memb_±r - = - -890 *(cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -891 if(! -memb_±r -) { - -892 - `as£¹ -( -tmp_def_v® - == 0); - -893 if( -–m --> -deçuÉ_v®ue_£t -) { - -894 if( -–m --> - `deçuÉ_v®ue_£t -(& -tmp_def_v® -)) { - -895 -ASN__ENCODE_FAILED -; - -897 -memb_±r - = -tmp_def_v® -; - -898 -tmp_def_v®_td - = -–m --> -ty³ -; - -900 } if( -–m --> -ÝtiÚ® -) { - -904 -ASN__ENCODE_FAILED -; - -908 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -911 if(! -xÿn -è - `ASN__TEXT_INDENT -(1, -žev– -); - -912 - `ASN__CALLBACK3 -("<", 1, -mÇme -, -mËn -, ">", 1); - -915 -tm³r - = -–m --> -ty³ --> -Ý --> - `x”_’cod” -Ólm->ty³, -memb_±r -, -žev– - + 1, - -916 -æags -, -cb -, -­p_key -); - -917 if( -tmp_def_v® -) { - -918 - `ASN_STRUCT_FREE -(* -tmp_def_v®_td -, -tmp_def_v® -); - -919 -tmp_def_v® - = 0; - -921 if( -tm³r -. -’coded - == -1) mper; - -922 -” -. -’coded - +ð -tm³r -.encoded; - -924 - `ASN__CALLBACK3 -("", 1); - -927 if(! -xÿn -è - `ASN__TEXT_INDENT -(1, -žev– - - 1); - -929 - `ASN__ENCODED_OK -( -” -); - -930 -cb_çžed -: - -931 if( -tmp_def_v® -è - `ASN_STRUCT_FREE -(* -tmp_def_v®_td -,mp_def_val); - -932 -ASN__ENCODE_FAILED -; - -933 - } -} - -936 - $SEQUENCE_´št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -937 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -938 -size_t - -edx -; - -939  -»t -; - -941 if(! -¥Œ -è ( - `cb -("", 8, -­p_key -) < 0) ? -1 : 0; - -944 if( - `cb -( -td --> -Çme -, - `¡¾’ -Ñd->Çme), -­p_key -) < 0 - -945 || - `cb -(" ::ð{", 6, -­p_key -) < 0) - -948  -edx - = 0;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -949 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -950 cÚ¡ * -memb_±r -; - -952 if( -–m --> -æags - & -ATF_POINTER -) { - -953 -memb_±r - = *(cÚ¡ * cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -954 if(! -memb_±r -) { - -955 if( -–m --> -ÝtiÚ® -) ; - -960 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -964 - `_i_INDENT -(1); - -967 if( - `cb -( -–m --> -Çme -, - `¡¾’ -Ólm->Çme), -­p_key -) < 0 - -968 || - `cb -(": ", 2, -­p_key -) < 0) - -972 -»t - = -–m --> -ty³ --> -Ý --> - `´št_¡ruù -Ólm->ty³, -memb_±r -, -žev– - + 1, - -973 -cb -, -­p_key -); - -974 if( -»t -) „et; - -977 -žev– ---; - -978 - `_i_INDENT -(1); - -980  ( - `cb -("}", 1, -­p_key -) < 0) ? -1 : 0; - -981 - } -} - -984 - $SEQUENCE_ä“ -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -¥Œ -, - -985 -a¢_¡ruù_ä“_m‘hod - -m‘hod -) { - -986 -size_t - -edx -; - -987 cÚ¡ -a¢_SEQUENCE_¥ecifics_t - * -¥ecs - = - -988 (cÚ¡ -a¢_SEQUENCE_¥ecifics_t - *) -td --> -¥ecifics -; - -989 -a¢_¡ruù_ùx_t - * -ùx -; - -991 if(! -td - || ! -¥Œ -) - -994 - `ASN_DEBUG -("F»ešg % a SEQUENCE", -td --> -Çme -); - -996  -edx - = 0;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -997 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -998 * -memb_±r -; - -999 if( -–m --> -æags - & -ATF_POINTER -) { - -1000 -memb_±r - = *(**)((*) -¥Œ - + -–m --> -memb_off£t -); - -1001 if( -memb_±r -) - -1002 - `ASN_STRUCT_FREE -(* -–m --> -ty³ -, -memb_±r -); - -1004 -memb_±r - = (*)((*) -¥Œ - + -–m --> -memb_off£t -); - -1005 - `ASN_STRUCT_FREE_CONTENTS_ONLY -(* -–m --> -ty³ -, -memb_±r -); - -1010 -ùx - = ( -a¢_¡ruù_ùx_t - *)((*) -¥Œ - + -¥ecs --> -ùx_off£t -); - -1011 - `FREEMEM -( -ùx --> -±r -); - -1013  -m‘hod -) { - -1014  -ASFM_FREE_EVERYTHING -: - -1015 - `FREEMEM -( -¥Œ -); - -1017  -ASFM_FREE_UNDERLYING -: - -1019  -ASFM_FREE_UNDERLYING_AND_RESET -: - -1020 - `mem£t -( - -1021 -¥Œ -, 0, - -1022 ((cÚ¡ -a¢_SEQUENCE_¥ecifics_t - *)( -td --> -¥ecifics -))-> -¡ruù_size -); - -1025 - } -} - -1028 - $SEQUENCE_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -1029 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -1030 -size_t - -edx -; - -1032 if(! -¥Œ -) { - -1033 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -1035 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -1042  -edx - = 0;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -1043 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -1044 cÚ¡ * -memb_±r -; - -1046 if( -–m --> -æags - & -ATF_POINTER -) { - -1047 -memb_±r - = *(cÚ¡ * cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1048 if(! -memb_±r -) { - -1049 if( -–m --> -ÝtiÚ® -) - -1051 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -1053 -td --> -Çme -, -–m -->Çme, -__FILE__ -, -__LINE__ -); - -1057 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1060 if( -–m --> -’codšg_cÚ¡¿šts -. -g’”®_cÚ¡¿šts -) { - -1061  -»t - = -–m --> -’codšg_cÚ¡¿šts -. - `g’”®_cÚ¡¿šts -Ólm-> -ty³ -, -memb_±r -, - -1062 -ùçžcb -, -­p_key -); - -1063 if( -»t -) „et; - -1065  -–m --> -ty³ --> -’codšg_cÚ¡¿šts -. - `g’”®_cÚ¡¿šts -(elm->type, - -1066 -memb_±r -, -ùçžcb -, -­p_key -); - -1071 - } -} - -1073 #iâdeà -ASN_DISABLE_PER_SUPPORT - - -1075 -a¢_dec_rv®_t - - -1076 - $SEQUENCE_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -1077 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1078 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -1079 -a¢_³r_d©a_t - * -pd -) { - -1080 cÚ¡ -a¢_SEQUENCE_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_SEQUENCE_¥ecifics_ˆ*) -td --> -¥ecifics -; - -1081 * -¡ - = * -¥Œ -; - -1082  -ex»£Á -; - -1083 -ušt8_t - * -Ý»s -; - -1084 -a¢_³r_d©a_t - -Ýmd -; - -1085 -a¢_dec_rv®_t - -rv -; - -1086 -size_t - -edx -; - -1088 () -cÚ¡¿šts -; - -1090 if( - `ASN__STACK_OVERFLOW_CHECK -( -Ýt_codec_ùx -)) - -1091 -ASN__DECODE_FAILED -; - -1093 if(! -¡ -) { - -1094 -¡ - = * -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -1095 if(! -¡ -è -ASN__DECODE_FAILED -; - -1098 - `ASN_DEBUG -("Decodšg % a SEQUENCE (UPER)", -td --> -Çme -); - -1101 if( -¥ecs --> -fœ¡_ex‹nsiÚ - < 0) { - -1102 -ex»£Á - = 0; - -1104 -ex»£Á - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -1105 if( -ex»£Á - < 0è -ASN__DECODE_STARVED -; - -1109 - `mem£t -(& -Ýmd -, 0, (opmd)); - -1110 if( -¥ecs --> -roms_couÁ -) { - -1111 -Ý»s - = ( -ušt8_t - *) - `MALLOC -((( -¥ecs --> -roms_couÁ - + 7) >> 3) + 1); - -1112 if(! -Ý»s -è -ASN__DECODE_FAILED -; - -1114 if( - `³r_g‘_mªy_b™s -( -pd -, -Ý»s -, 0, -¥ecs --> -roms_couÁ -)) { - -1115 - `FREEMEM -( -Ý»s -); - -1116 -ASN__DECODE_STARVED -; - -1118 -Ýmd -. -bufãr - = -Ý»s -; - -1119 -Ýmd -. -nb™s - = -¥ecs --> -roms_couÁ -; - -1120 - `ASN_DEBUG -("Read in…resence bitmap for %s of %d bits (%x..)", - -1121 -td --> -Çme -, -¥ecs --> -roms_couÁ -, * -Ý»s -); - -1123 -Ý»s - = 0; - -1129  -edx - = 0; - -1130 -edx - < ( -¥ecs --> -fœ¡_ex‹nsiÚ - < 0 ? -td --> -–em’ts_couÁ - - -1131 : ( -size_t -) -¥ecs --> -fœ¡_ex‹nsiÚ -); - -1132 -edx -++) { - -1133 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -1134 * -memb_±r -; - -1135 ** -memb_±r2 -; - -1137 - `as£¹ -(! - `IN_EXTENSION_GROUP -( -¥ecs -, -edx -)); - -1140 if( -–m --> -æags - & -ATF_POINTER -) { - -1141 -memb_±r2 - = (**)((*) -¡ - + -–m --> -memb_off£t -); - -1143 -memb_±r - = (*) -¡ - + -–m --> -memb_off£t -; - -1144 -memb_±r2 - = & -memb_±r -; - -1148 if( -–m --> -ÝtiÚ® -) { - -1149  -´e£Á - = - `³r_g‘_ãw_b™s -(& -Ýmd -, 1); - -1150 - `ASN_DEBUG -("Member %s->%s is optional,…=%d (%d->%d)", - -1151 -td --> -Çme -, -–m -->Çme, -´e£Á -, - -1152 () -Ýmd -. -nboff -, ()Ýmd. -nb™s -); - -1153 if( -´e£Á - == 0) { - -1155 if( -–m --> -deçuÉ_v®ue_£t -) { - -1157 if( -–m --> - `deçuÉ_v®ue_£t -( -memb_±r2 -)) { - -1158 - `FREEMEM -( -Ý»s -); - -1159 -ASN__DECODE_FAILED -; - -1161 - `ASN_DEBUG -("Filled-in default"); - -1170 - `ASN_DEBUG -("Decodšg memb” \"%s\" iÀ%s", -–m --> -Çme -, -td -->name); - -1172 if( -–m --> -æags - & -ATF_OPEN_TYPE -) { - -1173 -rv - = - `OPEN_TYPE_u³r_g‘ -( -Ýt_codec_ùx -, -td -, -¡ -, -–m -, -pd -); - -1175 -rv - = -–m --> -ty³ --> -Ý --> - `u³r_decod” -( -Ýt_codec_ùx -,ƒlm->type, - -1176 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, -memb_±r2 -, -pd -); - -1178 if( -rv -. -code - !ð -RC_OK -) { - -1179 - `ASN_DEBUG -("Failed decode %s in %s", - -1180 -–m --> -Çme -, -td -->name); - -1181 - `FREEMEM -( -Ý»s -); - -1182  -rv -; - -1187 - `FREEMEM -( -Ý»s -); - -1192 if( -ex»£Á -) { - -1193 -ssize_t - -bmËngth -; - -1194 -ušt8_t - * -•»s -; - -1195 -a¢_³r_d©a_t - -•md -; - -1197 -bmËngth - = - `u³r_g‘_n¦’gth -( -pd -); - -1198 if( -bmËngth - < 0è -ASN__DECODE_STARVED -; - -1200 - `ASN_DEBUG -("Ex‹nsiÚ %" -ASN_PRI_SSIZE - "…»£Á iÀ%s", -bmËngth -, -td --> -Çme -); - -1202 -•»s - = ( -ušt8_t - *) - `MALLOC -(( -bmËngth - + 15) >> 3); - -1203 if(! -•»s -è -ASN__DECODE_STARVED -; - -1206 if( - `³r_g‘_mªy_b™s -( -pd -, -•»s -, 0, -bmËngth -)) { - -1207 - `FREEMEM -( -•»s -); - -1208 -ASN__DECODE_STARVED -; - -1211 - `mem£t -(& -•md -, 0, (epmd)); - -1212 -•md -. -bufãr - = -•»s -; - -1213 -•md -. -nb™s - = -bmËngth -; - -1214 - `ASN_DEBUG -("Read inƒxtensions bitmap for %s of %ld bits (%x..)", - -1215 -td --> -Çme -, () -bmËngth -, * -•»s -); - -1218  -edx - = -¥ecs --> -fœ¡_ex‹nsiÚ -;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -1219 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -1220 * -memb_±r -; - -1221 ** -memb_±r2 -; - -1222  -´e£Á -; - -1225 if( -–m --> -æags - & -ATF_POINTER -) { - -1226 -memb_±r2 - = (**)((*) -¡ - + -–m --> -memb_off£t -); - -1228 -memb_±r - = (*)((*) -¡ - + -–m --> -memb_off£t -); - -1229 -memb_±r2 - = & -memb_±r -; - -1232 -´e£Á - = - `³r_g‘_ãw_b™s -(& -•md -, 1); - -1233 if( -´e£Á - <= 0) { - -1234 if( -´e£Á - < 0) ; - -1238 - `ASN_DEBUG -("Decodšg memb” % š % %p", -–m --> -Çme -, -td -->name, - -1239 * -memb_±r2 -); - -1240 -rv - = - `u³r_ݒ_ty³_g‘ -( -Ýt_codec_ùx -, -–m --> -ty³ -, - -1241 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, - -1242 -memb_±r2 -, -pd -); - -1243 if( -rv -. -code - !ð -RC_OK -) { - -1244 - `FREEMEM -( -•»s -); - -1245  -rv -; - -1252 - `ASN_DEBUG -("Getting overflowƒxtensions"); - -1253  - `³r_g‘_ãw_b™s -(& -•md -, 1)) { - -1257 if( - `u³r_ݒ_ty³_sk -( -Ýt_codec_ùx -, -pd -)) { - -1258 - `FREEMEM -( -•»s -); - -1259 -ASN__DECODE_STARVED -; - -1261 - `ASN_DEBUG -("Skipped overflowƒxtension"); - -1267 - `FREEMEM -( -•»s -); - -1270 if( -¥ecs --> -fœ¡_ex‹nsiÚ - >= 0) { - -1271  -i -; - -1273  -i - = -¥ecs --> -roms_couÁ -; i < s³cs->roms_couÁ + s³cs-> -aoms_couÁ -; - -1274 -i -++) { - -1275 -a¢_TYPE_memb”_t - * -–m -; - -1276 ** -memb_±r2 -; - -1278 -edx - = -¥ecs --> -oms -[ -i -]; - -1279 -–m - = & -td --> -–em’ts -[ -edx -]; - -1281 if(! -–m --> -deçuÉ_v®ue_£t -) ; - -1284 if( -–m --> -æags - & -ATF_POINTER -) { - -1285 -memb_±r2 - = (**)((*) -¡ - + -–m --> -memb_off£t -); - -1286 if(* -memb_±r2 -) ; - -1292 if( -–m --> - `deçuÉ_v®ue_£t -( -memb_±r2 -)) { - -1293 -ASN__DECODE_FAILED -; - -1298 -rv -. -cÚsumed - = 0; - -1299 -rv -. -code - = -RC_OK -; - -1300  -rv -; - -1301 - } -} - -1304 - $SEQUENCE__hªdË_ex‹nsiÚs -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -1305 -a¢_³r_ou_t - * -po1 -,‡¢_³r_ou_ˆ* -po2 -) { - -1306 cÚ¡ -a¢_SEQUENCE_¥ecifics_t - * -¥ecs - = - -1307 (cÚ¡ -a¢_SEQUENCE_¥ecifics_t - *) -td --> -¥ecifics -; - -1308  -exts_´e£Á - = 0; - -1309  -exts_couÁ - = 0; - -1310 -size_t - -edx -; - -1312 if( -¥ecs --> -fœ¡_ex‹nsiÚ - < 0) { - -1317  -edx - = -¥ecs --> -fœ¡_ex‹nsiÚ -;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -1318 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -1319 cÚ¡ * -memb_±r -; - -1320 cÚ¡ *cÚ¡ * -memb_±r2 -; - -1321  -´e£Á -; - -1324 if( -–m --> -æags - & -ATF_POINTER -) { - -1325 -memb_±r2 - = - -1326 (cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1327 -´e£Á - = (* -memb_±r2 - != 0); - -1329 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1330 -memb_±r2 - = & -memb_±r -; - -1331 -´e£Á - = 1; - -1334 - `ASN_DEBUG -("checkšg %s:% (@%" -ASN_PRI_SIZE - "è´e£Á => %d", -–m --> -Çme -, - -1335 -–m --> -ty³ --> -Çme -, -edx -, -´e£Á -); - -1336 -exts_couÁ -++; - -1337 -exts_´e£Á - +ð -´e£Á -; - -1340 if( -po1 - && - `³r_put_ãw_b™s -Õo1, -´e£Á -, 1)) { - -1344 if( -po2 - && -´e£Á - - -1345 && - `u³r_ݒ_ty³_put -( -–m --> -ty³ -, - -1346 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, - -1347 * -memb_±r2 -, -po2 -)) - -1351  -exts_´e£Á - ? -exts_couÁ - : 0; - -1352 - } -} - -1354 -a¢_’c_rv®_t - - -1355 - $SEQUENCE_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1356 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -1357 -a¢_³r_ou_t - * -po -) { - -1358 cÚ¡ -a¢_SEQUENCE_¥ecifics_t - * -¥ecs - - -1359 ð(cÚ¡ -a¢_SEQUENCE_¥ecifics_t - *) -td --> -¥ecifics -; - -1360 -a¢_’c_rv®_t - -” - = {0,0,0}; - -1361  -n_ex‹nsiÚs -; - -1362 -size_t - -edx -; - -1363 -size_t - -i -; - -1365 () -cÚ¡¿šts -; - -1367 if(! -¥Œ -) - -1368 -ASN__ENCODE_FAILED -; - -1370 -” -. -’coded - = 0; - -1372 - `ASN_DEBUG -("Encodšg % a SEQUENCE (UPER)", -td --> -Çme -); - -1378 if( -¥ecs --> -fœ¡_ex‹nsiÚ - < 0) { - -1379 -n_ex‹nsiÚs - = 0; - -1381 -n_ex‹nsiÚs - = - `SEQUENCE__hªdË_ex‹nsiÚs -( -td -, -¥Œ -, 0, 0); - -1382 if( -n_ex‹nsiÚs - < 0è -ASN__ENCODE_FAILED -; - -1383 if( - `³r_put_ãw_b™s -( -po -, -n_ex‹nsiÚs - ? 1 : 0, 1)) { - -1384 -ASN__ENCODE_FAILED -; - -1389  -i - = 0; i < -¥ecs --> -roms_couÁ -; i++) { - -1390 -a¢_TYPE_memb”_t - * -–m -; - -1391 cÚ¡ * -memb_±r -; - -1392 cÚ¡ *cÚ¡ * -memb_±r2 -; - -1393  -´e£Á -; - -1395 -edx - = -¥ecs --> -oms -[ -i -]; - -1396 -–m - = & -td --> -–em’ts -[ -edx -]; - -1399 if( -–m --> -æags - & -ATF_POINTER -) { - -1400 -memb_±r2 - = - -1401 (cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1402 -´e£Á - = (* -memb_±r2 - != 0); - -1404 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1405 -memb_±r2 - = & -memb_±r -; - -1406 -´e£Á - = 1; - -1410 if( -´e£Á - && -–m --> -deçuÉ_v®ue_cmp - - -1411 && -–m --> - `deçuÉ_v®ue_cmp -(* -memb_±r2 -) == 0) - -1412 -´e£Á - = 0; - -1414 - `ASN_DEBUG -("Element %s %s %s->%s is %s", - -1415 -–m --> -æags - & -ATF_POINTER - ? "ptr" : "inline", - -1416 -–m --> -deçuÉ_v®ue_cmp - ? "def" : "wtv", - -1417 -td --> -Çme -, -–m -->Çme, -´e£Á - ? "present" : "absent"); - -1418 if( - `³r_put_ãw_b™s -( -po -, -´e£Á -, 1)) - -1419 -ASN__ENCODE_FAILED -; - -1425 - `ASN_DEBUG -("fœ¡_ex‹nsiÚ = %d,ƒËm’t ð%d", -¥ecs --> -fœ¡_ex‹nsiÚ -, - -1426 -td --> -–em’ts_couÁ -); - -1427  -edx - = 0; - -1428 -edx - < (( -¥ecs --> -fœ¡_ex‹nsiÚ - < 0è? -td --> -–em’ts_couÁ - - -1429 : ( -size_t -) -¥ecs --> -fœ¡_ex‹nsiÚ -); - -1430 -edx -++) { - -1431 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -1432 cÚ¡ * -memb_±r -; - -1433 cÚ¡ *cÚ¡ * -memb_±r2 -; - -1435 - `ASN_DEBUG -("Abouˆtؒcod%s", -–m --> -ty³ --> -Çme -); - -1438 if( -–m --> -æags - & -ATF_POINTER -) { - -1439 -memb_±r2 - = - -1440 (cÚ¡ *cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1441 if(!* -memb_±r2 -) { - -1442 - `ASN_DEBUG -("EËm’ˆ% %" -ASN_PRI_SIZE - "‚ot…resent", - -1443 -–m --> -Çme -, -edx -); - -1444 if( -–m --> -ÝtiÚ® -) - -1447 -ASN__ENCODE_FAILED -; - -1450 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1451 -memb_±r2 - = & -memb_±r -; - -1455 if( -–m --> -deçuÉ_v®ue_cmp - &&ƒlm-> - `deçuÉ_v®ue_cmp -(* -memb_±r2 -) == 0) - -1458 - `ASN_DEBUG -("Encodšg %s->%s:%s", -td --> -Çme -, -–m -->Çme,ƒlm-> -ty³ -->name); - -1459 -” - = -–m --> -ty³ --> -Ý --> - `u³r_’cod” -( - -1460 -–m --> -ty³ -,ƒlm-> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, * -memb_±r2 -, - -1461 -po -); - -1462 if( -” -. -’coded - == -1) ƒr; - -1466 if(! -n_ex‹nsiÚs -è - `ASN__ENCODED_OK -( -” -); - -1468 - `ASN_DEBUG -("L’gth oàex‹nsiÚ %d b™-m­", -n_ex‹nsiÚs -); - -1470 if( - `u³r_put_n¦’gth -( -po -, -n_ex‹nsiÚs -)) - -1471 -ASN__ENCODE_FAILED -; - -1473 - `ASN_DEBUG -("B™-m­ oà%dƒËm’ts", -n_ex‹nsiÚs -); - -1476 if( - `SEQUENCE__hªdË_ex‹nsiÚs -( -td -, -¥Œ -, -po -, 0è!ð -n_ex‹nsiÚs -) - -1477 -ASN__ENCODE_FAILED -; - -1479 - `ASN_DEBUG -("Wr™šg %dƒx‹nsiÚs", -n_ex‹nsiÚs -); - -1481 if( - `SEQUENCE__hªdË_ex‹nsiÚs -( -td -, -¥Œ -, 0, -po -è!ð -n_ex‹nsiÚs -) - -1482 -ASN__ENCODE_FAILED -; - -1484 - `ASN__ENCODED_OK -( -” -); - -1485 - } -} - -1487 -a¢_dec_rv®_t - - -1488 - $SEQUENCE_decode_­” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -1489 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1490 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -1491 cÚ¡ -a¢_SEQUENCE_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_SEQUENCE_¥ecifics_ˆ*) -td --> -¥ecifics -; - -1492 * -¡ - = * -¥Œ -; - -1493  -ex»£Á -; - -1494 -ušt8_t - * -Ý»s -; - -1495 -a¢_³r_d©a_t - -Ýmd -; - -1496 -a¢_dec_rv®_t - -rv -; - -1497 -size_t - -edx -; - -1499 () -cÚ¡¿šts -; - -1501 if( - `ASN__STACK_OVERFLOW_CHECK -( -Ýt_codec_ùx -)) - -1502 -ASN__DECODE_FAILED -; - -1504 if(! -¡ -) { - -1505 -¡ - = * -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -1506 if(! -¡ -è -ASN__DECODE_FAILED -; - -1509 - `ASN_DEBUG -("Decodšg % a SEQUENCE (APER)", -td --> -Çme -); - -1512 if( -¥ecs --> -fœ¡_ex‹nsiÚ - < 0) { - -1513 -ex»£Á - = 0; - -1515 -ex»£Á - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -1516 if( -ex»£Á - < 0è -ASN__DECODE_STARVED -; - -1520 - `mem£t -(& -Ýmd -, 0, (opmd)); - -1521 if( -¥ecs --> -roms_couÁ -) { - -1522 -Ý»s - = ( -ušt8_t - *) - `MALLOC -((( -¥ecs --> -roms_couÁ - + 7) >> 3) + 1); - -1523 if(! -Ý»s -è -ASN__DECODE_FAILED -; - -1525 if( - `³r_g‘_mªy_b™s -( -pd -, -Ý»s -, 0, -¥ecs --> -roms_couÁ -)) { - -1526 - `FREEMEM -( -Ý»s -); - -1527 -ASN__DECODE_STARVED -; - -1529 -Ýmd -. -bufãr - = -Ý»s -; - -1530 -Ýmd -. -nb™s - = -¥ecs --> -roms_couÁ -; - -1531 - `ASN_DEBUG -("Read in…resence bitmap for %s of %d bits (%x..)", - -1532 -td --> -Çme -, -¥ecs --> -roms_couÁ -, * -Ý»s -); - -1534 -Ý»s - = 0; - -1540  -edx - = 0;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -1541 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -1542 * -memb_±r -; - -1543 ** -memb_±r2 -; - -1545  -·ddšg -; - -1548 if( - `IN_EXTENSION_GROUP -( -¥ecs -, -edx -)) - -1552 if( -–m --> -æags - & -ATF_POINTER -) { - -1553 -memb_±r2 - = (**)((*) -¡ - + -–m --> -memb_off£t -); - -1555 -memb_±r - = (*) -¡ - + -–m --> -memb_off£t -; - -1556 -memb_±r2 - = & -memb_±r -; - -1560 -·ddšg - = (8 - ( -pd --> -moved - % 8)) % 8; - -1561 if( -·ddšg - > 0) - -1562 - `ASN_DEBUG -("F܃Ëm’ˆ%s,off£tð%ld Paddšg b™ ð%d", -td --> -Çme -, -pd --> -moved -, -·ddšg -); - -1564 - `³r_g‘_ãw_b™s -( -pd -, -·ddšg -); - -1566 if( -edx - !ð( -td --> -–em’ts_couÁ --1)) - -1567 - `³r_g‘_ãw_b™s -( -pd -, -·ddšg -); - -1569 if( -¥ecs --> -roms_couÁ - && ( -·ddšg - > 0)) - -1570 - `ASN_DEBUG -(">>>>>‚Ù skpšg…addšg oà%d b™ f܃Ëm’t:%ld ouˆoà%d", -·ddšg -, -edx -, -td --> -–em’ts_couÁ -); - -1572 - `³r_g‘_ãw_b™s -( -pd -, -·ddšg -); - -1577 if( -–m --> -ÝtiÚ® -) { - -1578  -´e£Á - = - `³r_g‘_ãw_b™s -(& -Ýmd -, 1); - -1579 - `ASN_DEBUG -("Member %s->%s is optional,…=%d (%d->%d)", - -1580 -td --> -Çme -, -–m -->Çme, -´e£Á -, - -1581 () -Ýmd -. -nboff -, ()Ýmd. -nb™s -); - -1582 if( -´e£Á - == 0) { - -1584 if( -–m --> -deçuÉ_v®ue_£t -) { - -1586 if( -–m --> - `deçuÉ_v®ue_£t -( -memb_±r2 -)) { - -1587 - `FREEMEM -( -Ý»s -); - -1588 -ASN__DECODE_FAILED -; - -1590 - `ASN_DEBUG -("Filled-in default"); - -1599 - `ASN_DEBUG -("Decodšg memb” \"%s\" iÀ%s", -–m --> -Çme -, -td -->name); - -1601 if( -–m --> -æags - & -ATF_OPEN_TYPE -) { - -1602 -rv - = - `OPEN_TYPE_­”_g‘ -( -Ýt_codec_ùx -, -td -, -¡ -, -–m -, -pd -); - -1604 -rv - = -–m --> -ty³ --> -Ý --> - `­”_decod” -( -Ýt_codec_ùx -,ƒlm->type, - -1605 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, -memb_±r2 -, -pd -); - -1607 if( -rv -. -code - !ð -RC_OK -) { - -1608 - `ASN_DEBUG -("Failed decode %s in %s", - -1609 -–m --> -Çme -, -td -->name); - -1610 - `FREEMEM -( -Ý»s -); - -1611  -rv -; - -1616 - `FREEMEM -( -Ý»s -); - -1621 if( -ex»£Á -) { - -1622 -ssize_t - -bmËngth -; - -1623 -ušt8_t - * -•»s -; - -1624 -a¢_³r_d©a_t - -•md -; - -1626 -bmËngth - = - `­”_g‘_n¦’gth -( -pd -); - -1627 if( -bmËngth - < 0è -ASN__DECODE_STARVED -; - -1629 - `ASN_DEBUG -("Ex‹nsiÚ %" -ASN_PRI_SSIZE - "…»£Á iÀ%s", -bmËngth -, -td --> -Çme -); - -1631 -•»s - = ( -ušt8_t - *) - `MALLOC -(( -bmËngth - + 15) >> 3); - -1632 if(! -•»s -è -ASN__DECODE_STARVED -; - -1635 if( - `³r_g‘_mªy_b™s -( -pd -, -•»s -, 0, -bmËngth -)) - -1636 -ASN__DECODE_STARVED -; - -1638 - `mem£t -(& -•md -, 0, (epmd)); - -1639 -•md -. -bufãr - = -•»s -; - -1640 -•md -. -nb™s - = -bmËngth -; - -1641 - `ASN_DEBUG -("Read inƒxtensions bitmap for %s of %ld bits (%x..)", - -1642 -td --> -Çme -, -bmËngth -, * -•»s -); - -1645  -edx - = -¥ecs --> -fœ¡_ex‹nsiÚ -;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -1646 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -1647 * -memb_±r -; - -1648 ** -memb_±r2 -; - -1649  -´e£Á -; - -1651 if(! - `IN_EXTENSION_GROUP -( -¥ecs -, -edx -)) { - -1652 - `ASN_DEBUG -("%ld i nكx‹nsiÚ", -edx -); - -1657 if( -–m --> -æags - & -ATF_POINTER -) { - -1658 -memb_±r2 - = (**)((*) -¡ - + -–m --> -memb_off£t -); - -1660 -memb_±r - = (*)((*) -¡ - + -–m --> -memb_off£t -); - -1661 -memb_±r2 - = & -memb_±r -; - -1664 -´e£Á - = - `³r_g‘_ãw_b™s -(& -•md -, 1); - -1665 if( -´e£Á - <= 0) { - -1666 if( -´e£Á - < 0) ; - -1670 - `ASN_DEBUG -("Decodšg memb” % š % %p", -–m --> -Çme -, -td -->Çme, * -memb_±r2 -); - -1671 -rv - = - `­”_ݒ_ty³_g‘ -( -Ýt_codec_ùx -, -–m --> -ty³ -, - -1672 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, -memb_±r2 -, -pd -); - -1673 if( -rv -. -code - !ð -RC_OK -) { - -1674 - `FREEMEM -( -•»s -); - -1675  -rv -; - -1682 - `ASN_DEBUG -("Getting overflowƒxtensions"); - -1683  - `³r_g‘_ãw_b™s -(& -•md -, 1)) { - -1689 if( - `­”_ݒ_ty³_sk -( -Ýt_codec_ùx -, -pd -)) { - -1690 - `FREEMEM -( -•»s -); - -1691 -ASN__DECODE_STARVED -; - -1697 - `FREEMEM -( -•»s -); - -1701  -edx - = -¥ecs --> -roms_couÁ -;ƒdx < specs->roms_count - -1702 + -¥ecs --> -aoms_couÁ -; -edx -++) { - -1703 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -1704 ** -memb_±r2 -; - -1706 if(! -–m --> -deçuÉ_v®ue_£t -) ; - -1709 if( -–m --> -æags - & -ATF_POINTER -) { - -1710 -memb_±r2 - = (**)((*) -¡ - - -1711 + -–m --> -memb_off£t -); - -1712 if(* -memb_±r2 -) ; - -1718 if( -–m --> - `deçuÉ_v®ue_£t -( -memb_±r2 -)) { - -1719 -ASN__DECODE_FAILED -; - -1723 -rv -. -cÚsumed - = 0; - -1724 -rv -. -code - = -RC_OK -; - -1725  -rv -; - -1726 - } -} - -1729 - $SEQUENCE_hªdË_ex‹nsiÚs_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1730 cÚ¡ * -¥Œ -, - -1731 -a¢_³r_ou_t - * -po1 -,‡¢_³r_ou_ˆ* -po2 -) { - -1732 cÚ¡ -a¢_SEQUENCE_¥ecifics_t - * -¥ecs - - -1733 ð(cÚ¡ -a¢_SEQUENCE_¥ecifics_t - *) -td --> -¥ecifics -; - -1734  -exts_´e£Á - = 0; - -1735  -exts_couÁ - = 0; - -1736 -size_t - -edx -; - -1738 if( -¥ecs --> -fœ¡_ex‹nsiÚ - < 0) { - -1743  -edx - = -¥ecs --> -fœ¡_ex‹nsiÚ -;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -1744 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -1745 cÚ¡ * -memb_±r -; - -1746 cÚ¡ * cÚ¡ * -memb_±r2 -; - -1747  -´e£Á -; - -1749 if(! - `IN_EXTENSION_GROUP -( -¥ecs -, -edx -)) { - -1750 - `ASN_DEBUG -("% (@%ldèi nكx‹nsiÚ", -–m --> -ty³ --> -Çme -, -edx -); - -1755 if( -–m --> -æags - & -ATF_POINTER -) { - -1756 -memb_±r2 - = (cÚ¡ * cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1757 -´e£Á - = (* -memb_±r2 - != 0); - -1759 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1760 -memb_±r2 - = & -memb_±r -; - -1761 -´e£Á - = 1; - -1764 - `ASN_DEBUG -("checking %s (@%ld)…resent => %d", - -1765 -–m --> -ty³ --> -Çme -, -edx -, -´e£Á -); - -1766 -exts_couÁ -++; - -1767 -exts_´e£Á - +ð -´e£Á -; - -1770 if( -po1 - && - `³r_put_ãw_b™s -Õo1, -´e£Á -, 1)) - -1773 if( -po2 - && -´e£Á - && - `­”_ݒ_ty³_put -( -–m --> -ty³ -, - -1774 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, * -memb_±r2 -, -po2 -)) - -1779  -exts_´e£Á - ? -exts_couÁ - : 0; - -1780 - } -} - -1782 -a¢_’c_rv®_t - - -1783 - $SEQUENCE_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1784 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -1785 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -1786 cÚ¡ -a¢_SEQUENCE_¥ecifics_t - * -¥ecs - - -1787 ð(cÚ¡ -a¢_SEQUENCE_¥ecifics_t - *) -td --> -¥ecifics -; - -1788 -a¢_’c_rv®_t - -” - = {0,0,0}; - -1789  -n_ex‹nsiÚs -; - -1790 -size_t - -edx -; - -1791 -size_t - -i -; - -1793 () -cÚ¡¿šts -; - -1795 if(! -¥Œ -) - -1796 -ASN__ENCODE_FAILED -; - -1798 -” -. -’coded - = 0; - -1800 - `ASN_DEBUG -("Encodšg % a SEQUENCE (APER)", -td --> -Çme -); - -1806 if( -¥ecs --> -fœ¡_ex‹nsiÚ - < 0) { - -1807 -n_ex‹nsiÚs - = 0; - -1809 -n_ex‹nsiÚs - = - `SEQUENCE_hªdË_ex‹nsiÚs_­” -( -td -, -¥Œ -, 0, 0); - -1810 if( -n_ex‹nsiÚs - < 0è -ASN__ENCODE_FAILED -; - -1811 if( - `³r_put_ãw_b™s -( -po -, -n_ex‹nsiÚs - ? 1 : 0, 1)) { - -1812 -ASN__ENCODE_FAILED -; - -1817  -i - = 0; i < -¥ecs --> -roms_couÁ -; i++) { - -1818 -a¢_TYPE_memb”_t - * -–m -; - -1819 cÚ¡ * -memb_±r -; - -1820 cÚ¡ * cÚ¡ * -memb_±r2 -; - -1821  -´e£Á -; - -1823 -edx - = -¥ecs --> -oms -[ -i -]; - -1824 -–m - = & -td --> -–em’ts -[ -edx -]; - -1827 if( -–m --> -æags - & -ATF_POINTER -) { - -1828 -memb_±r2 - = (cÚ¡ * cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1829 -´e£Á - = (* -memb_±r2 - != 0); - -1831 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1832 -memb_±r2 - = & -memb_±r -; - -1833 -´e£Á - = 1; - -1837 if( -´e£Á - && -–m --> -deçuÉ_v®ue_cmp - - -1838 && -–m --> - `deçuÉ_v®ue_cmp -( -memb_±r2 -) == 1) - -1839 -´e£Á - = 0; - -1841 - `ASN_DEBUG -("Element %s %s %s->%s is %s", - -1842 -–m --> -æags - & -ATF_POINTER - ? "ptr" : "inline", - -1843 -–m --> -deçuÉ_v®ue_cmp - ? "def" : "wtv", - -1844 -td --> -Çme -, -–m -->Çme, -´e£Á - ? "present" : "absent"); - -1845 if( - `³r_put_ãw_b™s -( -po -, -´e£Á -, 1)) - -1846 -ASN__ENCODE_FAILED -; - -1852 - `ASN_DEBUG -("fœ¡_ex‹nsiÚ = %d,ƒËm’t ð%d", -¥ecs --> -fœ¡_ex‹nsiÚ -, - -1853 -td --> -–em’ts_couÁ -); - -1854  -edx - = 0; - -1855 -edx - < (( -¥ecs --> -fœ¡_ex‹nsiÚ - < 0è? -td --> -–em’ts_couÁ - - -1856 : ( -size_t -) -¥ecs --> -fœ¡_ex‹nsiÚ -); - -1857 -edx -++) { - -1858 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -1859 cÚ¡ * -memb_±r -; - -1860 cÚ¡ * cÚ¡ * -memb_±r2 -; - -1862 if( - `IN_EXTENSION_GROUP -( -¥ecs -, -edx -)) - -1865 - `ASN_DEBUG -("Abouˆtؒcod%s", -–m --> -ty³ --> -Çme -); - -1868 if( -–m --> -æags - & -ATF_POINTER -) { - -1869 -memb_±r2 - = (cÚ¡ * cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1870 if(!* -memb_±r2 -) { - -1871 - `ASN_DEBUG -("Element %s %ld‚ot…resent", - -1872 -–m --> -Çme -, -edx -); - -1873 if( -–m --> -ÝtiÚ® -) - -1876 -ASN__ENCODE_FAILED -; - -1879 -memb_±r - = (cÚ¡ *)((cÚ¡ *) -¥Œ - + -–m --> -memb_off£t -); - -1880 -memb_±r2 - = & -memb_±r -; - -1884 if( -–m --> -deçuÉ_v®ue_cmp - &&ƒlm-> - `deçuÉ_v®ue_cmp -( -memb_±r2 -) == 1) - -1887 - `ASN_DEBUG -("Encodšg %s->%s", -td --> -Çme -, -–m -->name); - -1888 -” - = -–m --> -ty³ --> -Ý --> - `­”_’cod” -Ólm->ty³,ƒlm-> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, - -1889 * -memb_±r2 -, -po -); - -1890 if( -” -. -’coded - == -1) - -1891  -” -; - -1895 if(! -n_ex‹nsiÚs -è - `ASN__ENCODED_OK -( -” -); - -1897 - `ASN_DEBUG -("L’gth oà%d b™-m­", -n_ex‹nsiÚs -); - -1899 if( - `­”_put_n¦’gth -( -po -, -n_ex‹nsiÚs -)) - -1900 -ASN__ENCODE_FAILED -; - -1902 - `ASN_DEBUG -("B™-m­ oà%dƒËm’ts", -n_ex‹nsiÚs -); - -1905 if( - `SEQUENCE_hªdË_ex‹nsiÚs_­” -( -td -, -¥Œ -, -po -, 0è!ð -n_ex‹nsiÚs -) - -1906 -ASN__ENCODE_FAILED -; - -1908 - `ASN_DEBUG -("Wr™šg %dƒx‹nsiÚs", -n_ex‹nsiÚs -); - -1910 if( - `SEQUENCE_hªdË_ex‹nsiÚs_­” -( -td -, -¥Œ -, 0, -po -è!ð -n_ex‹nsiÚs -) - -1911 -ASN__ENCODE_FAILED -; - -1913 - `ASN__ENCODED_OK -( -” -); - -1914 - } -} - -1919 - $SEQUENCE_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -­Œ -, - -1920 cÚ¡ * -b±r -) { - -1921 -size_t - -edx -; - -1923  -edx - = 0;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -1924 -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -1925 cÚ¡ * -amemb -; - -1926 cÚ¡ * -bmemb -; - -1927  -»t -; - -1929 if( -–m --> -æags - & -ATF_POINTER -) { - -1930 -amemb - = - -1931 *(cÚ¡ *cÚ¡ *)((cÚ¡ *) -­Œ - + -–m --> -memb_off£t -); - -1932 -bmemb - = - -1933 *(cÚ¡ *cÚ¡ *)((cÚ¡ *) -b±r - + -–m --> -memb_off£t -); - -1934 if(! -amemb -) { - -1935 if(! -bmemb -) ; - -1936 if( -–m --> -deçuÉ_v®ue_cmp - - -1937 && -–m --> - `deçuÉ_v®ue_cmp -( -bmemb -) == 0) { - -1942 } if(! -bmemb -) { - -1943 if( -–m --> -deçuÉ_v®ue_cmp - - -1944 && -–m --> - `deçuÉ_v®ue_cmp -( -amemb -) == 0) { - -1951 -amemb - = (cÚ¡ *)((cÚ¡ *) -­Œ - + -–m --> -memb_off£t -); - -1952 -bmemb - = (cÚ¡ *)((cÚ¡ *) -b±r - + -–m --> -memb_off£t -); - -1955 -»t - = -–m --> -ty³ --> -Ý --> - `com·»_¡ruù -Ólm->ty³, -amemb -, -bmemb -); - -1956 if( -»t - != 0) „et; - -1960 - } -} - -1962 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_SEQUENCE - = { - -1963 -SEQUENCE_ä“ -, - -1964 -SEQUENCE_´št -, - -1965 -SEQUENCE_com·» -, - -1966 -SEQUENCE_decode_b” -, - -1967 -SEQUENCE_’code_d” -, - -1968 -SEQUENCE_decode_x” -, - -1969 -SEQUENCE_’code_x” -, - -1970 #ifdef -ASN_DISABLE_OER_SUPPORT - - -1974 -SEQUENCE_decode_Ûr -, - -1975 -SEQUENCE_’code_Ûr -, - -1977 #ifdeà -ASN_DISABLE_PER_SUPPORT - - -1983 -SEQUENCE_decode_u³r -, - -1984 -SEQUENCE_’code_u³r -, - -1985 -SEQUENCE_decode_­” -, - -1986 -SEQUENCE_’code_­” -, - -1988 -SEQUENCE_¿ndom_fžl -, - -1993 -a¢_¿ndom_fžl_»suÉ_t - - -1994 - $SEQUENCE_¿ndom_fžl -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -1995 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡r -, - -1996 -size_t - -max_Ëngth -) { - -1997 cÚ¡ -a¢_SEQUENCE_¥ecifics_t - * -¥ecs - = - -1998 (cÚ¡ -a¢_SEQUENCE_¥ecifics_t - *) -td --> -¥ecifics -; - -1999 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_ok - = { -ARFILL_OK -, 0}; - -2000 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_çžed - = { -ARFILL_FAILED -, 0}; - -2001 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_sk³d - = { -ARFILL_SKIPPED -, 0}; - -2002 * -¡ - = * -¥Œ -; - -2003 -size_t - -edx -; - -2005 if( -max_Ëngth - =ð0è -»suÉ_sk³d -; - -2007 () -cÚ¡r -; - -2009 if( -¡ - =ð -NULL -) { - -2010 -¡ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -2011 if( -¡ - =ð -NULL -) { - -2012  -»suÉ_çžed -; - -2016  -edx - = 0;ƒdx < -td --> -–em’ts_couÁ -;ƒdx++) { - -2017 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = & -td --> -–em’ts -[ -edx -]; - -2018 * -memb_±r -; - -2019 ** -memb_±r2 -; - -2020 -a¢_¿ndom_fžl_»suÉ_t - -tm´es -; - -2022 if( -–m --> -ÝtiÚ® - && - `a¢_¿ndom_b‘w“n -(0, 4) == 2) { - -2027 if( -–m --> -æags - & -ATF_POINTER -) { - -2029 -memb_±r2 - = (**)((*) -¡ - + -–m --> -memb_off£t -); - -2031 -memb_±r - = (*) -¡ - + -–m --> -memb_off£t -; - -2032 -memb_±r2 - = & -memb_±r -; - -2035 -tm´es - = -–m --> -ty³ --> -Ý --> - `¿ndom_fžl -( - -2036 -–m --> -ty³ -, -memb_±r2 -, &–m-> -’codšg_cÚ¡¿šts -, - -2037 -max_Ëngth - > -»suÉ_ok -. -Ëngth - ? max_length -„esult_ok.length : 0); - -2038  -tm´es -. -code -) { - -2039  -ARFILL_OK -: - -2040 -»suÉ_ok -. -Ëngth - +ð -tm´es -.length; - -2042  -ARFILL_SKIPPED -: - -2043 - `as£¹ -(!( -–m --> -æags - & -ATF_POINTER -è|| * -memb_±r2 - =ð -NULL -); - -2045  -ARFILL_FAILED -: - -2046 if( -¡ - =ð* -¥Œ -) { - -2047 - `ASN_STRUCT_RESET -(* -td -, -¡ -); - -2049 - `ASN_STRUCT_FREE -(* -td -, -¡ -); - -2051  -tm´es -; - -2055 * -¥Œ - = -¡ -; - -2057  -»suÉ_ok -; - -2058 - } -} - - @constr_SEQUENCE_OF.c - -6  - ~ - -7  - ~ - -8  - ~ - -13 -a¢_’c_rv®_t - - -14 - $SEQUENCE_OF_’code_d” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -±r -, - -15  -g_mode -, -b”_Žv_g_t - -g -, - -16 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -17 -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -18 cÚ¡ -a¢_ªÚymous_£qu’û_ - * -li¡ - = - `_A_CSEQUENCE_FROM_VOID -( -±r -); - -19 -size_t - -compu‹d_size - = 0; - -20 -ssize_t - -’codšg_size - = 0; - -21 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -22  -edx -; - -24 - `ASN_DEBUG -("E¡im©šg sizoàSEQUENCE OF %s", -td --> -Çme -); - -29  -edx - = 0;ƒdx < -li¡ --> -couÁ -;ƒdx++) { - -30 * -memb_±r - = -li¡ --> -¬¿y -[ -edx -]; - -31 if(! -memb_±r -) ; - -32 -”v® - = -–m --> -ty³ --> -Ý --> - `d”_’cod” -Ólm->ty³, -memb_±r -, - -33 0, -–m --> -g -, - -35 if( -”v® -. -’coded - == -1) - -36  -”v® -; - -37 -compu‹d_size - +ð -”v® -. -’coded -; - -43 -’codšg_size - = - `d”_wr™e_gs -( -td -, -compu‹d_size -, -g_mode -, 1, -g -, - -44 -cb -, -­p_key -); - -45 if( -’codšg_size - == -1) { - -46 -”v® -. -’coded - = -1; - -47 -”v® -. -çžed_ty³ - = -td -; - -48 -”v® -. -¡ruùu»_±r - = -±r -; - -49  -”v® -; - -52 -compu‹d_size - +ð -’codšg_size -; - -53 if(! -cb -) { - -54 -”v® -. -’coded - = -compu‹d_size -; - -55 - `ASN__ENCODED_OK -( -”v® -); - -58 - `ASN_DEBUG -("Encodšg memb” oàSEQUENCE OF %s", -td --> -Çme -); - -63  -edx - = 0;ƒdx < -li¡ --> -couÁ -;ƒdx++) { - -64 * -memb_±r - = -li¡ --> -¬¿y -[ -edx -]; - -65 if(! -memb_±r -) ; - -66 -”v® - = -–m --> -ty³ --> -Ý --> - `d”_’cod” -Ólm->ty³, -memb_±r -, - -67 0, -–m --> -g -, - -68 -cb -, -­p_key -); - -69 if( -”v® -. -’coded - == -1) - -70  -”v® -; - -71 -’codšg_size - +ð -”v® -. -’coded -; - -74 if( -compu‹d_size - !ð( -size_t -) -’codšg_size -) { - -78 -”v® -. -’coded - = -1; - -79 -”v® -. -çžed_ty³ - = -td -; - -80 -”v® -. -¡ruùu»_±r - = -±r -; - -82 -”v® -. -’coded - = -compu‹d_size -; - -83 -”v® -. -¡ruùu»_±r - = 0; - -84 -”v® -. -çžed_ty³ - = 0; - -87  -”v® -; - -88 - } -} - -90 -a¢_’c_rv®_t - - -91 - $SEQUENCE_OF_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -92  -žev– -, -x”_’cod”_æags_e - -æags -, - -93 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -94 -a¢_’c_rv®_t - -” - = {0,0,0}; - -95 cÚ¡ -a¢_SET_OF_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_SET_OF_¥ecifics_ˆ*) -td --> -¥ecifics -; - -96 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -97 cÚ¡ -a¢_ªÚymous_£qu’û_ - * -li¡ - = - `_A_CSEQUENCE_FROM_VOID -( -¥Œ -); - -98 cÚ¡ * -mÇme - = -¥ecs --> -as_XMLV®ueLi¡ - - -100 : ((* -–m --> -Çme -è?ƒlm->Çm:ƒlm-> -ty³ --> -xml_g -); - -101 -size_t - -mËn - = -mÇme - ? - `¡¾’ -(mname) : 0; - -102  -xÿn - = ( -æags - & -XER_F_CANONICAL -); - -103  -i -; - -105 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -107 -” -. -’coded - = 0; - -109  -i - = 0; i < -li¡ --> -couÁ -; i++) { - -110 -a¢_’c_rv®_t - -tm³r - = {0,0,0}; - -111 * -memb_±r - = -li¡ --> -¬¿y -[ -i -]; - -112 if(! -memb_±r -) ; - -114 if( -mÇme -) { - -115 if(! -xÿn -è - `ASN__TEXT_INDENT -(1, -žev– -); - -116 - `ASN__CALLBACK3 -("<", 1, -mÇme -, -mËn -, ">", 1); - -119 -tm³r - = -–m --> -ty³ --> -Ý --> - `x”_’cod” -Ólm->ty³, -memb_±r -, -žev– - + 1, - -120 -æags -, -cb -, -­p_key -); - -121 if( -tm³r -. -’coded - == -1) mper; - -122 -” -. -’coded - +ð -tm³r -.encoded; - -123 if( -tm³r -. -’coded - =ð0 && -¥ecs --> -as_XMLV®ueLi¡ -) { - -124 cÚ¡ * -Çme - = -–m --> -ty³ --> -xml_g -; - -125 -size_t - -Ën - = - `¡¾’ -( -Çme -); - -126 if(! -xÿn -è - `ASN__TEXT_INDENT -(1, -žev– - + 1); - -127 - `ASN__CALLBACK3 -("<", 1, -Çme -, -Ën -, "/>", 2); - -130 if( -mÇme -) { - -131 - `ASN__CALLBACK3 -("", 1); - -135 if(! -xÿn -è - `ASN__TEXT_INDENT -(1, -žev– - - 1); - -137 - `ASN__ENCODED_OK -( -” -); - -138 -cb_çžed -: - -139 -ASN__ENCODE_FAILED -; - -140 - } -} - -142 #iâdeà -ASN_DISABLE_PER_SUPPORT - - -144 -a¢_’c_rv®_t - - -145 - $SEQUENCE_OF_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -146 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -147 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -148 cÚ¡ -a¢_ªÚymous_£qu’û_ - * -li¡ -; - -149 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -150 -a¢_’c_rv®_t - -” - = {0,0,0}; - -151 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -152 -size_t - -’coded_edx -; - -154 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -155 -li¡ - = - `_A_CSEQUENCE_FROM_VOID -( -¥Œ -); - -157 -” -. -’coded - = 0; - -159 - `ASN_DEBUG -("Encodšg % a SEQUENCE OF (%d)", -td --> -Çme -, -li¡ --> -couÁ -); - -161 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -size -; - -162 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -163 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -size -; - -164 -ù - = 0; - -167 if( -ù -) { - -168  -nÙ_š_roÙ - = - -169 ( -li¡ --> -couÁ - < -ù --> -low”_bound - ||†i¡->couÁ > ct-> -uµ”_bound -); - -170 - `ASN_DEBUG -("lb %ld ub %ld %s", -ù --> -low”_bound -, ct-> -uµ”_bound -, - -171 -ù --> -æags - & -APC_EXTENSIBLE - ? "ext" : "fix"); - -172 if( -ù --> -æags - & -APC_EXTENSIBLE -) { - -174 if( - `³r_put_ãw_b™s -( -po -, -nÙ_š_roÙ -, 1)è -ASN__ENCODE_FAILED -; - -175 if( -nÙ_š_roÙ -è -ù - = 0; - -176 } if( -nÙ_š_roÙ - && -ù --> -efãùive_b™s - >= 0) { - -177 -ASN__ENCODE_FAILED -; - -182 if( -ù - && ct-> -efãùive_b™s - >= 0) { - -184 if( - `³r_put_ãw_b™s -( -po -, -li¡ --> -couÁ - - -ù --> -low”_bound -, - -185 -ù --> -efãùive_b™s -)) - -186 -ASN__ENCODE_FAILED -; - -187 } if( -li¡ --> -couÁ - == 0) { - -191 ià( - `u³r_put_Ëngth -( -po -, 0, 0)) { - -192 -ASN__ENCODE_FAILED -; - -194 - `ASN__ENCODED_OK -( -” -); - -197  -’coded_edx - = 0; ( -ssize_t -ëncoded_edx < -li¡ --> -couÁ -;) { - -198 -ssize_t - -may_’code -; - -199 -size_t - -edx -; - -200  -Ãed_eom - = 0; - -202 if( -ù - && ct-> -efãùive_b™s - >= 0) { - -203 -may_’code - = -li¡ --> -couÁ -; - -205 -may_’code - = - -206 - `u³r_put_Ëngth -( -po -, -li¡ --> -couÁ - - -’coded_edx -, & -Ãed_eom -); - -207 if( -may_’code - < 0è -ASN__ENCODE_FAILED -; - -210  -edx - = -’coded_edx -;ƒdx <ƒncoded_edx + -may_’code -;ƒdx++) { - -211 * -memb_±r - = -li¡ --> -¬¿y -[ -edx -]; - -212 if(! -memb_±r -è -ASN__ENCODE_FAILED -; - -213 -” - = -–m --> -ty³ --> -Ý --> - `u³r_’cod” -( - -214 -–m --> -ty³ -,ƒlm-> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, -memb_±r -, - -215 -po -); - -216 if( -” -. -’coded - =ð-1è -ASN__ENCODE_FAILED -; - -219 if( -Ãed_eom - && - `u³r_put_Ëngth -( -po -, 0, 0)) - -220 -ASN__ENCODE_FAILED -; - -222 -’coded_edx - +ð -may_’code -; - -225 - `ASN__ENCODED_OK -( -” -); - -226 - } -} - -228 -a¢_’c_rv®_t - - -229 - $SEQUENCE_OF_’code_­” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -230 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -231 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -232 cÚ¡ -a¢_ªÚymous_£qu’û_ - * -li¡ -; - -233 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -234 -a¢_’c_rv®_t - -” - = {0,0,0}; - -235 -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -236  -£q -; - -238 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -239 -li¡ - = - `_A_CSEQUENCE_FROM_VOID -( -¥Œ -); - -241 -” -. -’coded - = 0; - -243 - `ASN_DEBUG -("Encodšg % a SEQUENCE OF siz(%dèusšg ALIGNED PER", -td --> -Çme -, -li¡ --> -couÁ -); - -245 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -size -; - -246 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -247 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -size -; - -248 -ù - = 0; - -251 if( -ù -) { - -252  -nÙ_š_roÙ - = ( -li¡ --> -couÁ - < -ù --> -low”_bound - - -253 || -li¡ --> -couÁ - > -ù --> -uµ”_bound -); - -254 - `ASN_DEBUG -("lb %ld ub %ld %s", - -255 -ù --> -low”_bound -, ct-> -uµ”_bound -, - -256 -ù --> -æags - & -APC_EXTENSIBLE - ? "ext" : "fix"); - -257 if( -ù --> -æags - & -APC_EXTENSIBLE -) { - -259 if( - `³r_put_ãw_b™s -( -po -, -nÙ_š_roÙ -, 1)) - -260 -ASN__ENCODE_FAILED -; - -261 if( -nÙ_š_roÙ -è -ù - = 0; - -262 } if( -nÙ_š_roÙ - && -ù --> -efãùive_b™s - >= 0) - -263 -ASN__ENCODE_FAILED -; - -266 if( -ù - && ct-> -efãùive_b™s - >= 0) { - -272 ià( - `­”_put_Ëngth -( -po -, -ù --> -uµ”_bound - - ct-> -low”_bound - + 1, -li¡ --> -couÁ - - ct->lower_bound) < 0) - -273 -ASN__ENCODE_FAILED -; - -276  -£q - = -1; seq < -li¡ --> -couÁ -;) { - -277 -ssize_t - -mayEncode -; - -278 if( -£q - < 0) seq = 0; - -279 if( -ù - && ct-> -efãùive_b™s - >= 0) { - -280 -mayEncode - = -li¡ --> -couÁ -; - -282 -mayEncode - = - `­”_put_Ëngth -( -po -, -1, -li¡ --> -couÁ - - -£q -); - -283 if( -mayEncode - < 0è -ASN__ENCODE_FAILED -; - -286  -mayEncode ---) { - -287 * -memb_±r - = -li¡ --> -¬¿y -[ -£q -++]; - -288 if(! -memb_±r -è -ASN__ENCODE_FAILED -; - -289 -” - = -–m --> -ty³ --> -Ý --> - `­”_’cod” -(elm->type, - -290 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, -memb_±r -, -po -); - -291 if( -” -. -’coded - == -1) - -292 -ASN__ENCODE_FAILED -; - -296 - `ASN__ENCODED_OK -( -” -); - -297 - } -} - -301 - $SEQUENCE_OF_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -­Œ -, - -302 cÚ¡ * -b±r -) { - -303 cÚ¡ -a¢_ªÚymous_£qu’û_ - * -a - = - `_A_CSEQUENCE_FROM_VOID -( -­Œ -); - -304 cÚ¡ -a¢_ªÚymous_£qu’û_ - * -b - = - `_A_CSEQUENCE_FROM_VOID -( -b±r -); - -305 -ssize_t - -idx -; - -307 if( -a - && -b -) { - -308 -ssize_t - -commÚ_Ëngth - = ( -a --> -couÁ - < -b -->count ?‡->count : b->count); - -309  -idx - = 0; idx < -commÚ_Ëngth -; idx++) { - -310  -»t - = -td --> -–em’ts --> -ty³ --> -Ý --> - `com·»_¡ruù -( - -311 -td --> -–em’ts --> -ty³ -, -a --> -¬¿y -[ -idx -], -b -->array[idx]); - -312 if( -»t -) „et; - -315 if( -idx - < -b --> -couÁ -) - -317 if( -idx - < -a --> -couÁ -)  1; - -319 } if(! -a -) { - -321 } if(! -b -) { - -326 - } -} - -329 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_SEQUENCE_OF - = { - -330 -SEQUENCE_OF_ä“ -, - -331 -SEQUENCE_OF_´št -, - -332 -SEQUENCE_OF_com·» -, - -333 -SEQUENCE_OF_decode_b” -, - -334 -SEQUENCE_OF_’code_d” -, - -335 -SEQUENCE_OF_decode_x” -, - -336 -SEQUENCE_OF_’code_x” -, - -337 #ifdef -ASN_DISABLE_OER_SUPPORT - - -341 -SEQUENCE_OF_decode_Ûr -, - -342 -SEQUENCE_OF_’code_Ûr -, - -344 #ifdeà -ASN_DISABLE_PER_SUPPORT - - -350 -SEQUENCE_OF_decode_u³r -, - -351 -SEQUENCE_OF_’code_u³r -, - -352 -SEQUENCE_OF_decode_­” -, - -353 -SEQUENCE_OF_’code_­” -, - -355 -SEQUENCE_OF_¿ndom_fžl -, - - @constr_SET_OF.c - -6  - ~ - -7  - ~ - -8  - ~ - -15  - #LEFT - (( -size -<( -size_t -) -ùx --> -Ëá -)?size:(size_t)ùx->Ëá) - - ) - -28  - #SIZE_VIOLATION - ( -ùx --> -Ëá - >ð0 && ( -size_t -)ùx->Ëá <ð -size -) - - ) - -34 #undeà -ADVANCE - - -35  - #ADVANCE -( -num_by‹s -) do { \ - -36 -size_t - -num - = -num_by‹s -; \ - -37 -±r - = ((cÚ¡ *íŒè+ -num -;\ - -38 -size - -ð -num -; \ - -39 if( -ùx --> -Ëá - >= 0) \ - -40 -ùx --> -Ëá - -ð -num -; \ - -41 -cÚsumed_my£lf - +ð -num -; \ - -42 } 0) - - ) - -47 #undeà -NEXT_PHASE - - -48 #undeà -PHASE_OUT - - -49  - #NEXT_PHASE -( -ùx -) do { \ - -50 -ùx --> -pha£ -++; \ - -51 -ùx --> -¡• - = 0; \ - -52 } 0) - - ) - -53  - #PHASE_OUT -( -ùx -èdØ{ ctx-> -pha£ - = 10; } 0) - - ) - -58 #undeà -RETURN - - -59  - #RETURN -( -_code -) do { \ - -60 -rv® -. -code - = -_code -; \ - -61 -rv® -. -cÚsumed - = -cÚsumed_my£lf -;\ - -62  -rv® -; \ - -63 } 0) - - ) - -68 -a¢_dec_rv®_t - - -69 - $SET_OF_decode_b” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -70 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¡ruù_±r -, - -71 cÚ¡ * -±r -, -size_t - -size -,  -g_mode -) { - -75 cÚ¡ -a¢_SET_OF_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_SET_OF_¥ecifics_ˆ*) -td --> -¥ecifics -; - -76 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -81 * -¡ - = * -¡ruù_±r -; - -82 -a¢_¡ruù_ùx_t - * -ùx -; - -84 -b”_Žv_g_t - -Žv_g -; - -85 -a¢_dec_rv®_t - -rv® -; - -87 -ssize_t - -cÚsumed_my£lf - = 0; - -89 - `ASN_DEBUG -("Decodšg % a SET OF", -td --> -Çme -); - -94 if( -¡ - == 0) { - -95 -¡ - = * -¡ruù_±r - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -96 if( -¡ - == 0) { - -97 - `RETURN -( -RC_FAIL -); - -104 -ùx - = ( -a¢_¡ruù_ùx_t - *)((*) -¡ - + -¥ecs --> -ùx_off£t -); - -109  -ùx --> -pha£ -) { - -117 -rv® - = - `b”_check_gs -( -Ýt_codec_ùx -, -td -, -ùx -, -±r -, -size -, - -118 -g_mode -, 1, & -ùx --> -Ëá -, 0); - -119 if( -rv® -. -code - !ð -RC_OK -) { - -120 - `ASN_DEBUG -("%sagging check failed: %d", - -121 -td --> -Çme -, -rv® -. -code -); - -122  -rv® -; - -125 if( -ùx --> -Ëá - >= 0) - -126 -ùx --> -Ëá - +ð -rv® -. -cÚsumed -; - -127 - `ADVANCE -( -rv® -. -cÚsumed -); - -129 - `ASN_DEBUG -("Structure consumes %ld bytes, " - -130 "bufã¸%ld", () -ùx --> -Ëá -, () -size -); - -132 - `NEXT_PHASE -( -ùx -); - -140 ;; -ùx --> -¡• - = 0) { - -141 -ssize_t - -g_Ën -; - -143 if( -ùx --> -¡• - & 1) - -144  -miüÝha£2 -; - -150 if( -ùx --> -Ëá - == 0) { - -151 - `ASN_DEBUG -("End oàSET OF %s", -td --> -Çme -); - -156 - `PHASE_OUT -( -ùx -); - -157 - `RETURN -( -RC_OK -); - -163 -g_Ën - = - `b”_ãtch_g -( -±r -, -LEFT -, & -Žv_g -); - -164  -g_Ën -) { - -165 0: if(! -SIZE_VIOLATION -è - `RETURN -( -RC_WMORE -); - -167 -1: - `RETURN -( -RC_FAIL -); - -170 if( -ùx --> -Ëá - < 0 && ((cÚ¡ -ušt8_t - *) -±r -)[0] == 0) { - -171 if( -LEFT - < 2) { - -172 if( -SIZE_VIOLATION -) - -173 - `RETURN -( -RC_FAIL -); - -175 - `RETURN -( -RC_WMORE -); - -176 } if(((cÚ¡ -ušt8_t - *) -±r -)[1] == 0) { - -186 if( -–m --> -g - !ð( -b”_Žv_g_t -)-1) { - -187 if( - `BER_TAGS_EQUAL -( -Žv_g -, -–m --> -g -)) { - -192 - `ASN_DEBUG -("Unexpectedag %s fixed SET OF %s", - -193 - `b”_Žv_g_¡ršg -( -Žv_g -), -td --> -Çme -); - -194 - `ASN_DEBUG -("%s SET OF hasag %s", - -195 -td --> -Çme -, - `b”_Žv_g_¡ršg -( -–m --> -g -)); - -196 - `RETURN -( -RC_FAIL -); - -203 -ùx --> -¡• - |= 1; - -204 -miüÝha£2 -: - -209 -rv® - = -–m --> -ty³ --> -Ý --> - `b”_decod” -( -Ýt_codec_ùx -, - -210 -–m --> -ty³ -, & -ùx --> -±r -,…Œ, -LEFT -, 0); - -211 - `ASN_DEBUG -("In %s SET OF %s code %d consumed %d", - -212 -td --> -Çme -, -–m --> -ty³ -->name, - -213 -rv® -. -code -, (ìv®. -cÚsumed -); - -214  -rv® -. -code -) { - -215  -RC_OK -: - -217 -a¢_ªÚymous_£t_ - * -li¡ - = - `_A_SET_FROM_VOID -( -¡ -); - -218 if( - `ASN_SET_ADD -( -li¡ -, -ùx --> -±r -) != 0) - -219 - `RETURN -( -RC_FAIL -); - -221 -ùx --> -±r - = 0; - -224  -RC_WMORE -: - -225 if(! -SIZE_VIOLATION -) { - -226 - `ADVANCE -( -rv® -. -cÚsumed -); - -227 - `RETURN -( -RC_WMORE -); - -230  -RC_FAIL -: - -231 - `ASN_STRUCT_FREE -(* -–m --> -ty³ -, -ùx --> -±r -); - -232 -ùx --> -±r - = 0; - -233 - `RETURN -( -RC_FAIL -); - -236 - `ADVANCE -( -rv® -. -cÚsumed -); - -239 - `NEXT_PHASE -( -ùx -); - -244  -ùx --> -Ëá - < 0) { - -245 if( -LEFT - < 2) { - -246 if( -LEFT - > 0 && ((cÚ¡ *) -±r -)[0] != 0) { - -248 - `RETURN -( -RC_FAIL -); - -250 - `RETURN -( -RC_WMORE -); - -253 if(((cÚ¡ *) -±r -)[0] == 0 - -254 && ((cÚ¡ *) -±r -)[1] == 0) { - -255 - `ADVANCE -(2); - -256 -ùx --> -Ëá -++; - -258 - `RETURN -( -RC_FAIL -); - -262 - `PHASE_OUT -( -ùx -); - -265 - `RETURN -( -RC_OK -); - -266 - } -} - -271  - s_–_bufãr - { - -272 -ušt8_t - * - mbuf -; - -273 -size_t - - mËngth -; - -274 -size_t - - m®loÿ‹d_size -; - -275  - mb™s_unu£d -; - -278  - $_–_addby‹s -(cÚ¡ * -bufãr -, -size_t - -size -, * -–_buf_±r -) { - -279  -_–_bufãr - * -–_buf - = (_–_bufã¸*) -–_buf_±r -; - -281 if( -–_buf --> -Ëngth - + -size - >ƒl_buf-> -®loÿ‹d_size -) { - -282 -size_t - -Ãw_size - = -–_buf --> -®loÿ‹d_size - ?ƒl_buf->allocated_size : 8; - -283 * -p -; - -286 -Ãw_size - <<= 2; - -287 }  -–_buf --> -Ëngth - + -size - > -Ãw_size -); - -289 -p - = - `REALLOC -( -–_buf --> -buf -, -Ãw_size -); - -290 if( -p -) { - -291 -–_buf --> -buf - = -p -; - -292 -–_buf --> -®loÿ‹d_size - = -Ãw_size -; - -298 - `memýy -( -–_buf --> -buf - +ƒl_buf-> -Ëngth -, -bufãr -, -size -); - -300 -–_buf --> -Ëngth - +ð -size -; - -302 - } -} - -304  - $as£¹_unu£d_b™s -(cÚ¡  -_–_bufãr -* -p -) { - -305 if( -p --> -Ëngth -) { - -306 - `as£¹ -(( -p --> -buf -[p-> -Ëngth --1] & ~(0xfà<<…-> -b™s_unu£d -)) == 0); - -308 - `as£¹ -( -p --> -b™s_unu£d - == 0); - -310 - } -} - -312  - $_–_buf_cmp -(cÚ¡ * -­ -, cÚ¡ * -bp -) { - -313 cÚ¡  -_–_bufãr - * -a - = (cÚ¡ _–_bufã¸*) -­ -; - -314 cÚ¡  -_–_bufãr - * -b - = (cÚ¡ _–_bufã¸*) -bp -; - -315 -size_t - -commÚ_Ën -; - -316  -»t - = 0; - -318 if( -a --> -Ëngth - < -b -->length) - -319 -commÚ_Ën - = -a --> -Ëngth -; - -321 -commÚ_Ën - = -b --> -Ëngth -; - -323 ià( -a --> -buf - && -b -->buf) { - -324 -»t - = - `memcmp -( -a --> -buf -, -b -->buf, -commÚ_Ën -); - -326 if( -»t - == 0) { - -327 if( -a --> -Ëngth - < -b -->length) - -328 -»t - = -1; - -329 if( -a --> -Ëngth - > -b -->length) - -330 -»t - = 1; - -332 - `as£¹_unu£d_b™s -( -a -); - -333 - `as£¹_unu£d_b™s -( -b -); - -336  -»t -; - -337 - } -} - -340 - $SET_OF__’code_s܋d_ä“ -( -_–_bufãr - * -–_buf -, -size_t - -couÁ -) { - -341 -size_t - -i -; - -343  -i - = 0; i < -couÁ -; i++) { - -344 - `FREEMEM -( -–_buf -[ -i -]. -buf -); - -347 - `FREEMEM -( -–_buf -); - -348 - } -} - -350 - eSET_OF__’code_m‘hod - { - -351 - mSOES_DER -, - -352 - mSOES_CUPER - - -355  -_–_bufãr - * - -356 - $SET_OF__’code_s܋d -(cÚ¡ -a¢_TYPE_memb”_t - * -–m -, - -357 cÚ¡ -a¢_ªÚymous_£t_ - * -li¡ -, - -358 -SET_OF__’code_m‘hod - -m‘hod -) { - -359  -_–_bufãr - * -’coded_–s -; - -360  -edx -; - -362 -’coded_–s - = - -363 ( -_–_bufãr - *) - `CALLOC -( -li¡ --> -couÁ -, ( -’coded_–s -[0])); - -364 if( -’coded_–s - =ð -NULL -) { - -365  -NULL -; - -371  -edx - = 0;ƒdx < -li¡ --> -couÁ -;ƒdx++) { - -372 cÚ¡ * -memb_±r - = -li¡ --> -¬¿y -[ -edx -]; - -373  -_–_bufãr - * -’codšg_– - = & -’coded_–s -[ -edx -]; - -374 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -376 if(! -memb_±r -) ; - -381  -m‘hod -) { - -382  -SOES_DER -: - -383 -”v® - = -–m --> -ty³ --> -Ý --> - `d”_’cod” -Ólm->ty³, -memb_±r -, 0,ƒlm-> -g -, - -384 -_–_addby‹s -, -’codšg_– -); - -386  -SOES_CUPER -: - -387 -”v® - = - `u³r_’code -( -–m --> -ty³ -, - -388 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, - -389 -memb_±r -, -_–_addby‹s -, -’codšg_– -); - -390 if( -”v® -. -’coded - != -1) { - -391 -size_t - -exŒa_b™s - = -”v® -. -’coded - % 8; - -392 - `as£¹ -( -’codšg_– --> -Ëngth - =ð( -size_t -)( -”v® -. -’coded - + 7) / 8); - -393 -’codšg_– --> -b™s_unu£d - = (8 - -exŒa_b™s -) & 0x7; - -397 - `as£¹ -(!"Unreachable"); - -400 if( -”v® -. -’coded - < 0) ; - -403 if( -edx - =ð -li¡ --> -couÁ -) { - -407 - `qsÜt -( -’coded_–s -, -li¡ --> -couÁ -, Óncoded_–s[0]), -_–_buf_cmp -); - -409  -’coded_–s -; - -411 - `SET_OF__’code_s܋d_ä“ -( -’coded_–s -, -edx -); - -412  -NULL -; - -414 - } -} - -420 -a¢_’c_rv®_t - - -421 - $SET_OF_’code_d” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -422  -g_mode -, -b”_Žv_g_t - -g -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -423 * -­p_key -) { - -424 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -425 cÚ¡ -a¢_ªÚymous_£t_ - * -li¡ - = - `_A_CSET_FROM_VOID -( -¥Œ -); - -426 -size_t - -compu‹d_size - = 0; - -427 -ssize_t - -’codšg_size - = 0; - -428  -_–_bufãr - * -’coded_–s -; - -429  -edx -; - -431 - `ASN_DEBUG -("E¡im©šg sizfÜ SET OF %s", -td --> -Çme -); - -436  -edx - = 0;ƒdx < -li¡ --> -couÁ -;ƒdx++) { - -437 * -memb_±r - = -li¡ --> -¬¿y -[ -edx -]; - -438 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -440 if(! -memb_±r -è -ASN__ENCODE_FAILED -; - -442 -”v® - = - -443 -–m --> -ty³ --> -Ý --> - `d”_’cod” -Ólm->ty³, -memb_±r -, 0,ƒlm-> -g -, 0, 0); - -444 if( -”v® -. -’coded - == -1) ƒrval; - -445 -compu‹d_size - +ð -”v® -. -’coded -; - -452 -’codšg_size - = - -453 - `d”_wr™e_gs -( -td -, -compu‹d_size -, -g_mode -, 1, -g -, -cb -, -­p_key -); - -454 if( -’codšg_size - < 0) { - -455 -ASN__ENCODE_FAILED -; - -457 -compu‹d_size - +ð -’codšg_size -; - -459 if(! -cb - || -li¡ --> -couÁ - == 0) { - -460 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -461 -”v® -. -’coded - = -compu‹d_size -; - -462 - `ASN__ENCODED_OK -( -”v® -); - -465 - `ASN_DEBUG -("Encodšg memb” oà% SET OF", -td --> -Çme -); - -472 -’coded_–s - = - `SET_OF__’code_s܋d -( -–m -, -li¡ -, -SOES_DER -); - -478  -edx - = 0;ƒdx < -li¡ --> -couÁ -;ƒdx++) { - -479  -_–_bufãr - * -’coded_– - = & -’coded_–s -[ -edx -]; - -481 if( - `cb -( -’coded_– --> -buf -,ƒncoded_–-> -Ëngth -, -­p_key -) < 0) { - -484 -’codšg_size - +ð -’coded_– --> -Ëngth -; - -488 - `SET_OF__’code_s܋d_ä“ -( -’coded_–s -, -li¡ --> -couÁ -); - -490 if( -edx - =ð -li¡ --> -couÁ -) { - -491 -a¢_’c_rv®_t - -”v® - = {0,0,0}; - -492 - `as£¹ -( -compu‹d_size - =ð( -size_t -) -’codšg_size -); - -493 -”v® -. -’coded - = -compu‹d_size -; - -494 - `ASN__ENCODED_OK -( -”v® -); - -496 -ASN__ENCODE_FAILED -; - -498 - } -} - -500 #undeà -XER_ADVANCE - - -501  - #XER_ADVANCE -( -num_by‹s -) do { \ - -502 -size_t - -num - = -num_by‹s -; \ - -503 -buf_±r - = ((cÚ¡ *)buf_±rè+ -num -;\ - -504 -size - -ð -num -; \ - -505 -cÚsumed_my£lf - +ð -num -; \ - -506 } 0) - - ) - -511 -a¢_dec_rv®_t - - -512 - $SET_OF_decode_x” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -513 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¡ruù_±r -, - -514 cÚ¡ * -Ýt_mÇme -, cÚ¡ * -buf_±r -, -size_t - -size -) { - -518 cÚ¡ -a¢_SET_OF_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_SET_OF_¥ecifics_ˆ*) -td --> -¥ecifics -; - -519 cÚ¡ -a¢_TYPE_memb”_t - * -–em’t - = -td --> -–em’ts -; - -520 cÚ¡ * -–m_g -; - -521 cÚ¡ * -xml_g - = -Ýt_mÇme - ? o±_mÇm: -td -->xml_tag; - -526 * -¡ - = * -¡ruù_±r -; - -527 -a¢_¡ruù_ùx_t - * -ùx -; - -529 -a¢_dec_rv®_t - -rv® - = { -RC_OK -, 0}; - -530 -ssize_t - -cÚsumed_my£lf - = 0; - -535 if( -¡ - == 0) { - -536 -¡ - = * -¡ruù_±r - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -537 if( -¡ - =ð0è - `RETURN -( -RC_FAIL -); - -541 if( -¥ecs --> -as_XMLV®ueLi¡ -) { - -542 -–m_g - = ( -¥ecs --> -as_XMLV®ueLi¡ - == 1) ? 0 : ""; - -544 -–m_g - = (* -–em’t --> -Çme -) - -545 ? -–em’t --> -Çme - :ƒËm’t-> -ty³ --> -xml_g -; - -551 -ùx - = ( -a¢_¡ruù_ùx_t - *)((*) -¡ - + -¥ecs --> -ùx_off£t -); - -559 ; -ùx --> -pha£ - <= 2;) { - -560 -px”_chunk_ty³_e - -ch_ty³ -; - -561 -ssize_t - -ch_size -; - -562 -x”_check_g_e - -tcv -; - -567 if( -ùx --> -pha£ - == 2) { - -568 -a¢_dec_rv®_t - -tm´v® - = { -RC_OK -, 0}; - -571 - `ASN_DEBUG -("XER/SET OFƒËm’ˆ[%s]", -–m_g -); - -572 -tm´v® - = -–em’t --> -ty³ --> -Ý --> - `x”_decod” -( -Ýt_codec_ùx -, - -573 -–em’t --> -ty³ -, & -ùx --> -±r -, -–m_g -, - -574 -buf_±r -, -size -); - -575 if( -tm´v® -. -code - =ð -RC_OK -) { - -576 -a¢_ªÚymous_£t_ - * -li¡ - = - `_A_SET_FROM_VOID -( -¡ -); - -577 if( - `ASN_SET_ADD -( -li¡ -, -ùx --> -±r -) != 0) - -578 - `RETURN -( -RC_FAIL -); - -579 -ùx --> -±r - = 0; - -580 - `XER_ADVANCE -( -tm´v® -. -cÚsumed -); - -582 - `XER_ADVANCE -( -tm´v® -. -cÚsumed -); - -583 - `RETURN -( -tm´v® -. -code -); - -585 -ùx --> -pha£ - = 1; - -586 - `ASN_DEBUG -("XER/SET OF…ha£ => %d", -ùx --> -pha£ -); - -593 -ch_size - = - `x”_Ãxt_tok’ -(& -ùx --> -cڋxt -, - -594 -buf_±r -, -size -, & -ch_ty³ -); - -595 if( -ch_size - == -1) { - -596 - `RETURN -( -RC_FAIL -); - -598  -ch_ty³ -) { - -599  -PXER_WMORE -: - -600 - `RETURN -( -RC_WMORE -); - -601  -PXER_COMMENT -: - -602  -PXER_TEXT -: - -603 - `XER_ADVANCE -( -ch_size -); - -605  -PXER_TAG -: - -610 -tcv - = - `x”_check_g -( -buf_±r -, -ch_size -, -xml_g -); - -611 - `ASN_DEBUG -("XER/SET OF:cv = %d,…h=%d=%s", - -612 -tcv -, -ùx --> -pha£ -, -xml_g -); - -613  -tcv -) { - -614  -XCT_CLOSING -: - -615 if( -ùx --> -pha£ - == 0) ; - -616 -ùx --> -pha£ - = 0; - -618  -XCT_BOTH -: - -619 if( -ùx --> -pha£ - == 0) { - -621 - `XER_ADVANCE -( -ch_size -); - -622 -ùx --> -pha£ - = 3; - -623 - `RETURN -( -RC_OK -); - -626  -XCT_OPENING -: - -627 if( -ùx --> -pha£ - == 0) { - -628 - `XER_ADVANCE -( -ch_size -); - -629 -ùx --> -pha£ - = 1; - -633  -XCT_UNKNOWN_OP -: - -634  -XCT_UNKNOWN_BO -: - -636 - `ASN_DEBUG -("XER/SET OF:cv=%d,…h=%d", -tcv -, -ùx --> -pha£ -); - -637 if( -ùx --> -pha£ - == 1) { - -641 -ùx --> -pha£ - = 2; - -649 - `ASN_DEBUG -("Unexpected XMLag in SET OF"); - -653 -ùx --> -pha£ - = 3; - -654 - `RETURN -( -RC_FAIL -); - -655 - } -} - -659  - sx”_tmp_’c_s - { - -660 * - mbufãr -; - -661 -size_t - - moff£t -; - -662 -size_t - - msize -; - -663 } - tx”_tmp_’c_t -; - -665 - $SET_OF_’code_x”_ÿÎback -(cÚ¡ * -bufãr -, -size_t - -size -, * -key -) { - -666 -x”_tmp_’c_t - * -t - = (x”_tmp_’c_ˆ*) -key -; - -667 if( -t --> -off£t - + -size - >=->size) { - -668 -size_t - -Ãwsize - = ( -t --> -size - << 2) + size; - -669 * -p - = - `REALLOC -( -t --> -bufãr -, -Ãwsize -); - -670 if(! -p -)  -1; - -671 -t --> -bufãr - = -p -; - -672 -t --> -size - = -Ãwsize -; - -674 - `memýy -((*) -t --> -bufãr - +-> -off£t -, bufãr, -size -); - -675 -t --> -off£t - +ð -size -; - -677 - } -} - -679 - $SET_OF_x”_Üd” -(cÚ¡ * -­Œ -, cÚ¡ * -b±r -) { - -680 cÚ¡ -x”_tmp_’c_t - * -a - = (cÚ¡ x”_tmp_’c_ˆ*) -­Œ -; - -681 cÚ¡ -x”_tmp_’c_t - * -b - = (cÚ¡ x”_tmp_’c_ˆ*) -b±r -; - -682 -size_t - -mšËn - = -a --> -off£t -; - -683  -»t -; - -684 if( -b --> -off£t - < -mšËn -) minlen = b->offset; - -686 -»t - = - `memcmp -( -a --> -bufãr -, -b -->bufãr, -mšËn -); - -687 if( -»t - != 0) „et; - -688 if( -a --> -off£t - =ð -b -->offset) - -690 if( -a --> -off£t - =ð -mšËn -) - -693 - } -} - -696 -a¢_’c_rv®_t - - -697 - $SET_OF_’code_x” -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -698 -x”_’cod”_æags_e - -æags -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -699 * -­p_key -) { - -700 -a¢_’c_rv®_t - -” - = {0,0,0}; - -701 cÚ¡ -a¢_SET_OF_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_SET_OF_¥ecifics_ˆ*) -td --> -¥ecifics -; - -702 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -703 cÚ¡ -a¢_ªÚymous_£t_ - * -li¡ - = - `_A_CSET_FROM_VOID -( -¥Œ -); - -704 cÚ¡ * -mÇme - = -¥ecs --> -as_XMLV®ueLi¡ - - -705 ? 0 : ((* -–m --> -Çme -è?ƒlm->Çm:ƒlm-> -ty³ --> -xml_g -); - -706 -size_t - -mËn - = -mÇme - ? - `¡¾’ -(mname) : 0; - -707  -xÿn - = ( -æags - & -XER_F_CANONICAL -); - -708 -x”_tmp_’c_t - * -’cs - = 0; - -709 -size_t - -’cs_couÁ - = 0; - -710 * -Üigš®_­p_key - = -­p_key -; - -711 -a¢_­p_cÚsume_by‹s_f - * -Üigš®_cb - = -cb -; - -712  -i -; - -714 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -716 if( -xÿn -) { - -717 -’cs - = ( -x”_tmp_’c_t - *) - `MALLOC -( -li¡ --> -couÁ - * (encs[0])); - -718 if(! -’cs -è -ASN__ENCODE_FAILED -; - -719 -cb - = -SET_OF_’code_x”_ÿÎback -; - -722 -” -. -’coded - = 0; - -724  -i - = 0; i < -li¡ --> -couÁ -; i++) { - -725 -a¢_’c_rv®_t - -tm³r - = {0,0,0}; - -727 * -memb_±r - = -li¡ --> -¬¿y -[ -i -]; - -728 if(! -memb_±r -) ; - -730 if( -’cs -) { - -731 - `mem£t -(& -’cs -[ -’cs_couÁ -], 0, (encs[0])); - -732 -­p_key - = & -’cs -[ -’cs_couÁ -]; - -733 -’cs_couÁ -++; - -736 if( -mÇme -) { - -737 if(! -xÿn -è - `ASN__TEXT_INDENT -(1, -žev– -); - -738 - `ASN__CALLBACK3 -("<", 1, -mÇme -, -mËn -, ">", 1); - -741 if(! -xÿn - && -¥ecs --> -as_XMLV®ueLi¡ - == 1) - -742 - `ASN__TEXT_INDENT -(1, -žev– - + 1); - -743 -tm³r - = -–m --> -ty³ --> -Ý --> - `x”_’cod” -Ólm->ty³, -memb_±r -, - -744 -žev– - + ( -¥ecs --> -as_XMLV®ueLi¡ - != 2), - -745 -æags -, -cb -, -­p_key -); - -746 if( -tm³r -. -’coded - == -1) mper; - -747 -” -. -’coded - +ð -tm³r -.encoded; - -748 if( -tm³r -. -’coded - =ð0 && -¥ecs --> -as_XMLV®ueLi¡ -) { - -749 cÚ¡ * -Çme - = -–m --> -ty³ --> -xml_g -; - -750 -size_t - -Ën - = - `¡¾’ -( -Çme -); - -751 - `ASN__CALLBACK3 -("<", 1, -Çme -, -Ën -, "/>", 2); - -754 if( -mÇme -) { - -755 - `ASN__CALLBACK3 -("", 1); - -760 if(! -xÿn -è - `ASN__TEXT_INDENT -(1, -žev– - - 1); - -762 if( -’cs -) { - -763 -x”_tmp_’c_t - * -’c - = -’cs -; - -764 -x”_tmp_’c_t - * -’d - = -’cs - + -’cs_couÁ -; - -765 -ssize_t - -cڌÞ_size - = 0; - -767 -” -. -’coded - = 0; - -768 -cb - = -Üigš®_cb -; - -769 -­p_key - = -Üigš®_­p_key -; - -770 - `qsÜt -( -’cs -, -’cs_couÁ -, Óncs[0]), -SET_OF_x”_Üd” -); - -772 ; -’c - < -’d -;ƒnc++) { - -773 - `ASN__CALLBACK -( -’c --> -bufãr -,ƒnc-> -off£t -); - -774 - `FREEMEM -( -’c --> -bufãr -); - -775 -’c --> -bufãr - = 0; - -776 -cڌÞ_size - +ð -’c --> -off£t -; - -778 - `as£¹ -( -cڌÞ_size - =ð -” -. -’coded -); - -781  -þ—nup -; - -782 -cb_çžed -: - -783 -ASN__ENCODE_FAILED -; - -784 -þ—nup -: - -785 if( -’cs -) { - -786 -size_t - -n -; - -787  -n - = 0;‚ < -’cs_couÁ -;‚++) { - -788 - `FREEMEM -( -’cs -[ -n -]. -bufãr -); - -790 - `FREEMEM -( -’cs -); - -792 - `ASN__ENCODED_OK -( -” -); - -793 - } -} - -796 - $SET_OF_´št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -,  -žev– -, - -797 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -798 -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -799 cÚ¡ -a¢_ªÚymous_£t_ - * -li¡ - = - `_A_CSET_FROM_VOID -( -¥Œ -); - -800  -»t -; - -801  -i -; - -803 if(! -¥Œ -è ( - `cb -("", 8, -­p_key -) < 0) ? -1 : 0; - -806 if( - `cb -( -td --> -Çme -, - `¡¾’ -Ñd->Çme), -­p_key -) < 0 - -807 || - `cb -(" ::ð{", 6, -­p_key -) < 0) - -810  -i - = 0; i < -li¡ --> -couÁ -; i++) { - -811 cÚ¡ * -memb_±r - = -li¡ --> -¬¿y -[ -i -]; - -812 if(! -memb_±r -) ; - -814 - `_i_INDENT -(1); - -816 -»t - = -–m --> -ty³ --> -Ý --> - `´št_¡ruù -Ólm->ty³, -memb_±r -, - -817 -žev– - + 1, -cb -, -­p_key -); - -818 if( -»t -) „et; - -821 -žev– ---; - -822 - `_i_INDENT -(1); - -824  ( - `cb -("}", 1, -­p_key -) < 0) ? -1 : 0; - -825 - } -} - -828 - $SET_OF_ä“ -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, * -±r -, - -829 -a¢_¡ruù_ä“_m‘hod - -m‘hod -) { - -830 if( -td - && -±r -) { - -831 cÚ¡ -a¢_SET_OF_¥ecifics_t - * -¥ecs -; - -832 -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -833 -a¢_ªÚymous_£t_ - * -li¡ - = - `_A_SET_FROM_VOID -( -±r -); - -834 -a¢_¡ruù_ùx_t - * -ùx -; - -835  -i -; - -841  -i - = 0; i < -li¡ --> -couÁ -; i++) { - -842 * -memb_±r - = -li¡ --> -¬¿y -[ -i -]; - -843 if( -memb_±r -) - -844 - `ASN_STRUCT_FREE -(* -–m --> -ty³ -, -memb_±r -); - -846 -li¡ --> -couÁ - = 0; - -848 - `a¢_£t_em±y -( -li¡ -); - -850 -¥ecs - = (cÚ¡ -a¢_SET_OF_¥ecifics_t - *) -td --> -¥ecifics -; - -851 -ùx - = ( -a¢_¡ruù_ùx_t - *)((*) -±r - + -¥ecs --> -ùx_off£t -); - -852 if( -ùx --> -±r -) { - -853 - `ASN_STRUCT_FREE -(* -–m --> -ty³ -, -ùx --> -±r -); - -854 -ùx --> -±r - = 0; - -857  -m‘hod -) { - -858  -ASFM_FREE_EVERYTHING -: - -859 - `FREEMEM -( -±r -); - -861  -ASFM_FREE_UNDERLYING -: - -863  -ASFM_FREE_UNDERLYING_AND_RESET -: - -864 - `mem£t -( -±r -, 0, -¥ecs --> -¡ruù_size -); - -868 - } -} - -871 - $SET_OF_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -872 -a¢_­p_cÚ¡¿št_çžed_f - * -ùçžcb -, * -­p_key -) { - -873 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -874 -a¢_cÚ¡r_check_f - * -cÚ¡r -; - -875 cÚ¡ -a¢_ªÚymous_£t_ - * -li¡ - = - `_A_CSET_FROM_VOID -( -¥Œ -); - -876  -i -; - -878 if(! -¥Œ -) { - -879 - `ASN__CTFAIL -( -­p_key -, -td -, -¥Œ -, - -881 -td --> -Çme -, -__FILE__ -, -__LINE__ -); - -885 -cÚ¡r - = -–m --> -’codšg_cÚ¡¿šts -. -g’”®_cÚ¡¿šts -; - -886 if(! -cÚ¡r -ècÚ¡¸ð -–m --> -ty³ --> -’codšg_cÚ¡¿šts -. -g’”®_cÚ¡¿šts -; - -892  -i - = 0; i < -li¡ --> -couÁ -; i++) { - -893 cÚ¡ * -memb_±r - = -li¡ --> -¬¿y -[ -i -]; - -894  -»t -; - -896 if(! -memb_±r -) ; - -898 -»t - = - `cÚ¡r -( -–m --> -ty³ -, -memb_±r -, -ùçžcb -, -­p_key -); - -899 if( -»t -) „et; - -903 - } -} - -905 #iâdeà -ASN_DISABLE_PER_SUPPORT - - -907 -a¢_dec_rv®_t - - -908 - $SET_OF_decode_u³r -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -909 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -910 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -911 -a¢_³r_d©a_t - * -pd -) { - -912 -a¢_dec_rv®_t - -rv - = { -RC_OK -, 0}; - -913 cÚ¡ -a¢_SET_OF_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_SET_OF_¥ecifics_ˆ*) -td --> -¥ecifics -; - -914 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -915 * -¡ - = * -¥Œ -; - -916 -a¢_ªÚymous_£t_ - * -li¡ -; - -917 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -918  -»³© - = 0; - -919 -ssize_t - -ÃËms -; - -921 if( - `ASN__STACK_OVERFLOW_CHECK -( -Ýt_codec_ùx -)) - -922 -ASN__DECODE_FAILED -; - -927 if(! -¡ -) { - -928 -¡ - = * -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -929 if(! -¡ -è -ASN__DECODE_FAILED -; - -931 -li¡ - = - `_A_SET_FROM_VOID -( -¡ -); - -934 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -size -; - -935 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -936 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -size -; - -937 -ù - = 0; - -939 if( -ù - && ct-> -æags - & -APC_EXTENSIBLE -) { - -940  -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -941 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -942 if( -v®ue -è -ù - = 0; - -945 if( -ù - && ct-> -efãùive_b™s - >= 0) { - -947 -ÃËms - = - `³r_g‘_ãw_b™s -( -pd -, -ù --> -efãùive_b™s -); - -948 - `ASN_DEBUG -("Preparingo fetch %ld+%ldƒlements from %s", - -949 () -ÃËms -, -ù --> -low”_bound -, -td --> -Çme -); - -950 if( -ÃËms - < 0è -ASN__DECODE_STARVED -; - -951 -ÃËms - +ð -ù --> -low”_bound -; - -953 -ÃËms - = -1; - -957  -i -; - -958 if( -ÃËms - < 0) { - -959 -ÃËms - = - `u³r_g‘_Ëngth -( -pd -, -1, 0, & -»³© -); - -960 - `ASN_DEBUG -("GفØdecod%" -ASN_PRI_SSIZE - "ƒlements (eff %d)", - -961 -ÃËms -, ()( -ù - ? ct-> -efãùive_b™s - : -1)); - -962 if( -ÃËms - < 0è -ASN__DECODE_STARVED -; - -965  -i - = 0; i < -ÃËms -; i++) { - -966 * -±r - = 0; - -967 - `ASN_DEBUG -("SET OF % decodšg", -–m --> -ty³ --> -Çme -); - -968 -rv - = -–m --> -ty³ --> -Ý --> - `u³r_decod” -( -Ýt_codec_ùx -,ƒlm->type, - -969 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, & -±r -, -pd -); - -970 - `ASN_DEBUG -("%s SET OF %s decoded %d, %p", - -971 -td --> -Çme -, -–m --> -ty³ -->Çme, -rv -. -code -, -±r -); - -972 if( -rv -. -code - =ð -RC_OK -) { - -973 if( - `ASN_SET_ADD -( -li¡ -, -±r -) == 0) { - -974 if( -rv -. -cÚsumed - =ð0 && -ÃËms - > 200) { - -976 -ASN__DECODE_FAILED -; - -980 - `ASN_DEBUG -("Failedo‡ddƒlement into %s", - -981 -td --> -Çme -); - -983 -rv -. -code - = -RC_FAIL -; - -985 - `ASN_DEBUG -("Failed decoding %s of %s (SET OF)", - -986 -–m --> -ty³ --> -Çme -, -td -->name); - -988 if( -±r -è - `ASN_STRUCT_FREE -(* -–m --> -ty³ -,…tr); - -989  -rv -; - -992 -ÃËms - = -1; - -993 }  -»³© -); - -995 - `ASN_DEBUG -("Decoded % a SET OF", -td --> -Çme -); - -997 -rv -. -code - = -RC_OK -; - -998 -rv -. -cÚsumed - = 0; - -999  -rv -; - -1000 - } -} - -1002 -a¢_’c_rv®_t - - -1003 - $SET_OF_’code_u³r -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1004 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -1005 -a¢_³r_ou_t - * -po -) { - -1006 cÚ¡ -a¢_ªÚymous_£t_ - * -li¡ -; - -1007 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -1008 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -1009  -_–_bufãr - * -’coded_–s -; - -1010 -a¢_’c_rv®_t - -” - = {0,0,0}; - -1011 -size_t - -’coded_edx -; - -1013 if(! -¥Œ -è -ASN__ENCODE_FAILED -; - -1015 -li¡ - = - `_A_CSET_FROM_VOID -( -¥Œ -); - -1017 -” -. -’coded - = 0; - -1019 - `ASN_DEBUG -("Encodšg % a SEQUENCE OF (%d)", -td --> -Çme -, -li¡ --> -couÁ -); - -1021 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -size -; - -1022 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -1023 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -size -; - -1024 -ù - = 0; - -1027 if( -ù -) { - -1028  -nÙ_š_roÙ - = - -1029 ( -li¡ --> -couÁ - < -ù --> -low”_bound - ||†i¡->couÁ > ct-> -uµ”_bound -); - -1030 - `ASN_DEBUG -("lb %ld ub %ld %s", -ù --> -low”_bound -, ct-> -uµ”_bound -, - -1031 -ù --> -æags - & -APC_EXTENSIBLE - ? "ext" : "fix"); - -1032 if( -ù --> -æags - & -APC_EXTENSIBLE -) { - -1034 if( - `³r_put_ãw_b™s -( -po -, -nÙ_š_roÙ -, 1)è -ASN__ENCODE_FAILED -; - -1035 if( -nÙ_š_roÙ -è -ù - = 0; - -1036 } if( -nÙ_š_roÙ - && -ù --> -efãùive_b™s - >= 0) { - -1037 -ASN__ENCODE_FAILED -; - -1042 if( -ù - && ct-> -efãùive_b™s - >= 0) { - -1044 if( - `³r_put_ãw_b™s -( -po -, -li¡ --> -couÁ - - -ù --> -low”_bound -, - -1045 -ù --> -efãùive_b™s -)) - -1046 -ASN__ENCODE_FAILED -; - -1047 } if( -li¡ --> -couÁ - == 0) { - -1051 ià( - `u³r_put_Ëngth -( -po -, 0, 0)) { - -1052 -ASN__ENCODE_FAILED -; - -1054 - `ASN__ENCODED_OK -( -” -); - -1062 -’coded_–s - = - `SET_OF__’code_s܋d -( -–m -, -li¡ -, -SOES_CUPER -); - -1064  -’coded_edx - = 0; ( -ssize_t -ëncoded_edx < -li¡ --> -couÁ -;) { - -1065 -ssize_t - -may_’code -; - -1066 -size_t - -edx -; - -1067  -Ãed_eom - = 0; - -1069 if( -ù - && ct-> -efãùive_b™s - >= 0) { - -1070 -may_’code - = -li¡ --> -couÁ -; - -1072 -may_’code - = - -1073 - `u³r_put_Ëngth -( -po -, -li¡ --> -couÁ - - -’coded_edx -, & -Ãed_eom -); - -1074 if( -may_’code - < 0è -ASN__ENCODE_FAILED -; - -1077  -edx - = -’coded_edx -;ƒdx <ƒncoded_edx + -may_’code -;ƒdx++) { - -1078 cÚ¡  -_–_bufãr - * -– - = & -’coded_–s -[ -edx -]; - -1079 if( - `a¢_put_mªy_b™s -( -po -, -– --> -buf -, - -1080 (8 * -– --> -Ëngth -è-ƒl-> -b™s_unu£d -) < 0) { - -1085 if( -Ãed_eom - && - `u³r_put_Ëngth -( -po -, 0, 0)) - -1086 -ASN__ENCODE_FAILED -; - -1088 -’coded_edx - +ð -may_’code -; - -1091 - `SET_OF__’code_s܋d_ä“ -( -’coded_–s -, -li¡ --> -couÁ -); - -1093 if(( -ssize_t -) -’coded_edx - =ð -li¡ --> -couÁ -) { - -1094 - `ASN__ENCODED_OK -( -” -); - -1096 -ASN__ENCODE_FAILED -; - -1098 - } -} - -1100 -a¢_dec_rv®_t - - -1101 - $SET_OF_decode_­” -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -1102 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -1103 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -1104 -a¢_dec_rv®_t - -rv - = { -RC_OK -, 0}; - -1105 cÚ¡ -a¢_SET_OF_¥ecifics_t - * -¥ecs - = (cÚ¡‡¢_SET_OF_¥ecifics_ˆ*) -td --> -¥ecifics -; - -1106 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -1107 * -¡ - = * -¥Œ -; - -1108 -a¢_ªÚymous_£t_ - * -li¡ -; - -1109 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -ù -; - -1110  -»³© - = 0; - -1111 -ssize_t - -ÃËms -; - -1113 if( - `ASN__STACK_OVERFLOW_CHECK -( -Ýt_codec_ùx -)) - -1114 -ASN__DECODE_FAILED -; - -1119 if(! -¡ -) { - -1120 -¡ - = * -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -); - -1121 if(! -¡ -è -ASN__DECODE_FAILED -; - -1123 -li¡ - = - `_A_SET_FROM_VOID -( -¡ -); - -1126 if( -cÚ¡¿šts -è -ù - = &cÚ¡¿šts-> -size -; - -1127 if( -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -) - -1128 -ù - = & -td --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts --> -size -; - -1129 -ù - = 0; - -1131 if( -ù - && ct-> -æags - & -APC_EXTENSIBLE -) { - -1132  -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, 1); - -1133 if( -v®ue - < 0è -ASN__DECODE_STARVED -; - -1134 if( -v®ue -è -ù - = 0; - -1137 if( -ù - && ct-> -efãùive_b™s - >= 0) { - -1139 -ÃËms - = - `­”_g‘_n¢nwn -( -pd -, -ù --> -uµ”_bound - - ct-> -low”_bound - + 1); - -1140 - `ASN_DEBUG -("Preparingo fetch %ld+%ldƒlements from %s", - -1141 () -ÃËms -, -ù --> -low”_bound -, -td --> -Çme -); - -1142 if( -ÃËms - < 0è -ASN__DECODE_STARVED -; - -1143 -ÃËms - +ð -ù --> -low”_bound -; - -1145 -ÃËms - = -1; - -1149  -i -; - -1150 if( -ÃËms - < 0) { - -1151 -ÃËms - = - `­”_g‘_Ëngth -( -pd -, -ù - ? ct-> -uµ”_bound - - ct-> -low”_bound - + 1 : -1, - -1152 -ù - ? ct-> -efãùive_b™s - : -1, & -»³© -); - -1153 - `ASN_DEBUG -("Goto decode %dƒlements (eff %d)", - -1154 () -ÃËms -, ()( -ù - ? ct-> -efãùive_b™s - : -1)); - -1155 if( -ÃËms - < 0è -ASN__DECODE_STARVED -; - -1158  -i - = 0; i < -ÃËms -; i++) { - -1159 * -±r - = 0; - -1160 - `ASN_DEBUG -("SET OF % decodšg", -–m --> -ty³ --> -Çme -); - -1161 -rv - = -–m --> -ty³ --> -Ý --> - `­”_decod” -( -Ýt_codec_ùx -,ƒlm->type, - -1162 -–m --> -’codšg_cÚ¡¿šts -. -³r_cÚ¡¿šts -, & -±r -, -pd -); - -1163 - `ASN_DEBUG -("%s SET OF %s decoded %d, %p", - -1164 -td --> -Çme -, -–m --> -ty³ -->Çme, -rv -. -code -, -±r -); - -1165 if( -rv -. -code - =ð -RC_OK -) { - -1166 if( - `ASN_SET_ADD -( -li¡ -, -±r -) == 0) - -1168 - `ASN_DEBUG -("Failedo‡ddƒlement into %s", - -1169 -td --> -Çme -); - -1171 -rv -. -code - = -RC_FAIL -; - -1173 - `ASN_DEBUG -("Failed decoding %s of %s (SET OF)", - -1174 -–m --> -ty³ --> -Çme -, -td -->name); - -1176 if( -±r -è - `ASN_STRUCT_FREE -(* -–m --> -ty³ -,…tr); - -1177  -rv -; - -1180 -ÃËms - = -1; - -1181 }  -»³© -); - -1183 - `ASN_DEBUG -("Decoded % a SET OF", -td --> -Çme -); - -1185 -rv -. -code - = -RC_OK -; - -1186 -rv -. -cÚsumed - = 0; - -1187  -rv -; - -1188 - } -} - -1192  - scom·¿bË_±r - { - -1193 cÚ¡ -a¢_TYPE_desütÜ_t - * - mtd -; - -1194 cÚ¡ * - m¥Œ -; - -1198 - $SET_OF__com·»_cb -(cÚ¡ * -­Œ -, cÚ¡ * -b±r -) { - -1199 cÚ¡  -com·¿bË_±r - * -a - = -­Œ -; - -1200 cÚ¡  -com·¿bË_±r - * -b - = -b±r -; - -1201 - `as£¹ -( -a --> -td - =ð -b -->td); - -1202  -a --> -td --> -Ý --> - `com·»_¡ruù -×->td,‡-> -¥Œ -, -b -->sptr); - -1203 - } -} - -1206 - $SET_OF_com·» -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -­Œ -, - -1207 cÚ¡ * -b±r -) { - -1208 cÚ¡ -a¢_ªÚymous_£t_ - * -a - = - `_A_CSET_FROM_VOID -( -­Œ -); - -1209 cÚ¡ -a¢_ªÚymous_£t_ - * -b - = - `_A_CSET_FROM_VOID -( -b±r -); - -1211 if( -a - && -b -) { - -1212  -com·¿bË_±r - * -as܋d -; - -1213  -com·¿bË_±r - * -bs܋d -; - -1214 -ssize_t - -commÚ_Ëngth -; - -1215 -ssize_t - -idx -; - -1217 if( -a --> -couÁ - == 0) { - -1218 if( -b --> -couÁ -)  -1; - -1220 } if( -b --> -couÁ - == 0) { - -1224 -as܋d - = - `MALLOC -( -a --> -couÁ - * (asorted[0])); - -1225 -bs܋d - = - `MALLOC -( -b --> -couÁ - * (bsorted[0])); - -1226 if(! -as܋d - || ! -bs܋d -) { - -1227 - `FREEMEM -( -as܋d -); - -1228 - `FREEMEM -( -bs܋d -); - -1232  -idx - = 0; idx < -a --> -couÁ -; idx++) { - -1233 -as܋d -[ -idx -]. -td - =d-> -–em’ts --> -ty³ -; - -1234 -as܋d -[ -idx -]. -¥Œ - = -a --> -¬¿y -[idx]; - -1237  -idx - = 0; idx < -b --> -couÁ -; idx++) { - -1238 -bs܋d -[ -idx -]. -td - =d-> -–em’ts --> -ty³ -; - -1239 -bs܋d -[ -idx -]. -¥Œ - = -b --> -¬¿y -[idx]; - -1242 - `qsÜt -( -as܋d -, -a --> -couÁ -, ×s܋d[0]), -SET_OF__com·»_cb -); - -1243 - `qsÜt -( -bs܋d -, -b --> -couÁ -, (bs܋d[0]), -SET_OF__com·»_cb -); - -1245 -commÚ_Ëngth - = ( -a --> -couÁ - < -b -->count ?‡->count : b->count); - -1246  -idx - = 0; idx < -commÚ_Ëngth -; idx++) { - -1247  -»t - = -td --> -–em’ts --> -ty³ --> -Ý --> - `com·»_¡ruù -( - -1248 -td --> -–em’ts --> -ty³ -, -as܋d -[ -idx -]. -¥Œ -, -bs܋d -[idx].sptr); - -1249 if( -»t -) { - -1250 - `FREEMEM -( -as܋d -); - -1251 - `FREEMEM -( -bs܋d -); - -1252  -»t -; - -1256 - `FREEMEM -( -as܋d -); - -1257 - `FREEMEM -( -bs܋d -); - -1259 if( -idx - < -b --> -couÁ -) - -1261 if( -idx - < -a --> -couÁ -)  1; - -1262 } if(! -a -) { - -1264 } if(! -b -) { - -1269 - } -} - -1272 -a¢_TYPE_ݔ©iÚ_t - - ga¢_OP_SET_OF - = { - -1273 -SET_OF_ä“ -, - -1274 -SET_OF_´št -, - -1275 -SET_OF_com·» -, - -1276 -SET_OF_decode_b” -, - -1277 -SET_OF_’code_d” -, - -1278 -SET_OF_decode_x” -, - -1279 -SET_OF_’code_x” -, - -1280 #ifdeà -ASN_DISABLE_OER_SUPPORT - - -1284 -SET_OF_decode_Ûr -, - -1285 -SET_OF_’code_Ûr -, - -1287 #ifdeà -ASN_DISABLE_PER_SUPPORT - - -1293 -SET_OF_decode_u³r -, - -1294 -SET_OF_’code_u³r -, - -1295 -SET_OF_decode_­” -, - -1298 -SET_OF_¿ndom_fžl -, - -1303 -a¢_¿ndom_fžl_»suÉ_t - - -1304 - $SET_OF_¿ndom_fžl -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -1305 cÚ¡ -a¢_’codšg_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -1306 -size_t - -max_Ëngth -) { - -1307 cÚ¡ -a¢_SET_OF_¥ecifics_t - * -¥ecs - = - -1308 (cÚ¡ -a¢_SET_OF_¥ecifics_t - *) -td --> -¥ecifics -; - -1309 -a¢_¿ndom_fžl_»suÉ_t - -»s_ok - = { -ARFILL_OK -, 0}; - -1310 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_çžed - = { -ARFILL_FAILED -, 0}; - -1311 -a¢_¿ndom_fžl_»suÉ_t - -»suÉ_sk³d - = { -ARFILL_SKIPPED -, 0}; - -1312 cÚ¡ -a¢_TYPE_memb”_t - * -–m - = -td --> -–em’ts -; - -1313 * -¡ - = * -¥Œ -; - -1314  -max_–em’ts - = 5; - -1315  -¦b - = 0; - -1316  -sub - = 0; - -1317 -size_t - -ºd_Ën -; - -1319 if( -max_Ëngth - =ð0è -»suÉ_sk³d -; - -1321 if( -¡ - =ð -NULL -) { - -1322 -¡ - = (* -¥Œ - = - `CALLOC -(1, -¥ecs --> -¡ruù_size -)); - -1323 if( -¡ - =ð -NULL -) { - -1324  -»suÉ_çžed -; - -1328  - `a¢_¿ndom_b‘w“n -(0, 6)) { - -1329 0: -max_–em’ts - = 0; ; - -1330 1: -max_–em’ts - = 1; ; - -1331 2: -max_–em’ts - = 5; ; - -1332 3: -max_–em’ts - = -max_Ëngth -; ; - -1333 4: -max_–em’ts - = -max_Ëngth - / 2; ; - -1334 5: -max_–em’ts - = -max_Ëngth - / 4; ; - -1337 -sub - = -¦b - + -max_–em’ts -; - -1339 if(! -cÚ¡¿šts - || !cÚ¡¿šts-> -³r_cÚ¡¿šts -) - -1340 -cÚ¡¿šts - = & -td --> -’codšg_cÚ¡¿šts -; - -1341 if( -cÚ¡¿šts --> -³r_cÚ¡¿šts -) { - -1342 cÚ¡ -a¢_³r_cÚ¡¿št_t - * -pc - = & -cÚ¡¿šts --> -³r_cÚ¡¿šts --> -size -; - -1343 if( -pc --> -æags - & -APC_SEMI_CONSTRAINED -) { - -1344 -¦b - = -pc --> -low”_bound -; - -1345 -sub - = -pc --> -low”_bound - + -max_–em’ts -; - -1346 } if( -pc --> -æags - & -APC_CONSTRAINED -) { - -1347 -¦b - = -pc --> -low”_bound -; - -1348 -sub - = -pc --> -uµ”_bound -; - -1349 if( -sub - - -¦b - > -max_–em’ts -) sub = slb + max_elements; - -1354  - `a¢_¿ndom_b‘w“n -(-1, 4)) { - -1358 if( -cÚ¡¿šts --> -³r_cÚ¡¿šts - - -1359 && ( -cÚ¡¿šts --> -³r_cÚ¡¿šts --> -size -. -æags - & -APC_EXTENSIBLE -)) { - -1360  - `a¢_¿ndom_b‘w“n -(0, 5)) { - -1363 -ºd_Ën - = 0; - -1366 if( -¦b - > 0) { - -1367 -ºd_Ën - = -¦b - - 1; - -1369 -ºd_Ën - = 0; - -1373 -ºd_Ën - = - `a¢_¿ndom_b‘w“n -(0, -¦b -); - -1376 if( -sub - < ( -ssize_t -) -max_Ëngth -) { - -1377 -ºd_Ën - = -sub - + 1; - -1379 -ºd_Ën - = -max_Ëngth -; - -1383 if( -sub - < ( -ssize_t -) -max_Ëngth -) { - -1384 -ºd_Ën - = - `a¢_¿ndom_b‘w“n -( -sub - + 1, -max_Ëngth -); - -1386 -ºd_Ën - = -max_Ëngth -; - -1390 -ºd_Ën - = -max_Ëngth -; - -1397 -ºd_Ën - = - `a¢_¿ndom_b‘w“n -( -¦b -, -sub -); - -1400 if( -¦b - < -sub -) { - -1401 -ºd_Ën - = - `a¢_¿ndom_b‘w“n -( -¦b - + 1, -sub -); - -1406 -ºd_Ën - = - `a¢_¿ndom_b‘w“n -( -¦b -, slb); - -1409 if( -¦b - < -sub -) { - -1410 -ºd_Ën - = - `a¢_¿ndom_b‘w“n -( -¦b -, -sub - - 1); - -1415 -ºd_Ën - = - `a¢_¿ndom_b‘w“n -( -sub -, sub); - -1419 ; -ºd_Ën - > 0;„nd_len--) { - -1420 -a¢_ªÚymous_£t_ - * -li¡ - = - `_A_SET_FROM_VOID -( -¡ -); - -1421 * -±r - = 0; - -1422 -a¢_¿ndom_fžl_»suÉ_t - -tm´es - = -–m --> -ty³ --> -Ý --> - `¿ndom_fžl -( - -1423 -–m --> -ty³ -, & -±r -, &–m-> -’codšg_cÚ¡¿šts -, - -1424 ( -max_Ëngth - > -»s_ok -. -Ëngth - ? max_length -„es_ok.length : 0) - -1425 / -ºd_Ën -); - -1426  -tm´es -. -code -) { - -1427  -ARFILL_OK -: - -1428 - `ASN_SET_ADD -( -li¡ -, -±r -); - -1429 -»s_ok -. -Ëngth - +ð -tm´es -.length; - -1431  -ARFILL_SKIPPED -: - -1433  -ARFILL_FAILED -: - -1434 - `as£¹ -( -±r - == 0); - -1435  -tm´es -; - -1439  -»s_ok -; - -1440 - } -} - - @constr_TYPE.c - -5  - ~ - -6  - ~ - -7  - ~<”ºo.h -> - -12  - $g‘_a¢1c_’vœÚm’t_v”siÚ -(è{  -ASN1C_ENVIRONMENT_VERSION -; - } -} - -14  -a¢_­p_cÚsume_by‹s_f - - g_´št2å -; - -19 -b”_Žv_g_t - - -20 - $a¢_TYPE_outmo¡_g -(cÚ¡ -a¢_TYPE_desütÜ_t - * -ty³_desütÜ -, - -21 cÚ¡ * -¡ruù_±r -,  -g_mode -, -b”_Žv_g_t - -g -) { - -23 if( -g_mode -) - -24  -g -; - -26 if( -ty³_desütÜ --> -gs_couÁ -) - -27  -ty³_desütÜ --> -gs -[0]; - -29  -ty³_desütÜ --> -Ý --> - `outmo¡_g -Ñy³_desütÜ, -¡ruù_±r -, 0, 0); - -30 - } -} - -36 - $a¢_åršt -( -FILE - * -¡»am -, cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -37 cÚ¡ * -¡ruù_±r -) { - -38 if(! -¡»am -è¡»am = -¡dout -; - -39 if(! -td - || ! -¡ruù_±r -) { - -40 -”ºo - = -EINVAL -; - -45 if( -td --> -Ý --> - `´št_¡ruù -Ñd, -¡ruù_±r -, 1, -_´št2å -, -¡»am -)) { - -50 if( - `_´št2å -("\n", 1, -¡»am -)) { - -54  - `fæush -( -¡»am -); - -55 - } -} - -59 - $_´št2å -(cÚ¡ * -bufãr -, -size_t - -size -, * -­p_key -) { - -60 -FILE - * -¡»am - = (FILE *) -­p_key -; - -62 if( - `fwr™e -( -bufãr -, 1, -size -, -¡»am -) != size) - -66 - } -} - -73  -ASN_DEBUG_f -(cÚ¡ * -fmt -, ...); - -74  - $ASN_DEBUG_f -(cÚ¡ * -fmt -, ...) { - -75 -va_li¡ - -­ -; - -76 - `va_¡¬t -( -­ -, -fmt -); - -77 - `vårštf -( -¡d”r -, -fmt -, -­ -); - -78 - `årštf -( -¡d”r -, "\n"); - -79 - `va_’d -( -­ -); - -80 - } -} - - @constraints.c - -1  - ~ - -2  - ~ - -5 - $a¢_g’”ic_no_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -ty³_desütÜ -, - -6 cÚ¡ * -¡ruù_±r -, - -7 -a¢_­p_cÚ¡¿št_çžed_f - * -cb -, * -key -) { - -8 () -ty³_desütÜ -; - -9 () -¡ruù_±r -; - -10 () -cb -; - -11 () -key -; - -15 - } -} - -18 - $a¢_g’”ic_unknown_cÚ¡¿št -(cÚ¡ -a¢_TYPE_desütÜ_t - * -ty³_desütÜ -, - -19 cÚ¡ * -¡ruù_±r -, - -20 -a¢_­p_cÚ¡¿št_çžed_f - * -cb -, * -key -) { - -21 () -ty³_desütÜ -; - -22 () -¡ruù_±r -; - -23 () -cb -; - -24 () -key -; - -28 - } -} - -30  - s”rbufDesc - { - -31 cÚ¡ -a¢_TYPE_desütÜ_t - * - mçžed_ty³ -; - -32 cÚ¡ * - mçžed_¡ruù_±r -; - -33 * - m”rbuf -; - -34 -size_t - - m”¾’ -; - -38 - $_a¢_i_ùçžcb -(* -key -, cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -39 cÚ¡ * -fmt -, ...) { - -40  -”rbufDesc - * -¬g - = -key -; - -41 -va_li¡ - -­ -; - -42 -ssize_t - -vËn -; - -43 -ssize_t - -maxËn -; - -45 -¬g --> -çžed_ty³ - = -td -; - -46 -¬g --> -çžed_¡ruù_±r - = -¥Œ -; - -48 -maxËn - = -¬g --> -”¾’ -; - -49 if( -maxËn - <= 0) - -52 - `va_¡¬t -( -­ -, -fmt -); - -53 -vËn - = - `v¢´štf -( -¬g --> -”rbuf -, -maxËn -, -fmt -, -­ -); - -54 - `va_’d -( -­ -); - -55 if( -vËn - >ð -maxËn -) { - -56 -¬g --> -”rbuf -[ -maxËn --1] = '\0'; - -57 -¬g --> -”¾’ - = -maxËn - - 1; - -59 } if( -vËn - >= 0) { - -60 -¬g --> -”rbuf -[ -vËn -] = '\0'; - -61 -¬g --> -”¾’ - = -vËn -; - -66 -vËn - = ("") - 1; - -67 -maxËn ---; - -68 -¬g --> -”¾’ - = -vËn - < -maxËn - ? vlen : maxlen; - -69 - `memýy -( -¬g --> -”rbuf -, "",‡rg-> -”¾’ -); - -70 -¬g --> -”rbuf -[¬g-> -”¾’ -] = 0; - -74 - } -} - -77 - $a¢_check_cÚ¡¿šts -(cÚ¡ -a¢_TYPE_desütÜ_t - * -ty³_desütÜ -, - -78 cÚ¡ * -¡ruù_±r -, * -”rbuf -, -size_t - * -”¾’ -) { - -79  -”rbufDesc - -¬g -; - -80  -»t -; - -82 -¬g -. -çžed_ty³ - = 0; - -83 -¬g -. -çžed_¡ruù_±r - = 0; - -84 -¬g -. -”rbuf - =ƒrrbuf; - -85 -¬g -. -”¾’ - =ƒrrlen ? *errlen : 0; - -87 -»t - = -ty³_desütÜ --> -’codšg_cÚ¡¿šts -. - `g’”®_cÚ¡¿šts -( - -88 -ty³_desütÜ -, -¡ruù_±r -, -_a¢_i_ùçžcb -, & -¬g -); - -89 if( -»t - =ð-1 && -”¾’ -è*”¾’ = -¬g -.errlen; - -91  -»t -; - -92 - } -} - - @der_encoder.c - -5  - ~ - -6  - ~<”ºo.h -> - -8  -ssize_t - -d”_wr™e_TL -( -b”_Žv_g_t - -g -, -b”_Žv_Ën_t - -Ën -, - -9 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -,  -cÚ¡ruùed -); - -14 -a¢_’c_rv®_t - - -15 - $d”_’code -(cÚ¡ -a¢_TYPE_desütÜ_t - * -ty³_desütÜ -, cÚ¡ * -¡ruù_±r -, - -16 -a¢_­p_cÚsume_by‹s_f - * -cÚsume_by‹s -, * -­p_key -) { - -17 - `ASN_DEBUG -("DERƒncoder invoked for %s", - -18 -ty³_desütÜ --> -Çme -); - -23  -ty³_desütÜ --> -Ý --> - `d”_’cod” -( - -24 -ty³_desütÜ -, -¡ruù_±r -, - -25 0, 0, -cÚsume_by‹s -, -­p_key -); - -26 - } -} - -31  - s’c_to_buf_¬g - { - -32 * - mbufãr -; - -33 -size_t - - mËá -; - -34 } - t’c_to_buf_¬g -; - -35  - $’code_to_bufãr_cb -(cÚ¡ * -bufãr -, -size_t - -size -, * -key -) { - -36 -’c_to_buf_¬g - * -¬g - = (’c_to_buf_¬g *) -key -; - -38 if( -¬g --> -Ëá - < -size -) - -41 - `memýy -( -¬g --> -bufãr -, bufãr, -size -); - -42 -¬g --> -bufãr - = ((*ïrg->bufãrè+ -size -; - -43 -¬g --> -Ëá - -ð -size -; - -46 - } -} - -51 -a¢_’c_rv®_t - - -52 - $d”_’code_to_bufãr -(cÚ¡ -a¢_TYPE_desütÜ_t - * -ty³_desütÜ -, - -53 cÚ¡ * -¡ruù_±r -, * -bufãr -, -size_t - -bufãr_size -) { - -54 -’c_to_buf_¬g - -¬g -; - -55 -a¢_’c_rv®_t - -ec -; - -57 -¬g -. -bufãr - = buffer; - -58 -¬g -. -Ëá - = -bufãr_size -; - -60 -ec - = -ty³_desütÜ --> -Ý --> - `d”_’cod” -(type_descriptor, - -61 -¡ruù_±r -, - -62 0, 0, -’code_to_bufãr_cb -, & -¬g -); - -63 if( -ec -. -’coded - != -1) { - -64 - `as£¹ -( -ec -. -’coded - =ð( -ssize_t -)( -bufãr_size - - -¬g -. -Ëá -)); - -67  -ec -; - -68 - } -} - -74 -ssize_t - - -75 - $d”_wr™e_gs -(cÚ¡ -a¢_TYPE_desütÜ_t - * -sd -, -size_t - -¡ruù_Ëngth -, - -76  -g_mode -,  -Ï¡_g_fÜm -, - -77 -b”_Žv_g_t - -g -, - -78 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -79  - #ASN1_DER_MAX_TAGS_COUNT - 4 - - ) - -80 -b”_Žv_g_t - - -81 -gs_buf_sü©ch -[ -ASN1_DER_MAX_TAGS_COUNT - * ( -b”_Žv_g_t -)]; - -82 -ssize_t - -Ëns -[ -ASN1_DER_MAX_TAGS_COUNT - * (ssize_t)]; - -83 cÚ¡ -b”_Žv_g_t - * -gs -; - -84  -gs_couÁ -; - -85 -size_t - -ov”®l_Ëngth -; - -86  -i -; - -88 - `ASN_DEBUG -("Writingags (%s,m=%d,c=%d,ag=%s, mtc=%d)", - -89 -sd --> -Çme -, -g_mode -, sd-> -gs_couÁ -, - -90 - `b”_Žv_g_¡ršg -( -g -), - -91 -g_mode - - -92 ?( -sd --> -gs_couÁ -+1 - -93 -(( -g_mode - =ð-1è&& -sd --> -gs_couÁ -)) - -94 : -sd --> -gs_couÁ - - -97 if( -sd --> -gs_couÁ - + 1 > -ASN1_DER_MAX_TAGS_COUNT -) { - -98 - `ASN_DEBUG -("Sy¡em†im™ %d oÀg couÁ", -ASN1_DER_MAX_TAGS_COUNT -); - -102 if( -g_mode -) { - -108  -¡ag_off£t -; - -109 -b”_Žv_g_t - * -gs_buf - = -gs_buf_sü©ch -; - -110 -gs_couÁ - = -sd -->tags_count - -112 - (( -g_mode - =ð-1è&& -sd --> -gs_couÁ -); - -114 -gs_buf -[0] = -g -; - -115 -¡ag_off£t - = -1 + (( -g_mode - =ð-1è&& -sd --> -gs_couÁ -); - -116  -i - = 1; i < -gs_couÁ -; i++) - -117 -gs_buf -[ -i -] = -sd --> -gs -[˜+ -¡ag_off£t -]; - -118 -gs - = -gs_buf -; - -120 -gs - = -sd -->tags; - -121 -gs_couÁ - = -sd -->tags_count; - -125 if( -gs_couÁ - == 0) - -132 -ov”®l_Ëngth - = -¡ruù_Ëngth -; - -133  -i - = -gs_couÁ - - 1; i >= 0; --i) { - -134 -Ëns -[ -i -] = - `d”_wr™e_TL -( -gs -[i], -ov”®l_Ëngth -, 0, 0, 0); - -135 if( -Ëns -[ -i -] == -1)  -1; - -136 -ov”®l_Ëngth - +ð -Ëns -[ -i -]; - -137 -Ëns -[ -i -] = -ov”®l_Ëngth - -†ens[i]; - -140 if(! -cb -è -ov”®l_Ëngth - - -¡ruù_Ëngth -; - -142 - `ASN_DEBUG -("Encodšg % TL sequ’û (%dƒËm’ts)", -sd --> -Çme -, - -143 -gs_couÁ -); - -148  -i - = 0; i < -gs_couÁ -; i++) { - -149 -ssize_t - -Ën -; - -150  -_cÚ¡r -; - -153 -_cÚ¡r - = ( -Ï¡_g_fÜm - || -i - < ( -gs_couÁ - - 1)); - -155 -Ën - = - `d”_wr™e_TL -( -gs -[ -i -], -Ëns -[i], -cb -, -­p_key -, -_cÚ¡r -); - -156 if( -Ën - == -1)  -1; - -159  -ov”®l_Ëngth - - -¡ruù_Ëngth -; - -160 - } -} - -162  -ssize_t - - -163 - $d”_wr™e_TL -( -b”_Žv_g_t - -g -, -b”_Žv_Ën_t - -Ën -, - -164 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -, - -165  -cÚ¡ruùed -) { - -166 -ušt8_t - -buf -[32]; - -167 -size_t - -size - = 0; - -168  -buf_size - = -cb -?( -buf -):0; - -169 -ssize_t - -tmp -; - -172 -tmp - = - `b”_Žv_g_£rŸlize -( -g -, -buf -, -buf_size -); - -173 if( -tmp - =ð-1 ||m°> ( -ssize_t -)( -buf -))  -1; - -174 -size - +ð -tmp -; - -177 -tmp - = - `d”_Žv_Ëngth_£rŸlize -( -Ën -, -buf -+ -size -, -buf_size -?buf_size-size:0); - -178 if( -tmp - == -1)  -1; - -179 -size - +ð -tmp -; - -181 if( -size - > ( -buf -)) - -187 if( -cb -) { - -188 if( -cÚ¡ruùed -è* -buf - |= 0x20; - -189 if( - `cb -( -buf -, -size -, -­p_key -) < 0) - -193  -size -; - -194 - } -} - - @oer_decoder.c - -5  - ~ - -6  - ~ - -11 -a¢_dec_rv®_t - - -12 - $Ûr_decode -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -13 cÚ¡ -a¢_TYPE_desütÜ_t - * -ty³_desütÜ -, ** -¡ruù_±r -, - -14 cÚ¡ * -±r -, -size_t - -size -) { - -15 -a¢_codec_ùx_t - -s_codec_ùx -; - -21 if( -Ýt_codec_ùx -) { - -22 if( -Ýt_codec_ùx --> -max_¡ack_size -) { - -23 -s_codec_ùx - = * -Ýt_codec_ùx -; - -24 -Ýt_codec_ùx - = & -s_codec_ùx -; - -28 - `mem£t -(& -s_codec_ùx -, 0, (s_codec_ctx)); - -29 -s_codec_ùx -. -max_¡ack_size - = -ASN__DEFAULT_STACK_MAX -; - -30 -Ýt_codec_ùx - = & -s_codec_ùx -; - -36  -ty³_desütÜ --> -Ý --> - `Ûr_decod” -( -Ýt_codec_ùx -,ype_descriptor, 0, - -37 -¡ruù_±r -, - -38 -±r -, -size - - -40 - } -} - -46 -ssize_t - - -47 - $Ûr_ݒ_ty³_sk -(cÚ¡ * -buåŒ -, -size_t - -size -) { - -48 -size_t - -Ën - = 0; - -49  - `Ûr_ãtch_Ëngth -( -buåŒ -, -size -, & -Ën -); - -50 - } -} - -59 -ssize_t - - -60 - $Ûr_ݒ_ty³_g‘ -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -61 cÚ¡  -a¢_TYPE_desütÜ_s - * -td -, - -62 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¡ruù_±r -, - -63 cÚ¡ * -buåŒ -, -size_t - -size -) { - -64 -a¢_dec_rv®_t - -dr -; - -65 -size_t - -cڏš”_Ën - = 0; - -66 -ssize_t - -Ën_Ën -; - -67 -a¢_¡ruù_ä“_m‘hod - -di¥o£_m‘hod - = - -68 (* -¡ruù_±r -è? -ASFM_FREE_UNDERLYING_AND_RESET - : -ASFM_FREE_EVERYTHING -; - -71 -Ën_Ën - = - `Ûr_ãtch_Ëngth -( -buåŒ -, -size -, & -cڏš”_Ën -); - -72 if( -Ën_Ën - <= 0) { - -73  -Ën_Ën -; - -80 if( -size - - -Ën_Ën - < -cڏš”_Ën -) { - -85 -dr - = -td --> -Ý --> - `Ûr_decod” -( -Ýt_codec_ùx -,d, -cÚ¡¿šts -, -¡ruù_±r -, - -86 (cÚ¡ -ušt8_t - *) -buåŒ - + -Ën_Ën -, -cڏš”_Ën -); - -87 if( -dr -. -code - =ð -RC_OK -) { - -88  -Ën_Ën - + -cڏš”_Ën -; - -91 -td --> -Ý --> - `ä“_¡ruù -Ñd, * -¡ruù_±r -, -di¥o£_m‘hod -); - -92 * -¡ruù_±r - = -NULL -; - -95 - } -} - -98 -a¢_dec_rv®_t - - -99 - $Ûr_decode_´im™ive -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -100 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -101 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -102 cÚ¡ * -±r -, -size_t - -size -) { - -103 -ASN__PRIMITIVE_TYPE_t - * -¡ - = (ASN__PRIMITIVE_TYPE_ˆ*)* -¥Œ -; - -104 -a¢_dec_rv®_t - -rv® - = { -RC_OK -, 0}; - -105 -size_t - -ex³ùed_Ëngth - = 0; - -106 -ssize_t - -Ën_Ën -; - -108 () -td -; - -109 () -Ýt_codec_ùx -; - -110 () -cÚ¡¿šts -; - -112 if(! -¡ -) { - -113 -¡ - = ( -ASN__PRIMITIVE_TYPE_t - *)(* -¥Œ - = - `CALLOC -( - -114 1, ( -ASN__PRIMITIVE_TYPE_t -))); - -115 if(! -¡ -è -ASN__DECODE_FAILED -; - -124 -Ën_Ën - = - `Ûr_ãtch_Ëngth -( -±r -, -size -, & -ex³ùed_Ëngth -); - -125 if( -Ën_Ën - > 0) { - -126 -rv® -. -cÚsumed - = -Ën_Ën -; - -127 -±r - = (cÚ¡ *íŒ + -Ën_Ën -; - -128 -size - -ð -Ën_Ën -; - -129 } if( -Ën_Ën - == 0) { - -130 -ASN__DECODE_STARVED -; - -131 } if( -Ën_Ën - < 0) { - -132 -ASN__DECODE_FAILED -; - -135 if( -size - < -ex³ùed_Ëngth -) { - -136 -ASN__DECODE_STARVED -; - -138 -ušt8_t - * -buf - = - `MALLOC -( -ex³ùed_Ëngth - + 1); - -139 if( -buf - =ð -NULL -) { - -140 -ASN__DECODE_FAILED -; - -142 - `memýy -( -buf -, -±r -, -ex³ùed_Ëngth -); - -143 -buf -[ -ex³ùed_Ëngth -] = '\0'; - -145 - `FREEMEM -( -¡ --> -buf -); - -146 -¡ --> -buf - = buf; - -147 -¡ --> -size - = -ex³ùed_Ëngth -; - -149 -rv® -. -cÚsumed - +ð -ex³ùed_Ëngth -; - -150  -rv® -; - -152 - } -} - - @oer_encoder.c - -5  - ~ - -6  - ~ - -11 -a¢_’c_rv®_t - - -12 - $Ûr_’code -(cÚ¡ -a¢_TYPE_desütÜ_t - * -ty³_desütÜ -, cÚ¡ * -¡ruù_±r -, - -13 -a¢_­p_cÚsume_by‹s_f - * -cÚsume_by‹s -, * -­p_key -) { - -14 - `ASN_DEBUG -("OERƒncod” invoked fÜ %s", -ty³_desütÜ --> -Çme -); - -19  -ty³_desütÜ --> -Ý --> - `Ûr_’cod” -( - -20 -ty³_desütÜ -, 0, - -21 -¡ruù_±r -, - -22 -cÚsume_by‹s -, -­p_key -); - -23 - } -} - -28  - s’c_to_buf_¬g - { - -29 * - mbufãr -; - -30 -size_t - - mËá -; - -31 } - t’c_to_buf_¬g -; - -33 - $’code_to_bufãr_cb -(cÚ¡ * -bufãr -, -size_t - -size -, * -key -) { - -34 -’c_to_buf_¬g - * -¬g - = (’c_to_buf_¬g *) -key -; - -36 if( -¬g --> -Ëá - < -size -)  -1; - -38 - `memýy -( -¬g --> -bufãr -, bufãr, -size -); - -39 -¬g --> -bufãr - = ((*ïrg->bufãrè+ -size -; - -40 -¬g --> -Ëá - -ð -size -; - -43 - } -} - -48 -a¢_’c_rv®_t - - -49 - $Ûr_’code_to_bufãr -(cÚ¡ -a¢_TYPE_desütÜ_t - * -ty³_desütÜ -, - -50 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -51 cÚ¡ * -¡ruù_±r -, - -52 * -bufãr -, - -53 -size_t - -bufãr_size - - -55 -’c_to_buf_¬g - -¬g -; - -56 -a¢_’c_rv®_t - -ec -; - -58 -¬g -. -bufãr - = buffer; - -59 -¬g -. -Ëá - = -bufãr_size -; - -61 if( -ty³_desütÜ --> -Ý --> -Ûr_’cod” - =ð -NULL -) { - -62 -ec -. -’coded - = -1; - -63 -ec -. -çžed_ty³ - = -ty³_desütÜ -; - -64 -ec -. -¡ruùu»_±r - = -¡ruù_±r -; - -65 - `ASN_DEBUG -("OERƒncoder is‚ot defined for %s", - -66 -ty³_desütÜ --> -Çme -); - -68 -ec - = -ty³_desütÜ --> -Ý --> - `Ûr_’cod” -( - -69 -ty³_desütÜ -, -cÚ¡¿šts -, - -70 -¡ruù_±r -, - -71 -’code_to_bufãr_cb -, & -¬g -); - -72 if( -ec -. -’coded - != -1) { - -73 - `as£¹ -( -ec -. -’coded - =ð( -ssize_t -)( -bufãr_size - - -¬g -. -Ëá -)); - -77  -ec -; - -78 - } -} - -80 -a¢_’c_rv®_t - - -81 - $Ûr_’code_´im™ive -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -82 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -83 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -84 cÚ¡ -ASN__PRIMITIVE_TYPE_t - * -¡ - = (cÚ¡ ASN__PRIMITIVE_TYPE_ˆ*) -¥Œ -; - -85 -a¢_’c_rv®_t - -” - = {0, 0, 0}; - -86 -ssize_t - -»t -; - -88 () -cÚ¡¿šts -; - -90 if(! -¡ -è -ASN__ENCODE_FAILED -; - -92 - `ASN_DEBUG -("Encodšg % (%" -ASN_PRI_SIZE - " by‹s)", -td - ?d-> -Çme - : "", -¡ --> -size -); - -97 -»t - = - `Ûr_£rŸlize_Ëngth -( -¡ --> -size -, -cb -, -­p_key -); - -98 if( -»t - < 0) { - -99 -ASN__ENCODE_FAILED -; - -101 -” -. -’coded - +ð -»t -; - -103 -” -. -’coded - +ð -¡ --> -size -; - -104 if( - `cb -( -¡ --> -buf -, st-> -size -, -­p_key -) < 0) { - -105 -ASN__ENCODE_FAILED -; - -107 - `ASN__ENCODED_OK -( -” -); - -109 - } -} - -112 - $Ûr__couÁ_by‹s -(cÚ¡ * -bufãr -, -size_t - -size -, * -by‹s_±r -) { - -113 -size_t - * -by‹s - = -by‹s_±r -; - -114 () -bufãr -; - -115 * -by‹s - +ð -size -; - -117 - } -} - -119 -ssize_t - - -120 - $Ûr_ݒ_ty³_put -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -121 cÚ¡ -a¢_Ûr_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -122 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -123 -size_t - -£rŸlized_by‹_couÁ - = 0; - -124 -a¢_’c_rv®_t - -” - = {0,0,0}; - -125 -ssize_t - -Ën_Ën -; - -127 -” - = -td --> -Ý --> - `Ûr_’cod” -Ñd, -cÚ¡¿šts -, -¥Œ -, -Ûr__couÁ_by‹s -, - -128 & -£rŸlized_by‹_couÁ -); - -129 if( -” -. -’coded - < 0)  -1; - -130 - `as£¹ -( -£rŸlized_by‹_couÁ - =ð( -size_t -) -” -. -’coded -); - -132 -Ën_Ën - = - `Ûr_£rŸlize_Ëngth -( -£rŸlized_by‹_couÁ -, -cb -, -­p_key -); - -133 if( -Ën_Ën - == -1)  -1; - -135 -” - = -td --> -Ý --> - `Ûr_’cod” -Ñd, -cÚ¡¿šts -, -¥Œ -, -cb -, -­p_key -); - -136 if( -” -. -’coded - < 0)  -1; - -137 - `as£¹ -( -£rŸlized_by‹_couÁ - =ð( -size_t -) -” -. -’coded -); - -139  -Ën_Ën - + -” -. -’coded -; - -140 - } -} - - @oer_support.c - -6  - ~ - -7  - ~ - -9  - ~<Ûr_suµÜt.h -> - -18 -ssize_t - - -19 - $Ûr_ãtch_Ëngth -(cÚ¡ * -buåŒ -, -size_t - -size -, size_ˆ* -Ën_r -) { - -20 -ušt8_t - -fœ¡_by‹ -; - -21 -size_t - -Ën_Ën -; - -22 cÚ¡ -ušt8_t - * -b -; - -23 cÚ¡ -ušt8_t - * -b’d -; - -24 -size_t - -Ën -; - -26 if( -size - == 0) { - -27 * -Ën_r - = 0; - -31 -fœ¡_by‹ - = *(cÚ¡ -ušt8_t - *) -buåŒ -; - -32 if(( -fœ¡_by‹ - & 0x80) == 0) { - -33 * -Ën_r - = -fœ¡_by‹ -; - -37 -Ën_Ën - = ( -fœ¡_by‹ - & 0x7f); - -38 if((1 + -Ën_Ën -è> -size -) { - -39 * -Ën_r - = 0; - -43 -b - = (cÚ¡ -ušt8_t - *) -buåŒ - + 1; - -44 -b’d - = -b - + -Ën_Ën -; - -46 ; -b - < -b’d - && *b == 0; b++) { - -50 if(( -b’d - - -b -è> ( -ssize_t -)( -size_t -)) { - -52 * -Ën_r - = 0; - -56  -Ën - = 0; -b - < -b’d -; b++) { - -57 -Ën - = (ËÀ<< 8è+ * -b -; - -60 if( -Ën - > -RSIZE_MAX -) { - -61 * -Ën_r - = 0; - -65 * -Ën_r - = -Ën -; - -66 - `as£¹ -( -Ën_Ën - + 1 =ð( -size_t -)( -b’d - - (cÚ¡ -ušt8_t - *) -buåŒ -)); - -67  -Ën_Ën - + 1; - -68 - } -} - -75 -ssize_t - - -76 - $Ûr_£rŸlize_Ëngth -( -size_t - -Ëngth -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -77 * -­p_key -) { - -78 -ušt8_t - -sü©ch -[1 + ( -Ëngth -)]; - -79 -ušt8_t - * -¥ - = -sü©ch -; - -80  -l™ŽeEndŸn - = 1; - -81 cÚ¡ -ušt8_t - * -p¡¬t -; - -82 cÚ¡ -ušt8_t - * -³nd -; - -83 cÚ¡ -ušt8_t - * -p -; - -84  -add -; - -86 if( -Ëngth - <= 127) { - -87 -ušt8_t - -b - = -Ëngth -; - -88 if( - `cb -(& -b -, 1, -­p_key -) < 0) { - -94 if(*(*)& -l™ŽeEndŸn -) { - -95 -p¡¬t - = (cÚ¡ -ušt8_t - *)& -Ëngth - + (length) - 1; - -96 -³nd - = (cÚ¡ -ušt8_t - *)& -Ëngth -; - -97 -add - = -1; - -99 -p¡¬t - = (cÚ¡ -ušt8_t - *)& -Ëngth -; - -100 -³nd - = -p¡¬t - + ( -Ëngth -); - -101 -add - = 1; - -104  -p - = -p¡¬t -;… !ð -³nd -;… +ð -add -) { - -106 if(* -p -) ; - -109  -¥ - = -sü©ch - + 1; ; -p - +ð -add -) { - -110 * -¥ -++ = * -p -; - -111 if( -p - =ð -³nd -) ; - -113 - `as£¹ -(( -¥ - - -sü©ch -) - 1 <= 0x7f); - -114 -sü©ch -[0] = 0x80 + (( -¥ - - scratch) - 1); - -116 if( - `cb -( -sü©ch -, -¥ - - sü©ch, -­p_key -) < 0) { - -120  -¥ - - -sü©ch -; - -121 - } -} - - @per_decoder.c - -1  - ~ - -2  - ~ - -3  - ~<³r_decod”.h -> - -10 -a¢_dec_rv®_t - - -11 - $u³r_decode_com¶‘e -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -12 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -13 cÚ¡ * -bufãr -, -size_t - -size -) { - -14 -a¢_dec_rv®_t - -rv® -; - -16 -rv® - = - `u³r_decode -( -Ýt_codec_ùx -, -td -, -¥Œ -, -bufãr -, -size -, 0, 0); - -17 if( -rv® -. -cÚsumed -) { - -22 -rv® -. -cÚsumed - += 7; - -23 -rv® -. -cÚsumed - >>= 3; - -24 } if( -rv® -. -code - =ð -RC_OK -) { - -25 if( -size -) { - -26 if(((cÚ¡ -ušt8_t - *) -bufãr -)[0] == 0) { - -27 -rv® -. -cÚsumed - = 1; - -29 - `ASN_DEBUG -("Expecting single zeroed byte"); - -30 -rv® -. -code - = -RC_FAIL -; - -34 -rv® -. -code - = -RC_WMORE -; - -38  -rv® -; - -39 - } -} - -41 -a¢_dec_rv®_t - - -42 - $u³r_decode -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -43 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, cÚ¡ * -bufãr -, - -44 -size_t - -size -,  -sk_b™s -,  -unu£d_b™s -) { - -45 -a¢_codec_ùx_t - -s_codec_ùx -; - -46 -a¢_dec_rv®_t - -rv® -; - -47 -a¢_³r_d©a_t - -pd -; - -49 if( -sk_b™s - < 0 || skip_bits > 7 - -50 || -unu£d_b™s - < 0 || unused_bits > 7 - -51 || ( -unu£d_b™s - > 0 && ! -size -)) - -52 -ASN__DECODE_FAILED -; - -58 if( -Ýt_codec_ùx -) { - -59 if( -Ýt_codec_ùx --> -max_¡ack_size -) { - -60 -s_codec_ùx - = * -Ýt_codec_ùx -; - -61 -Ýt_codec_ùx - = & -s_codec_ùx -; - -65 - `mem£t -(& -s_codec_ùx -, 0, (s_codec_ctx)); - -66 -s_codec_ùx -. -max_¡ack_size - = -ASN__DEFAULT_STACK_MAX -; - -67 -Ýt_codec_ùx - = & -s_codec_ùx -; - -71 - `mem£t -(& -pd -, 0, (pd)); - -72 -pd -. -bufãr - = (cÚ¡ -ušt8_t - *)buffer; - -73 -pd -. -nboff - = -sk_b™s -; - -74 -pd -. -nb™s - = 8 * -size - - -unu£d_b™s -; - -75 if( -pd -. -nboff - >…d. -nb™s -) - -76 -ASN__DECODE_FAILED -; - -81 if(! -td --> -Ý --> -u³r_decod” -) - -82 -ASN__DECODE_FAILED -; - -83 -rv® - = -td --> -Ý --> - `u³r_decod” -( -Ýt_codec_ùx -,d, 0, -¥Œ -, & -pd -); - -84 if( -rv® -. -code - =ð -RC_OK -) { - -86 -rv® -. -cÚsumed - = (( -pd -. -bufãr - - (cÚ¡ -ušt8_t - *)buffer) << 3) - -87 + -pd -. -nboff - - -sk_b™s -; - -88 - `ASN_DEBUG -("PER decoding consumed %ld, counted %ld", - -89 () -rv® -. -cÚsumed -, () -pd -. -moved -); - -90 - `as£¹ -( -rv® -. -cÚsumed - =ð -pd -. -moved -); - -93 -rv® -. -cÚsumed - = 0; - -95  -rv® -; - -96 - } -} - -98 -a¢_dec_rv®_t - - -99 - $­”_decode_com¶‘e -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -100 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, - -101 cÚ¡ * -bufãr -, -size_t - -size -) { - -102 -a¢_dec_rv®_t - -rv® -; - -104 -rv® - = - `­”_decode -( -Ýt_codec_ùx -, -td -, -¥Œ -, -bufãr -, -size -, 0, 0); - -105 if( -rv® -. -cÚsumed -) { - -110 -rv® -. -cÚsumed - += 7; - -111 -rv® -. -cÚsumed - >>= 3; - -112 } if( -rv® -. -code - =ð -RC_OK -) { - -113 if( -size -) { - -114 if(((cÚ¡ -ušt8_t - *) -bufãr -)[0] == 0) { - -115 -rv® -. -cÚsumed - = 1; - -117 - `ASN_DEBUG -("Expecting single zeroed byte"); - -118 -rv® -. -code - = -RC_FAIL -; - -122 -rv® -. -code - = -RC_WMORE -; - -126  -rv® -; - -127 - } -} - -129 -a¢_dec_rv®_t - - -130 - $­”_decode -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -131 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¥Œ -, cÚ¡ * -bufãr -, - -132 -size_t - -size -,  -sk_b™s -,  -unu£d_b™s -) { - -133 -a¢_codec_ùx_t - -s_codec_ùx -; - -134 -a¢_dec_rv®_t - -rv® -; - -135 -a¢_³r_d©a_t - -pd -; - -137 if( -sk_b™s - < 0 || skip_bits > 7 - -138 || -unu£d_b™s - < 0 || unused_bits > 7 - -139 || ( -unu£d_b™s - > 0 && ! -size -)) - -140 -ASN__DECODE_FAILED -; - -146 if( -Ýt_codec_ùx -) { - -147 if( -Ýt_codec_ùx --> -max_¡ack_size -) { - -148 -s_codec_ùx - = * -Ýt_codec_ùx -; - -149 -Ýt_codec_ùx - = & -s_codec_ùx -; - -153 - `mem£t -(& -s_codec_ùx -, 0, (s_codec_ctx)); - -154 -s_codec_ùx -. -max_¡ack_size - = -ASN__DEFAULT_STACK_MAX -; - -155 -Ýt_codec_ùx - = & -s_codec_ùx -; - -159 - `mem£t -(& -pd -, 0, (pd)); - -160 -pd -. -bufãr - = (cÚ¡ -ušt8_t - *)buffer; - -161 -pd -. -nboff - = -sk_b™s -; - -162 -pd -. -nb™s - = 8 * -size - - -unu£d_b™s -; - -163 if( -pd -. -nboff - >…d. -nb™s -) - -164 -ASN__DECODE_FAILED -; - -169 if(! -td --> -Ý --> -­”_decod” -) - -170 -ASN__DECODE_FAILED -; - -171 -rv® - = -td --> -Ý --> - `­”_decod” -( -Ýt_codec_ùx -,d, 0, -¥Œ -, & -pd -); - -172 if( -rv® -. -code - =ð -RC_OK -) { - -174 -rv® -. -cÚsumed - = (( -pd -. -bufãr - - (cÚ¡ -ušt8_t - *)buffer) << 3) - -175 + -pd -. -nboff - - -sk_b™s -; - -176 - `ASN_DEBUG -("PER decoding consumed %zu, counted %zu", - -177 -rv® -. -cÚsumed -, -pd -. -moved -); - -178 - `as£¹ -( -rv® -. -cÚsumed - =ð -pd -. -moved -); - -181 -rv® -. -cÚsumed - = 0; - -183  -rv® -; - -184 - } -} - - @per_encoder.c - -1  - ~ - -2  - ~ - -3  - ~<³r_’cod”.h -> - -5  -_u³r_’code_æush_ou -( -a¢_³r_ou_t - * -po -); - -8 - $ignÜe_ouut -(cÚ¡ * -d©a -, -size_t - -size -, * -­p_key -) { - -9 () -d©a -; - -10 () -size -; - -11 () -­p_key -; - -13 - } -} - -15 -a¢_’c_rv®_t - - -16 - $u³r_’code -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -17 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -18 -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -19 -a¢_³r_ou_t - -po -; - -20 -a¢_’c_rv®_t - -” - = {0,0,0}; - -25 if(! -td - || !td-> -Ý --> -u³r_’cod” -) - -26 -ASN__ENCODE_FAILED -; - -28 -po -. -bufãr - =…o. -tmp¥aû -; - -29 -po -. -nboff - = 0; - -30 -po -. -nb™s - = 8 * Õo. -tmp¥aû -); - -31 -po -. -ouut - = -cb - ? cb : -ignÜe_ouut -; - -32 -po -. -Ý_key - = -­p_key -; - -33 -po -. -æushed_by‹s - = 0; - -35 -” - = -td --> -Ý --> - `u³r_’cod” -Ñd, -cÚ¡¿šts -, -¥Œ -, & -po -); - -36 if( -” -. -’coded - != -1) { - -37 -size_t - -b™s_to_æush -; - -39 -b™s_to_æush - = (( -po -. -bufãr - -…o. -tmp¥aû -è<< 3è+…o. -nboff -; - -42 -” -. -’coded - = ( -po -. -æushed_by‹s - << 3è+ -b™s_to_æush -; - -44 if( - `_u³r_’code_æush_ou -(& -po -)è -ASN__ENCODE_FAILED -; - -47  -” -; - -48 - } -} - -53  - s’c_to_buf_¬g - { - -54 * - mbufãr -; - -55 -size_t - - mËá -; - -56 } - t’c_to_buf_¬g -; - -57  - $’code_to_bufãr_cb -(cÚ¡ * -bufãr -, -size_t - -size -, * -key -) { - -58 -’c_to_buf_¬g - * -¬g - = (’c_to_buf_¬g *) -key -; - -60 if( -¬g --> -Ëá - < -size -) - -63 - `memýy -( -¬g --> -bufãr -, bufãr, -size -); - -64 -¬g --> -bufãr - = ((*ïrg->bufãrè+ -size -; - -65 -¬g --> -Ëá - -ð -size -; - -68 - } -} - -70 -a¢_’c_rv®_t - - -71 - $u³r_’code_to_bufãr -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -72 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -73 cÚ¡ * -¥Œ -, * -bufãr -, -size_t - -bufãr_size -) { - -74 -’c_to_buf_¬g - -key -; - -76 -key -. -bufãr - = buffer; - -77 -key -. -Ëá - = -bufãr_size -; - -79 if( -td -è - `ASN_DEBUG -("Encodšg \"%s\" usšg UNALIGNED PER",d-> -Çme -); - -81  - `u³r_’code -( -td -, -cÚ¡¿šts -, -¥Œ -, -’code_to_bufãr_cb -, & -key -); - -82 - } -} - -84  - s’c_dyn_¬g - { - -85 * - mbufãr -; - -86 -size_t - - mËngth -; - -87 -size_t - - m®loÿ‹d -; - -88 } - t’c_dyn_¬g -; - -90 - $’code_dyn_cb -(cÚ¡ * -bufãr -, -size_t - -size -, * -key -) { - -91 -’c_dyn_¬g - * -¬g - = -key -; - -92 if( -¬g --> -Ëngth - + -size - >ð¬g-> -®loÿ‹d -) { - -93 -size_t - -Ãw_size - = -¬g --> -®loÿ‹d - ?‡rg->allocated : 8; - -94 * -p -; - -97 -Ãw_size - <<= 2; - -98 }  -¬g --> -Ëngth - + -size - >ð -Ãw_size -); - -100 -p - = - `REALLOC -( -¬g --> -bufãr -, -Ãw_size -); - -101 if(! -p -) { - -102 - `FREEMEM -( -¬g --> -bufãr -); - -103 - `mem£t -( -¬g -, 0, (*arg)); - -106 -¬g --> -bufãr - = -p -; - -107 -¬g --> -®loÿ‹d - = -Ãw_size -; - -109 - `memýy -(((*) -¬g --> -bufãr -è+‡rg-> -Ëngth -, bufãr, -size -); - -110 -¬g --> -Ëngth - +ð -size -; - -112 - } -} - -113 -ssize_t - - -114 - $u³r_’code_to_Ãw_bufãr -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -115 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -116 cÚ¡ * -¥Œ -, ** -bufãr_r -) { - -117 -a¢_’c_rv®_t - -” - = {0,0,0}; - -118 -’c_dyn_¬g - -key -; - -120 - `mem£t -(& -key -, 0, (key)); - -122 -” - = - `u³r_’code -( -td -, -cÚ¡¿šts -, -¥Œ -, -’code_dyn_cb -, & -key -); - -123  -” -. -’coded -) { - -125 - `FREEMEM -( -key -. -bufãr -); - -128 - `FREEMEM -( -key -. -bufãr -); - -129 -key -. -bufãr - = - `MALLOC -(1); - -130 if( -key -. -bufãr -) { - -131 *(*) -key -. -bufãr - = '\0'; - -132 * -bufãr_r - = -key -. -bufãr -; - -138 * -bufãr_r - = -key -. -bufãr -; - -139 - `ASN_DEBUG -("Com¶‘’coded iÀ%ld b™s", () -” -. -’coded -); - -140  (( -” -. -’coded - + 7) >> 3); - -142 - } -} - -150 - $_u³r_’code_æush_ou -( -a¢_³r_ou_t - * -po -) { - -151 -ušt8_t - * -buf -; - -153 if( -po --> -nboff - =ð0 &&…o-> -bufãr - =ðpo-> -tmp¥aû -) - -156 -buf - = -po --> -bufãr - + (po-> -nboff - >> 3); - -158 if( -po --> -nboff - & 0x07) { - -159 -buf -[0] &ð0xfà<< (8 - ( -po --> -nboff - & 0x07)); - -160 -buf -++; - -163  -po --> - `ouut -Õo-> -tmp¥aû -, -buf - -…o->tmp¥aû,…o-> -Ý_key -); - -164 - } -} - -166 -a¢_’c_rv®_t - - -167 - $­”_’code_to_bufãr -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -168 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -169 cÚ¡ * -¥Œ -, * -bufãr -, -size_t - -bufãr_size -) { - -170 -’c_to_buf_¬g - -key -; - -172 -key -. -bufãr - = buffer; - -173 -key -. -Ëá - = -bufãr_size -; - -175 if( -td -è - `ASN_DEBUG -("Encodšg \"%s\" usšg ALIGNED PER",d-> -Çme -); - -177  - `­”_’code -( -td -, -cÚ¡¿šts -, -¥Œ -, -’code_to_bufãr_cb -, & -key -); - -178 - } -} - -180 -ssize_t - - -181 - $­”_’code_to_Ãw_bufãr -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -182 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -183 cÚ¡ * -¥Œ -, ** -bufãr_r -) { - -184 -a¢_’c_rv®_t - -” - = {0,0,0}; - -185 -’c_dyn_¬g - -key -; - -187 - `mem£t -(& -key -, 0, (key)); - -189 -” - = - `­”_’code -( -td -, -cÚ¡¿šts -, -¥Œ -, -’code_dyn_cb -, & -key -); - -190  -” -. -’coded -) { - -192 - `FREEMEM -( -key -. -bufãr -); - -195 - `FREEMEM -( -key -. -bufãr -); - -196 -key -. -bufãr - = - `MALLOC -(1); - -197 if( -key -. -bufãr -) { - -198 *(*) -key -. -bufãr - = '\0'; - -199 * -bufãr_r - = -key -. -bufãr -; - -205 * -bufãr_r - = -key -. -bufãr -; - -206 - `ASN_DEBUG -("Com¶‘’coded iÀ%ld b™s", () -” -. -’coded -); - -207  (( -” -. -’coded - + 7) >> 3); - -209 - } -} - -212 - $_­”_’code_æush_ou -( -a¢_³r_ou_t - * -po -) { - -213 -ušt8_t - * -buf -; - -215 if( -po --> -nboff - =ð0 &&…o-> -bufãr - =ðpo-> -tmp¥aû -) - -218 -buf - = -po --> -bufãr - + (po-> -nboff - >> 3); - -220 if( -po --> -nboff - & 0x07) { - -221 -buf -[0] &ð0xfà<< (8 - ( -po --> -nboff - & 0x07)); - -222 -buf -++; - -225 ià( -po --> -ouut -) { - -226  -po --> - `ouut -Õo-> -tmp¥aû -, -buf - -…o->tmp¥aû,…o-> -Ý_key -); - -229 - } -} - -231 -a¢_’c_rv®_t - - -232 - $­”_’code -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -233 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -234 cÚ¡ * -¥Œ -, -a¢_­p_cÚsume_by‹s_f - * -cb -, * -­p_key -) { - -235 -a¢_³r_ou_t - -po -; - -236 -a¢_’c_rv®_t - -” - = {0,0,0}; - -241 if(! -td - || !td-> -Ý --> -­”_’cod” -) - -242 -ASN__ENCODE_FAILED -; - -244 -po -. -bufãr - =…o. -tmp¥aû -; - -245 -po -. -nboff - = 0; - -246 -po -. -nb™s - = 8 * Õo. -tmp¥aû -); - -247 -po -. -ouut - = -cb -; - -248 -po -. -Ý_key - = -­p_key -; - -249 -po -. -æushed_by‹s - = 0; - -251 -” - = -td --> -Ý --> - `­”_’cod” -Ñd, -cÚ¡¿šts -, -¥Œ -, & -po -); - -252 if( -” -. -’coded - != -1) { - -253 -size_t - -b™s_to_æush -; - -255 -b™s_to_æush - = (( -po -. -bufãr - -…o. -tmp¥aû -è<< 3è+…o. -nboff -; - -258 -” -. -’coded - = ( -po -. -æushed_by‹s - << 3è+ -b™s_to_æush -; - -260 if( - `_­”_’code_æush_ou -(& -po -)) - -261 -ASN__ENCODE_FAILED -; - -264  -” -; - -265 - } -} - - @per_opentype.c - -5  - ~ - -6  - ~<³r_suµÜt.h -> - -7  - ~ - -8  - ~<³r_ݒty³.h -> - -10  - su³r_ugÙ_key - { - -11 -a¢_³r_d©a_t - - mÞdpd -; - -12 -size_t - - munþaimed -; - -13 -size_t - - mÙ_moved -; - -14  - m»³© -; - -15 } - tu³r_ugÙ_key -; - -17  -u³r_ugÙ_»fžl -( -a¢_³r_d©a_t - * -pd -); - -18  -³r_sk_b™s -( -a¢_³r_d©a_t - * -pd -,  -sk_nb™s -); - -19  -a¢_dec_rv®_t - -u³r_sÙ_suck -(cÚ¡ -a¢_codec_ùx_t - *, - -20 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -21 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -22 ** -¥Œ -, -a¢_³r_d©a_t - * -pd -); - -29 - $u³r_ݒ_ty³_put -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -30 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, cÚ¡ * -¥Œ -, - -31 -a¢_³r_ou_t - * -po -) { - -32 * -buf -; - -33 * -b±r -; - -34 -ssize_t - -size -; - -36 - `ASN_DEBUG -("O³Àty³…uˆ% ...", -td --> -Çme -); - -38 -size - = - `u³r_’code_to_Ãw_bufãr -( -td -, -cÚ¡¿šts -, -¥Œ -, & -buf -); - -39 if( -size - <= 0)  -1; - -41 - `ASN_DEBUG -("O³Àty³…uˆ% oàËngth %" -ASN_PRI_SSIZE - " + ov”h—d (1by‹?)", -td --> -Çme -, - -42 -size -); - -44 -b±r - = -buf -; - -46  -Ãed_eom - = 0; - -47 -ssize_t - -may_§ve - = - `u³r_put_Ëngth -( -po -, -size -, & -Ãed_eom -); - -48 - `ASN_DEBUG -("P»³ndšg†’gth %" -ASN_PRI_SSIZE - - -49 "Ø% ªd‡ÎowšgØ§v%" -ASN_PRI_SSIZE -, - -50 -size -, -td --> -Çme -, -may_§ve -); - -51 if( -may_§ve - < 0) ; - -52 if( - `³r_put_mªy_b™s -( -po -, -b±r -, -may_§ve - * 8)) ; - -53 -b±r - = (*)b±¸+ -may_§ve -; - -54 -size - -ð -may_§ve -; - -55 if( -Ãed_eom - && - `u³r_put_Ëngth -( -po -, 0, 0)) { - -56 - `FREEMEM -( -buf -); - -59 }  -size -); - -61 - `FREEMEM -( -buf -); - -62 if( -size -)  -1; - -65 - } -} - -67  -a¢_dec_rv®_t - - -68 - $u³r_ݒ_ty³_g‘_sim¶e -(cÚ¡ -a¢_codec_ùx_t - * -ùx -, - -69 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -70 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -71 -a¢_³r_d©a_t - * -pd -) { - -72 -a¢_dec_rv®_t - -rv -; - -73 -ssize_t - -chunk_by‹s -; - -74  -»³© -; - -75 -ušt8_t - * -buf - = 0; - -76 -size_t - -bufL’ - = 0; - -77 -size_t - -bufSize - = 0; - -78 -a¢_³r_d©a_t - -¥d -; - -79 -size_t - -·ddšg -; - -81 - `ASN__STACK_OVERFLOW_CHECK -( -ùx -); - -83 - `ASN_DEBUG -("G‘tšg o³Àty³ %s...", -td --> -Çme -); - -86 -chunk_by‹s - = - `u³r_g‘_Ëngth -( -pd -, -1, 0, & -»³© -); - -87 if( -chunk_by‹s - < 0) { - -88 - `FREEMEM -( -buf -); - -89 -ASN__DECODE_STARVED -; - -91 if( -bufL’ - + -chunk_by‹s - > -bufSize -) { - -92 * -±r -; - -93 -bufSize - = -chunk_by‹s - + (bufSize << 2); - -94 -±r - = - `REALLOC -( -buf -, -bufSize -); - -95 if(! -±r -) { - -96 - `FREEMEM -( -buf -); - -97 -ASN__DECODE_FAILED -; - -99 -buf - = -±r -; - -101 if( - `³r_g‘_mªy_b™s -( -pd -, -buf - + -bufL’ -, 0, -chunk_by‹s - << 3)) { - -102 - `FREEMEM -( -buf -); - -103 -ASN__DECODE_STARVED -; - -105 -bufL’ - +ð -chunk_by‹s -; - -106 }  -»³© -); - -108 - `ASN_DEBUG -("G‘tšg o³Àty³ % ’coded iÀ%ld by‹s", -td --> -Çme -, - -109 () -bufL’ -); - -111 - `mem£t -(& -¥d -, 0, (spd)); - -112 -¥d -. -bufãr - = -buf -; - -113 -¥d -. -nb™s - = -bufL’ - << 3; - -115 - `ASN_DEBUG_INDENT_ADD -(+4); - -116 -rv - = -td --> -Ý --> - `u³r_decod” -( -ùx -,d, -cÚ¡¿šts -, -¥Œ -, & -¥d -); - -117 - `ASN_DEBUG_INDENT_ADD -(-4); - -119 if( -rv -. -code - =ð -RC_OK -) { - -121 -·ddšg - = -¥d -. -nb™s - - spd. -nboff -; - -122 ià((( -·ddšg - > 0 &&…adding < 8) || - -124 ( -¥d -. -nboff - =ð0 && spd. -nb™s - =ð8 && spd. -bufãr - =ð -buf -)) && - -125 - `³r_g‘_ãw_b™s -(& -¥d -, -·ddšg -) == 0) { - -127 - `FREEMEM -( -buf -); - -128  -rv -; - -130 - `FREEMEM -( -buf -); - -131 if( -·ddšg - >= 8) { - -132 - `ASN_DEBUG -("ToØÏrg·ddšg %d iÀݒy³", () -·ddšg -); - -133 -ASN__DECODE_FAILED -; - -135 - `ASN_DEBUG -("No…adding"); - -138 - `FREEMEM -( -buf -); - -140 -rv -. -code - = -RC_FAIL -; - -143  -rv -; - -144 - } -} - -146  -a¢_dec_rv®_t - -CC_NOTUSED - - -147 - $u³r_ݒ_ty³_g‘_com¶ex -(cÚ¡ -a¢_codec_ùx_t - * -ùx -, - -148 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -149 -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -150 -a¢_³r_d©a_t - * -pd -) { - -151 -u³r_ugÙ_key - -¬g -; - -152 -a¢_dec_rv®_t - -rv -; - -153 -ssize_t - -·ddšg -; - -155 - `ASN__STACK_OVERFLOW_CHECK -( -ùx -); - -157 - `ASN_DEBUG -("G‘tšg o³Àty³ % äom %s", -td --> -Çme -, - -158 - `a¢_b™_d©a_¡ršg -( -pd -)); - -159 -¬g -. -Þdpd - = * -pd -; - -160 -¬g -. -unþaimed - = 0; - -161 -¬g -. -Ù_moved - = 0; - -162 -¬g -. -»³© - = 1; - -163 -pd --> -»fžl - = -u³r_ugÙ_»fžl -; - -164 -pd --> -»fžl_key - = & -¬g -; - -165 -pd --> -nb™s - =…d-> -nboff -; - -166 -pd --> -moved - = 0; - -168 - `ASN_DEBUG_INDENT_ADD -(+4); - -169 -rv - = -td --> -Ý --> - `u³r_decod” -( -ùx -,d, -cÚ¡¿šts -, -¥Œ -, -pd -); - -170 - `ASN_DEBUG_INDENT_ADD -(-4); - -172  - #UPDRESTOREPD - do { \ - -174 -pd --> -nb™s - = -¬g -. -Þdpd -.nb™ - (pd-> -moved - -‡rg. -Ù_moved -); \ - -175 -pd --> -moved - = -¬g -. -Þdpd -.moved + (pd->moved -‡rg. -Ù_moved -); \ - -176 -pd --> -»fžl - = -¬g -. -Þdpd -.refill; \ - -177 -pd --> -»fžl_key - = -¬g -. -Þdpd -.refill_key; \ - -178 } 0) - - ) - -180 if( -rv -. -code - !ð -RC_OK -) { - -181 -UPDRESTOREPD -; - -182  -rv -; - -185 - `ASN_DEBUG -("O³nTy³ % pd% Þd% unþaimed=%d,„•—t=%d", -td --> -Çme -, - -186 - `a¢_b™_d©a_¡ršg -( -pd -), - -187 - `a¢_b™_d©a_¡ršg -(& -¬g -. -Þdpd -), - -188 () -¬g -. -unþaimed -, (ïrg. -»³© -); - -190 -·ddšg - = -pd --> -moved - % 8; - -191 if( -·ddšg -) { - -192 -št32_t - -pv®ue -; - -193 if( -·ddšg - > 7) { - -194 - `ASN_DEBUG -("Too†arge…adding %d in openype", - -195 () -·ddšg -); - -196 -rv -. -code - = -RC_FAIL -; - -197 -UPDRESTOREPD -; - -198  -rv -; - -200 -·ddšg - = 8 -…adding; - -201 - `ASN_DEBUG -("G‘tšg…addšg oà%d b™s", () -·ddšg -); - -202 -pv®ue - = - `³r_g‘_ãw_b™s -( -pd -, -·ddšg -); - -203  -pv®ue -) { - -205 - `ASN_DEBUG -("Padding skip failed"); - -206 -UPDRESTOREPD -; - -207 -ASN__DECODE_STARVED -; - -210 - `ASN_DEBUG -("Non-blank…adding (%d bits 0x%02x)", - -211 () -·ddšg -, () -pv®ue -); - -212 -UPDRESTOREPD -; - -213 -ASN__DECODE_FAILED -; - -216 if( -pd --> -nboff - !ðpd-> -nb™s -) { - -217 - `ASN_DEBUG -("O³Àty³ % ov”h—d…d% Þd%s", -td --> -Çme -, - -218 - `a¢_b™_d©a_¡ršg -( -pd -),‡¢_b™_d©a_¡ršg(& -¬g -. -Þdpd -)); - -220 -UPDRESTOREPD -; - -221 -ASN__DECODE_FAILED -; - -223 -¬g -. -unþaimed - +ð -pd --> -nb™s - -…d-> -nboff -; - -228 -UPDRESTOREPD -; - -231 if( -¬g -. -unþaimed -) { - -232 - `ASN_DEBUG -("G‘tšg unþaimed %d", () -¬g -. -unþaimed -); - -233  - `³r_sk_b™s -( -pd -, -¬g -. -unþaimed -)) { - -235 - `ASN_DEBUG -("CÏim oà%d fažed", () -¬g -. -unþaimed -); - -236 -ASN__DECODE_STARVED -; - -238 - `ASN_DEBUG -("GÙ cÏim oà%d", () -¬g -. -unþaimed -); - -242 - `ASN_DEBUG -("Non-blank unconsumed…adding"); - -243 -ASN__DECODE_FAILED -; - -245 -¬g -. -unþaimed - = 0; - -248 if( -¬g -. -»³© -) { - -249 - `ASN_DEBUG -("Not consumedhe wholehing"); - -250 -rv -. -code - = -RC_FAIL -; - -251  -rv -; - -254  -rv -; - -255 - } -} - -258 -a¢_dec_rv®_t - - -259 - $u³r_ݒ_ty³_g‘ -(cÚ¡ -a¢_codec_ùx_t - * -ùx -, cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -260 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -261 -a¢_³r_d©a_t - * -pd -) { - -262  - `u³r_ݒ_ty³_g‘_sim¶e -( -ùx -, -td -, -cÚ¡¿šts -, -¥Œ -, -pd -); - -263 - } -} - -266 - $u³r_ݒ_ty³_sk -(cÚ¡ -a¢_codec_ùx_t - * -ùx -, -a¢_³r_d©a_t - * -pd -) { - -267 -a¢_TYPE_desütÜ_t - -s_td -; - -268 -a¢_TYPE_ݔ©iÚ_t - -s_Ý -; - -269 -a¢_dec_rv®_t - -rv -; - -271 -s_td -. -Çme - = ""; - -272 -s_td -. -Ý - = & -s_Ý -; - -273 -s_Ý -. -u³r_decod” - = -u³r_sÙ_suck -; - -275 -rv - = - `u³r_ݒ_ty³_g‘ -( -ùx -, & -s_td -, 0, 0, -pd -); - -276 if( -rv -. -code - !ð -RC_OK -) - -280 - } -} - -286  -a¢_dec_rv®_t - - -287 - $u³r_sÙ_suck -(cÚ¡ -a¢_codec_ùx_t - * -ùx -, cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -288 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, - -289 -a¢_³r_d©a_t - * -pd -) { - -290 -a¢_dec_rv®_t - -rv -; - -292 () -ùx -; - -293 () -td -; - -294 () -cÚ¡¿šts -; - -295 () -¥Œ -; - -297  - `³r_g‘_ãw_b™s -( -pd -, 1) >= 0); - -299 -rv -. -code - = -RC_OK -; - -300 -rv -. -cÚsumed - = -pd --> -moved -; - -302  -rv -; - -303 - } -} - -306 - $u³r_ugÙ_»fžl -( -a¢_³r_d©a_t - * -pd -) { - -307 -u³r_ugÙ_key - * -¬g - = -pd --> -»fžl_key -; - -308 -ssize_t - -Ãxt_chunk_by‹s -, -Ãxt_chunk_b™s -; - -309 -ssize_t - -avaž -; - -311 -a¢_³r_d©a_t - * -Þdpd - = & -¬g -->oldpd; - -313 - `ASN_DEBUG -("REFILLING…d->moved=%ld, oldpd->moved=%ld", - -314 () -pd --> -moved -, () -Þdpd -->moved); - -317 -Þdpd --> -bufãr - = -pd -->buffer; - -318 -Þdpd --> -nboff - = -pd -->nboff; - -319 -Þdpd --> -nb™s - -ð -pd --> -moved - - -¬g --> -Ù_moved -; - -320 -Þdpd --> -moved - +ð -pd -->moved - -¬g --> -Ù_moved -; - -321 -¬g --> -Ù_moved - = -pd --> -moved -; - -323 if( -¬g --> -unþaimed -) { - -325 if( - `³r_g‘_ãw_b™s -( -Þdpd -, 1)) - -327 if( -Þdpd --> -nboff - == 0) { - -328 - `as£¹ -(0); - -331 -pd --> -bufãr - = -Þdpd -->buffer; - -332 -pd --> -nboff - = -Þdpd -->nboff - 1; - -333 -pd --> -nb™s - = -Þdpd -->nbits; - -334 - `ASN_DEBUG -("UNCLAIMED <-„eturn from (pd->moved=%ld)", - -335 () -pd --> -moved -); - -339 if(! -¬g --> -»³© -) { - -340 - `ASN_DEBUG -("Want more but„efill doesn't have it"); - -344 -Ãxt_chunk_by‹s - = - `u³r_g‘_Ëngth -( -Þdpd -, -1, 0, & -¬g --> -»³© -); - -345 - `ASN_DEBUG -("Openype LENGTH %ld bytes‡t off %ld,„epeat %ld", - -346 () -Ãxt_chunk_by‹s -, () -Þdpd --> -moved -, () -¬g --> -»³© -); - -347 if( -Ãxt_chunk_by‹s - < 0)  -1; - -348 if( -Ãxt_chunk_by‹s - == 0) { - -349 -pd --> -»fžl - = 0; - -350 - `as£¹ -(! -¬g --> -»³© -); - -352 -Ãxt_chunk_b™s - = -Ãxt_chunk_by‹s - << 3; - -353 -avaž - = -Þdpd --> -nb™s - - oldpd-> -nboff -; - -354 if( -avaž - >ð -Ãxt_chunk_b™s -) { - -355 -pd --> -nb™s - = -Þdpd --> -nboff - + -Ãxt_chunk_b™s -; - -356 -¬g --> -unþaimed - = 0; - -357 - `ASN_DEBUG -("!+Parent frame %ld bits,‡lloting %ld [%ld..%ld] (%ld)", - -358 () -Ãxt_chunk_b™s -, () -Þdpd --> -moved -, - -359 () -Þdpd --> -nboff -, ()Þdpd-> -nb™s -, - -360 ()( -Þdpd --> -nb™s - - oldpd-> -nboff -)); - -362 -pd --> -nb™s - = -Þdpd -->nbits; - -363 -¬g --> -unþaimed - = -Ãxt_chunk_b™s - - -avaž -; - -364 - `ASN_DEBUG -("!-Parent frame %ld,„equire %ld, will claim %ld", - -365 () -avaž -, () -Ãxt_chunk_b™s -, - -366 () -¬g --> -unþaimed -); - -368 -pd --> -bufãr - = -Þdpd -->buffer; - -369 -pd --> -nboff - = -Þdpd -->nboff; - -370 - `ASN_DEBUG -("Refilled…d%s old%s", - -371 - `a¢_b™_d©a_¡ršg -( -pd -),‡¢_b™_d©a_¡ršg( -Þdpd -)); - -373 - } -} - -376 - $³r_sk_b™s -( -a¢_³r_d©a_t - * -pd -,  -sk_nb™s -) { - -377  -hasNÚZ”oB™s - = 0; - -378  -sk_nb™s - > 0) { - -379  -sk -; - -382 if( -sk_nb™s - < 24) - -383 -sk - = -sk_nb™s -; - -385 -sk - = 24; - -386 -sk_nb™s - -ð -sk -; - -388  - `³r_g‘_ãw_b™s -( -pd -, -sk -)) { - -391 : -hasNÚZ”oB™s - = 1; ; - -394  -hasNÚZ”oB™s -; - -395 - } -} - -397  -a¢_dec_rv®_t - - -398 - $­”_ݒ_ty³_g‘_sim¶e -(cÚ¡ -a¢_codec_ùx_t - * -ùx -, - -399 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -400 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -401 -a¢_dec_rv®_t - -rv -; - -402 -ssize_t - -chunk_by‹s -; - -403  -»³© -; - -404 -ušt8_t - * -buf - = 0; - -405 -size_t - -bufL’ - = 0; - -406 -size_t - -bufSize - = 0; - -407 -a¢_³r_d©a_t - -¥d -; - -408 -size_t - -·ddšg -; - -410 - `ASN__STACK_OVERFLOW_CHECK -( -ùx -); - -412 - `ASN_DEBUG -("G‘tšg o³Àty³ %s...", -td --> -Çme -); - -415 -chunk_by‹s - = - `­”_g‘_Ëngth -( -pd -, -1, -1, & -»³© -); - -416 if( -chunk_by‹s - < 0) { - -417 - `FREEMEM -( -buf -); - -418 -ASN__DECODE_STARVED -; - -420 if( -bufL’ - + -chunk_by‹s - > -bufSize -) { - -421 * -±r -; - -422 -bufSize - = -chunk_by‹s - + (bufSize << 2); - -423 -±r - = - `REALLOC -( -buf -, -bufSize -); - -424 if(! -±r -) { - -425 - `FREEMEM -( -buf -); - -426 -ASN__DECODE_FAILED -; - -428 -buf - = -±r -; - -430 if( - `³r_g‘_mªy_b™s -( -pd -, -buf - + -bufL’ -, 0, -chunk_by‹s - << 3)) { - -431 - `FREEMEM -( -buf -); - -432 -ASN__DECODE_STARVED -; - -434 -bufL’ - +ð -chunk_by‹s -; - -435 }  -»³© -); - -437 - `ASN_DEBUG -("G‘tšg o³Àty³ % ’coded iÀ%ld by‹s", -td --> -Çme -, - -438 () -bufL’ -); - -440 - `mem£t -(& -¥d -, 0, (spd)); - -441 -¥d -. -bufãr - = -buf -; - -442 -¥d -. -nb™s - = -bufL’ - << 3; - -444 - `ASN_DEBUG_INDENT_ADD -(+4); - -445 -rv - = -td --> -Ý --> - `­”_decod” -( -ùx -,d, -cÚ¡¿šts -, -¥Œ -, & -¥d -); - -446 - `ASN_DEBUG_INDENT_ADD -(-4); - -448 if( -rv -. -code - =ð -RC_OK -) { - -450 -·ddšg - = -¥d -. -nb™s - - spd. -nboff -; - -451 ià((( -·ddšg - > 0 &&…adding < 8) || - -453 ( -¥d -. -nboff - =ð0 && spd. -nb™s - =ð8 && spd. -bufãr - =ð -buf -)) && - -454 - `³r_g‘_ãw_b™s -(& -¥d -, -·ddšg -) == 0) { - -456 - `FREEMEM -( -buf -); - -457  -rv -; - -459 - `FREEMEM -( -buf -); - -460 if( -·ddšg - >= 8) { - -461 - `ASN_DEBUG -("ToØÏrg·ddšg %d iÀݒy³", () -·ddšg -); - -462 -ASN__DECODE_FAILED -; - -464 - `ASN_DEBUG -("No…adding"); - -467 - `FREEMEM -( -buf -); - -469 -rv -. -code - = -RC_FAIL -; - -472  -rv -; - -473 - } -} - -476 - $­”_ݒ_ty³_put -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -477 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -478 cÚ¡ * -¥Œ -, -a¢_³r_ou_t - * -po -) { - -479 * -buf -; - -480 * -b±r -; - -481 -ssize_t - -size -; - -482 -size_t - -toGo -; - -484 - `ASN_DEBUG -("O³Àty³…uˆ% ...", -td --> -Çme -); - -486 -size - = - `­”_’code_to_Ãw_bufãr -( -td -, -cÚ¡¿šts -, -¥Œ -, & -buf -); - -487 if( -size - <= 0)  -1; - -489  -b±r - = -buf -, -toGo - = -size -;oGo;) { - -490 -ssize_t - -maySave - = - `­”_put_Ëngth -( -po -, -1, -toGo -); - -491 if( -maySave - < 0) ; - -492 if( - `³r_put_mªy_b™s -( -po -, -b±r -, -maySave - * 8)) ; - -493 -b±r - = (*)b±¸+ -maySave -; - -494 -toGo - -ð -maySave -; - -497 - `FREEMEM -( -buf -); - -498 if( -toGo -)  -1; - -500 - `ASN_DEBUG -("Openype…ut %s of†ength %ld + overhead (1byte?)", - -501 -td --> -Çme -, -size -); - -504 - } -} - -506 -a¢_dec_rv®_t - - -507 - $­”_ݒ_ty³_g‘ -(cÚ¡ -a¢_codec_ùx_t - * -ùx -, - -508 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, - -509 cÚ¡ -a¢_³r_cÚ¡¿šts_t - * -cÚ¡¿šts -, - -510 ** -¥Œ -, -a¢_³r_d©a_t - * -pd -) { - -512  - `­”_ݒ_ty³_g‘_sim¶e -( -ùx -, -td -, -cÚ¡¿šts -, -¥Œ -, -pd -); - -513 - } -} - -516 - $­”_ݒ_ty³_sk -(cÚ¡ -a¢_codec_ùx_t - * -ùx -, -a¢_³r_d©a_t - * -pd -) { - -517 -a¢_TYPE_desütÜ_t - -s_td -; - -518 -a¢_dec_rv®_t - -rv -; - -519 -a¢_TYPE_ݔ©iÚ_t - -Ý_t -; - -521 - `mem£t -(& -Ý_t -, 0, (op_t)); - -522 -s_td -. -Çme - = ""; - -523 -s_td -. -Ý - = & -Ý_t -; - -524 -s_td -. -Ý --> -­”_decod” - = -u³r_sÙ_suck -; - -526 -rv - = - `­”_ݒ_ty³_g‘ -( -ùx -, & -s_td -, 0, 0, -pd -); - -527 if( -rv -. -code - !ð -RC_OK -) - -531 - } -} - - @per_support.c - -5  - ~ - -6  - ~ - -7  - ~<³r_suµÜt.h -> - -13 -ssize_t - - -14 - $u³r_g‘_Ëngth -( -a¢_³r_d©a_t - * -pd -,  -eb™s -, -size_t - -low”_bound -, - -15 * -»³© -) { - -16 -ssize_t - -v®ue -; - -18 * -»³© - = 0; - -21 if( -eb™s - >= 0 &&ƒbits <= 16) { - -22 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, -eb™s -); - -23 if( -v®ue - >ð0èv®u+ð -low”_bound -; - -24  -v®ue -; - -27 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, 8); - -28 if(( -v®ue - & 0x80) == 0) { - -29  ( -v®ue - & 0x7F); - -30 } if(( -v®ue - & 0x40) == 0) { - -32 -v®ue - = ((v®u& 0x3fè<< 8è| - `³r_g‘_ãw_b™s -( -pd -, 8); - -33  -v®ue -; - -34 } if( -v®ue - < 0) { - -35 - `ASN_DEBUG -("END of stream„eached for PER"); - -38 -v®ue - &= 0x3f; - -39 if( -v®ue - < 1 || value > 4) { - -42 * -»³© - = 1; - -43  (16384 * -v®ue -); - -44 - } -} - -51 -ssize_t - - -52 - $u³r_g‘_n¦’gth -( -a¢_³r_d©a_t - * -pd -) { - -53 -ssize_t - -Ëngth -; - -55 - `ASN_DEBUG -("Getting‚ormally small†ength"); - -57 if( - `³r_g‘_ãw_b™s -( -pd -, 1) == 0) { - -58 -Ëngth - = - `³r_g‘_ãw_b™s -( -pd -, 6) + 1; - -59 if( -Ëngth - <= 0)  -1; - -60 - `ASN_DEBUG -("l=%d", () -Ëngth -); - -61  -Ëngth -; - -63  -»³© -; - -64 -Ëngth - = - `u³r_g‘_Ëngth -( -pd -, -1, 0, & -»³© -); - -65 if( -Ëngth - >ð0 && ! -»³© -) †ength; - -68 - } -} - -74 -ssize_t - - -75 - $u³r_g‘_n¢nwn -( -a¢_³r_d©a_t - * -pd -) { - -76 -ssize_t - -v®ue -; - -78 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, 7); - -79 if( -v®ue - & 64) { - -80 -v®ue - &= 63; - -81 -v®ue - <<= 2; - -82 -v®ue - |ð - `³r_g‘_ãw_b™s -( -pd -, 2); - -83 if( -v®ue - & 128) - -85 if( -v®ue - == 0) - -87 if( -v®ue - >= 3) - -89 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, 8 * value); - -90  -v®ue -; - -93  -v®ue -; - -94 - } -} - -101 - $u³r_put_n¢nwn -( -a¢_³r_ou_t - * -po -,  -n -) { - -102  -by‹s -; - -104 if( -n - <= 63) { - -105 if( -n - < 0)  -1; - -106  - `³r_put_ãw_b™s -( -po -, -n -, 7); - -108 if( -n - < 256) - -109 -by‹s - = 1; - -110 if( -n - < 65536) - -111 -by‹s - = 2; - -112 if( -n - < 256 * 65536) - -113 -by‹s - = 3; - -116 if( - `³r_put_ãw_b™s -( -po -, -by‹s -, 8)) - -119  - `³r_put_ãw_b™s -( -po -, -n -, 8 * -by‹s -); - -120 - } -} - -124  - $u³r_g‘_cÚ¡¿šed_whÞe_numb” -( -a¢_³r_d©a_t - * -pd -, * -out_v®ue -,  -nb™s -) { - -125  -lh®f -; - -126  -h®f -; - -128 if( -nb™s - <= 31) { - -129 -h®f - = - `³r_g‘_ãw_b™s -( -pd -, -nb™s -); - -130 if( -h®f - < 0)  -1; - -131 * -out_v®ue - = -h®f -; - -135 if(( -size_t -) -nb™s - > 8 * (* -out_v®ue -)) - -138 -h®f - = - `³r_g‘_ãw_b™s -( -pd -, 31); - -139 if( -h®f - < 0)  -1; - -141 if( - `u³r_g‘_cÚ¡¿šed_whÞe_numb” -( -pd -, & -lh®f -, -nb™s - - 31)) - -144 * -out_v®ue - = (() -h®f - << ( -nb™s - - 31)è| -lh®f -; - -146 - } -} - -151 - $u³r_put_cÚ¡¿šed_whÞe_numb”_u -( -a¢_³r_ou_t - * -po -,  -v -, - -152  -nb™s -) { - -153 if( -nb™s - <= 31) { - -154  - `³r_put_ãw_b™s -( -po -, -v -, -nb™s -); - -157 if( - `u³r_put_cÚ¡¿šed_whÞe_numb”_u -( -po -, -v - >> 31, -nb™s - - 31)) - -159  - `³r_put_ãw_b™s -( -po -, -v -, 31); - -161 - } -} - -167 -ssize_t - - -168 - $u³r_put_Ëngth -( -a¢_³r_ou_t - * -po -, -size_t - -Ëngth -, * -Ãed_eom -) { - -169  -dummy - = 0; - -170 if(! -Ãed_eom -èÃed_eom = & -dummy -; - -172 if( -Ëngth - <= 127) { - -173 * -Ãed_eom - = 0; - -174  - `³r_put_ãw_b™s -( -po -, -Ëngth -, 8) - -175 ? -1 : ( -ssize_t -) -Ëngth -; - -176 } if( -Ëngth - < 16384) { - -177 * -Ãed_eom - = 0; - -178  - `³r_put_ãw_b™s -( -po -, -Ëngth -|0x8000, 16) - -179 ? -1 : ( -ssize_t -) -Ëngth -; - -182 * -Ãed_eom - = 0 =ð( -Ëngth - & 16383); - -183 -Ëngth - >>= 14; - -184 if( -Ëngth - > 4) { - -185 * -Ãed_eom - = 0; - -186 -Ëngth - = 4; - -189  - `³r_put_ãw_b™s -( -po -, 0xC0 | -Ëngth -, 8) - -190 ? -1 : ( -ssize_t -)( -Ëngth - << 14); - -192 - } -} - -201 - $u³r_put_n¦’gth -( -a¢_³r_ou_t - * -po -, -size_t - -Ëngth -) { - -202 if( -Ëngth - <= 64) { - -204 if( -Ëngth - == 0)  -1; - -205  - `³r_put_ãw_b™s -( -po -, -Ëngth - - 1, 7) ? -1 : 0; - -207  -Ãed_eom - = 0; - -208 if( - `u³r_put_Ëngth -( -po -, -Ëngth -, & -Ãed_eom -è!ð( -ssize_t -)length - -209 || -Ãed_eom -) { - -216 - } -} - -219 - $³r__lÚg_¿nge -( -lb -,  -ub -, * -¿nge_r -) { - -220  -bounds_¿nge -; - -221 if(( -ub - < 0è=ð( -lb - < 0)) { - -222 -bounds_¿nge - = -ub - - -lb -; - -223 } if( -lb - < 0) { - -224 - `as£¹ -( -ub - >= 0); - -225 -bounds_¿nge - = 1 + (() -ub - + ()-( -lb - + 1)); - -227 - `as£¹ -(!"Unreachable"); - -230 * -¿nge_r - = -bounds_¿nge -; - -232 - } -} - -235 - $³r_lÚg_¿nge_»ba£ -( -v -,  -lb -,  -ub -, * -ouut -) { - -236  -¿nge -; - -238 - `as£¹ -( -lb - <ð -ub -); - -240 if( -v - < -lb - || v > -ub - || - `³r__lÚg_¿nge -Öb, ub, & -¿nge -) < 0) { - -252 if(( -v - < 0è=ð( -lb - < 0)) { - -253 * -ouut - = -v -- -lb -; - -255 } if( -v - < 0) { - -256  -»ba£d - = 1 + ()-( -v -+1è+ () -lb -; - -257 - `as£¹ -( -»ba£d - <ð -¿nge -); - -258 * -ouut - = -»ba£d -; - -260 } if( -lb - < 0) { - -261  -»ba£d - = 1 + ()-( -lb -+1è+ () -v -; - -262 - `as£¹ -( -»ba£d - <ð -¿nge -); - -263 * -ouut - = -»ba£d -; - -266 - `as£¹ -(!"Unreachable"); - -269 - } -} - -272 - $³r_lÚg_¿nge_uÄeba£ -( -šp -,  -lb -,  -ub -, * -ou -) { - -273  -¿nge -; - -275 if( - `³r__lÚg_¿nge -( -lb -, -ub -, & -¿nge -) != 0) { - -279 if( -šp - > -¿nge -) { - -288 if( -šp - <ð -LONG_MAX -) { - -289 * -ou - = () -šp - + -lb -; - -291 * -ou - = ( -lb - + -LONG_MAX - + 1è+ ()(( -šp - - LONG_MAX) - 1); - -295 - } -} - -297 -št32_t - - -298 - $­”_g‘_®ign -( -a¢_³r_d©a_t - * -pd -) { - -300 if( -pd --> -nboff - & 0x7) { - -301 - `ASN_DEBUG -("Alignšg %ld b™s", 8 - (() -pd --> -nboff - & 0x7)); - -302  - `³r_g‘_ãw_b™s -( -pd -, 8 - (pd-> -nboff - & 0x7)); - -305 - } -} - -307 -ssize_t - - -308 - $­”_g‘_Ëngth -( -a¢_³r_d©a_t - * -pd -,  -¿nge -,  -eb™s -, * -»³© -) { - -309 -ssize_t - -v®ue -; - -311 * -»³© - = 0; - -314 ià( -eb™s - >= 0) { - -315 ià( -¿nge - <= 65536 &&„ange >= 0) - -316  - `­”_g‘_n¢nwn -( -pd -, -¿nge -); - -319 ià( - `­”_g‘_®ign -( -pd -) < 0) - -322 if( -eb™s - >ð0è - `³r_g‘_ãw_b™s -( -pd -,ƒbits); - -324 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, 8); - -325 if( -v®ue - < 0)  -1; - -326 if(( -v®ue - & 128) == 0) - -327  ( -v®ue - & 0x7F); - -328 if(( -v®ue - & 64) == 0) { - -329 -v®ue - = ((v®u& 63è<< 8è| - `³r_g‘_ãw_b™s -( -pd -, 8); - -330 if( -v®ue - < 0)  -1; - -331  -v®ue -; - -333 -v®ue - &= 63; - -334 if( -v®ue - < 1 || value > 4) - -336 * -»³© - = 1; - -337  (16384 * -v®ue -); - -338 - } -} - -340 -ssize_t - - -341 - $­”_g‘_n¦’gth -( -a¢_³r_d©a_t - * -pd -) { - -342 -ssize_t - -Ëngth -; - -344 - `ASN_DEBUG -("Getting‚ormally small†ength"); - -346 if( - `³r_g‘_ãw_b™s -( -pd -, 1) == 0) { - -347 -Ëngth - = - `³r_g‘_ãw_b™s -( -pd -, 6) + 1; - -348 if( -Ëngth - <= 0)  -1; - -349 - `ASN_DEBUG -("l=%ld", -Ëngth -); - -350  -Ëngth -; - -352  -»³© -; - -353 -Ëngth - = - `­”_g‘_Ëngth -( -pd -, -1, -1, & -»³© -); - -354 if( -Ëngth - >ð0 && ! -»³© -) †ength; - -357 - } -} - -359 -ssize_t - - -360 - $­”_g‘_n¢nwn -( -a¢_³r_d©a_t - * -pd -,  -¿nge -) { - -361 -ssize_t - -v®ue -; - -362  -by‹s - = 0; - -364 - `ASN_DEBUG -("g‘tšg‚¢nwÀw™h„ªg%d", -¿nge -); - -366 if( -¿nge - <= 255) { - -367  -i -; - -369 ià( -¿nge - < 0)  -1; - -371  -i - = 1; i <= 8; i++) { - -372  -uµ” - = 1 << -i -; - -373 ià( -uµ” - >ð -¿nge -) - -376 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, -i -); - -377  -v®ue -; - -378 } ià( -¿nge - == 256){ - -380 -by‹s - = 1; - -381 } ià( -¿nge - <= 65536) { - -383 -by‹s - = 2; - -387 ià( - `­”_g‘_®ign -( -pd -) < 0) - -389 -v®ue - = - `³r_g‘_ãw_b™s -( -pd -, 8 * -by‹s -); - -390  -v®ue -; - -391 - } -} - -393  - $­”_put_®ign -( -a¢_³r_ou_t - * -po -) { - -395 if( -po --> -nboff - & 0x7) { - -396 - `ASN_DEBUG -("Alignšg %ld b™s", 8 - (() -po --> -nboff - & 0x7)); - -397 if( - `³r_put_ãw_b™s -( -po -, 0x00, (8 - (po-> -nboff - & 0x7)))) - -401 - } -} - -403 -ssize_t - - -404 - $­”_put_Ëngth -( -a¢_³r_ou_t - * -po -,  -¿nge -, -size_t - -Ëngth -) { - -406 - `ASN_DEBUG -("APER…uˆËngth %zu w™h„ªg%d", -Ëngth -, -¿nge -); - -409 ià( -¿nge - <= 65536 &&„ange >= 0) - -410  - `­”_put_n¢nwn -( -po -, -¿nge -, -Ëngth -); - -412 ià( - `­”_put_®ign -( -po -) < 0) - -415 if( -Ëngth - <= 127) { - -416  - `³r_put_ãw_b™s -( -po -, -Ëngth -, 8) - -417 ? -1 : ( -ssize_t -) -Ëngth -; - -419 if( -Ëngth - < 16384) - -420  - `³r_put_ãw_b™s -( -po -, -Ëngth -|0x8000, 16) - -421 ? -1 : ( -ssize_t -) -Ëngth -; - -423 -Ëngth - >>= 14; - -424 if( -Ëngth - > 4)†ength = 4; - -426  - `³r_put_ãw_b™s -( -po -, 0xC0 | -Ëngth -, 8) - -427 ? -1 : ( -ssize_t -)( -Ëngth - << 14); - -428 - } -} - -432 - $­”_put_n¦’gth -( -a¢_³r_ou_t - * -po -, -size_t - -Ëngth -) { - -434 if( -Ëngth - <= 64) { - -436 if( -Ëngth - == 0)  -1; - -437  - `³r_put_ãw_b™s -( -po -, -Ëngth --1, 7) ? -1 : 0; - -439 if( - `­”_put_Ëngth -( -po -, -1, -Ëngth -è!ð( -ssize_t -)length) { - -446 - } -} - -449 - $­”_put_n¢nwn -( -a¢_³r_ou_t - * -po -,  -¿nge -,  -numb” -) { - -450  -by‹s -; - -452 - `ASN_DEBUG -("­”…uˆn¢nwÀ%d w™h„ªg%d", -numb” -, -¿nge -); - -454 if( -¿nge - < 0) { - -455  -i -; - -456  -i - = 1; ; i++) { - -457  -b™s - = 1 << (8 * -i -); - -458 ià( -numb” - <ð -b™s -) - -461 -by‹s - = -i -; - -462 - `as£¹ -( -i - <= 4); - -464 if( -¿nge - <= 255) { - -465  -i -; - -466  -i - = 1; i <= 8; i++) { - -467  -b™s - = 1 << -i -; - -468 ià( -¿nge - <ð -b™s -) - -471  - `³r_put_ãw_b™s -( -po -, -numb” -, -i -); - -472 } if( -¿nge - == 256) { - -473 -by‹s - = 1; - -474 } if( -¿nge - <= 65536) { - -475 -by‹s - = 2; - -477  -i -; - -478  -i - = 1; ; i++) { - -479  -b™s - = 1 << (8 * -i -); - -480 ià( -¿nge - <ð -b™s -) - -483 - `as£¹ -( -i - <= 4); - -484 -by‹s - = -i -; - -486 if( - `­”_put_®ign -( -po -) < 0) - -491  - `³r_put_ãw_b™s -( -po -, -numb” -, 8 * -by‹s -); - -492 - } -} - - @xer_decoder.c - -5  - ~ - -6  - ~ - -7  - ~ - -13 -a¢_dec_rv®_t - - -14 - $x”_decode -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -15 cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, ** -¡ruù_±r -, - -16 cÚ¡ * -bufãr -, -size_t - -size -) { - -17 -a¢_codec_ùx_t - -s_codec_ùx -; - -23 if( -Ýt_codec_ùx -) { - -24 if( -Ýt_codec_ùx --> -max_¡ack_size -) { - -25 -s_codec_ùx - = * -Ýt_codec_ùx -; - -26 -Ýt_codec_ùx - = & -s_codec_ùx -; - -30 - `mem£t -(& -s_codec_ùx -, 0, (s_codec_ctx)); - -31 -s_codec_ùx -. -max_¡ack_size - = -ASN__DEFAULT_STACK_MAX -; - -32 -Ýt_codec_ùx - = & -s_codec_ùx -; - -38  -td --> -Ý --> - `x”_decod” -( -Ýt_codec_ùx -,d, -¡ruù_±r -, 0, -bufãr -, -size -); - -39 - } -} - -43  - sx”__cb_¬g - { - -44 -pxml_chunk_ty³_e - - mchunk_ty³ -; - -45 -size_t - - mchunk_size -; - -46 cÚ¡ * - mchunk_buf -; - -47  - mÿÎback_nÙ_švoked -; - -51 - $x”__tok’_cb -( -pxml_chunk_ty³_e - -ty³ -, cÚ¡ * -_chunk_d©a -, -size_t - -_chunk_size -, * -key -) { - -52  -x”__cb_¬g - * -¬g - = (x”__cb_¬g *) -key -; - -53 -¬g --> -chunk_ty³ - = -ty³ -; - -54 -¬g --> -chunk_size - = -_chunk_size -; - -55 -¬g --> -chunk_buf - = -_chunk_d©a -; - -56 -¬g --> -ÿÎback_nÙ_švoked - = 0; - -58 - } -} - -63 -ssize_t - - -64 - $x”_Ãxt_tok’ -(* -¡©eCڋxt -, cÚ¡ * -bufãr -, -size_t - -size -, -px”_chunk_ty³_e - * -ch_ty³ -) { - -65  -x”__cb_¬g - -¬g -; - -66  -Ãw_¡©eCڋxt - = * -¡©eCڋxt -; - -67 -ssize_t - -»t -; - -69 -¬g -. -ÿÎback_nÙ_švoked - = 1; - -70 -»t - = - `pxml_·r£ -(& -Ãw_¡©eCڋxt -, -bufãr -, -size -, -x”__tok’_cb -, & -¬g -); - -71 if( -»t - < 0)  -1; - -72 if( -¬g -. -ÿÎback_nÙ_švoked -) { - -73 - `as£¹ -( -»t - == 0); - -74 * -ch_ty³ - = -PXER_WMORE -; - -77 - `as£¹ -( -¬g -. -chunk_size -); - -78 - `as£¹ -( -¬g -. -chunk_buf - =ð -bufãr -); - -84  -¬g -. -chunk_ty³ -) { - -85  -PXML_TEXT -: - -86 * -ch_ty³ - = -PXER_TEXT -; - -88  -PXML_TAG -: - -89 * -ch_ty³ - = -PXER_WMORE -; - -91  -PXML_TAG_END -: - -92 * -ch_ty³ - = -PXER_TAG -; - -94  -PXML_COMMENT -: - -95  -PXML_COMMENT_END -: - -96 * -ch_ty³ - = -PXER_COMMENT -; - -100 * -¡©eCڋxt - = -Ãw_¡©eCڋxt -; - -101  -¬g -. -chunk_size -; - -102 - } -} - -104  - #CSLASH - 0x2à - - ) - -105  - #LANGLE - 0x3ø - - ) - -106  - #RANGLE - 0x3 - - ) - -108 -x”_check_g_e - - -109 - $x”_check_g -(cÚ¡ * -buf_±r -,  -size -, cÚ¡ * -Ãed_g -) { - -110 cÚ¡ * -buf - = (cÚ¡ *) -buf_±r -; - -111 cÚ¡ * -’d -; - -112 -x”_check_g_e - -ù - = -XCT_OPENING -; - -114 if( -size - < 2 || -buf -[0] !ð -LANGLE - || buf[size-1] !ð -RANGLE -) { - -115 if( -size - >= 2) - -116 - `ASN_DEBUG -("Broken XMLag: \"%c...%c\"", - -117 -buf -[0], buf[ -size - - 1]); - -118  -XCT_BROKEN -; - -124 if( -buf -[1] =ð -CSLASH -) { - -125 -buf - += 2; - -126 -size - -= 3; - -127 -ù - = -XCT_CLOSING -; - -128 if( -size - > 0 && -buf -[size-1] =ð -CSLASH -) - -129  -XCT_BROKEN -; - -131 -buf -++; - -132 -size - -= 2; - -133 if( -size - > 0 && -buf -[size-1] =ð -CSLASH -) { - -134 -ù - = -XCT_BOTH -; - -135 -size ---; - -140 if(! -Ãed_g - || !*need_tag) - -141  ( -x”_check_g_e -)( -XCT__UNK__MASK - | -ù -); - -146  -’d - = -buf - + -size -; buà<ƒnd; buf++, -Ãed_g -++) { - -147  -b - = * -buf -, -n - = * -Ãed_g -; - -148 if( -b - !ð -n -) { - -149 if( -n - == 0) { - -150  -b -) { - -154  -ù -; - -157  ( -x”_check_g_e -)( -XCT__UNK__MASK - | -ù -); - -159 if( -b - == 0) - -160  -XCT_BROKEN -; - -162 if(* -Ãed_g -) - -163  ( -x”_check_g_e -)( -XCT__UNK__MASK - | -ù -); - -165  -ù -; - -166 - } -} - -169 #undeà -ADVANCE - - -170  - #ADVANCE -( -num_by‹s -) do { \ - -171 -size_t - -num - = ( -num_by‹s -); \ - -172 -buf_±r - = ((cÚ¡ *)buf_±rè+ -num -; \ - -173 -size - -ð -num -; \ - -174 -cÚsumed_my£lf - +ð -num -; \ - -175 } 0) - - ) - -177 #undeà -RETURN - - -178  - #RETURN -( -_code -) do { \ - -179 -rv® -. -code - = -_code -; \ - -180 -rv® -. -cÚsumed - = -cÚsumed_my£lf -; \ - -181 if( -rv® -. -code - !ð -RC_OK -) \ - -182 - `ASN_DEBUG -("Fažed w™h %d", -rv® -. -code -); \ - -183  -rv® -; \ - -184 } 0) - - ) - -186  - #XER_GOT_BODY -( -chunk_buf -, -chunk_size -, -size -) do { \ - -187 -ssize_t - -cÚv”‹d_size - = -body_»ûiv” - \ - -188 ( -¡ruù_key -, -chunk_buf -, -chunk_size -, \ - -189 ( -size_t -) -chunk_size - < -size -); \ - -190 if( -cÚv”‹d_size - =ð-1è - `RETURN -( -RC_FAIL -); \ - -191 if( -cÚv”‹d_size - == 0 \ - -192 && -size - =ð( -size_t -) -chunk_size -) \ - -193 - `RETURN -( -RC_WMORE -); \ - -194 -chunk_size - = -cÚv”‹d_size -; \ - -195 } 0) - - ) - -196  - #XER_GOT_EMPTY -() do { \ - -197 if( - `body_»ûiv” -( -¡ruù_key -, 0, 0, -size - > 0) == -1) \ - -198 - `RETURN -( -RC_FAIL -); \ - -199 } 0) - - ) - -204 -a¢_dec_rv®_t - - -205 -x”_decode_g’”® -(cÚ¡ -a¢_codec_ùx_t - * -Ýt_codec_ùx -, - -206 -a¢_¡ruù_ùx_t - * -ùx -, - -207 * -¡ruù_key -, - -208 cÚ¡ * -xml_g -, - -209 cÚ¡ * -buf_±r -, -size_t - -size -, - -210 (* -Ýt_uÃx³ùed_g_decod” -) - -211 (* -¡ruù_key -, cÚ¡ * -chunk_buf -, -size_t - -chunk_size -), - -212 - $ssize_t - (* -body_»ûiv” -) - -213 (* -¡ruù_key -, cÚ¡ * -chunk_buf -, -size_t - -chunk_size -, - -214  -have_mÜe -) - -217 -a¢_dec_rv®_t - -rv® -; - -218 -ssize_t - -cÚsumed_my£lf - = 0; - -220 () -Ýt_codec_ùx -; - -227 if( -ùx --> -pha£ - > 1è - `RETURN -( -RC_FAIL -); - -229 -px”_chunk_ty³_e - -ch_ty³ -; - -230 -ssize_t - -ch_size -; - -231 -x”_check_g_e - -tcv -; - -236 -ch_size - = - `x”_Ãxt_tok’ -(& -ùx --> -cڋxt -, -buf_±r -, -size -, - -237 & -ch_ty³ -); - -238 if( -ch_size - == -1) { - -239 - `RETURN -( -RC_FAIL -); - -241  -ch_ty³ -) { - -242  -PXER_WMORE -: - -243 - `RETURN -( -RC_WMORE -); - -244  -PXER_COMMENT -: - -245 - `ADVANCE -( -ch_size -); - -247  -PXER_TEXT -: - -248 if( -ùx --> -pha£ - == 0) { - -256 - `XER_GOT_BODY -( -buf_±r -, -ch_size -, -size -); - -258 - `ADVANCE -( -ch_size -); - -260  -PXER_TAG -: - -265 - `as£¹ -( -ch_ty³ - =ð -PXER_TAG - && -size -); - -267 -tcv - = - `x”_check_g -( -buf_±r -, -ch_size -, -xml_g -); - -275  -tcv -) { - -276  -XCT_BOTH -: - -277 if( -ùx --> -pha£ -) ; - -279 - `XER_GOT_EMPTY -(); - -280 - `ADVANCE -( -ch_size -); - -281 -ùx --> -pha£ - = 2; - -282 - `RETURN -( -RC_OK -); - -283  -XCT_OPENING -: - -284 if( -ùx --> -pha£ -) ; - -285 - `ADVANCE -( -ch_size -); - -286 -ùx --> -pha£ - = 1; - -288  -XCT_CLOSING -: - -289 if(! -ùx --> -pha£ -) ; - -290 - `ADVANCE -( -ch_size -); - -291 -ùx --> -pha£ - = 2; - -292 - `RETURN -( -RC_OK -); - -293  -XCT_UNKNOWN_BO -: - -297 if( -Ýt_uÃx³ùed_g_decod” - - -298 && - `Ýt_uÃx³ùed_g_decod” -( -¡ruù_key -, - -299 -buf_±r -, -ch_size -) >= 0) { - -301 - `ADVANCE -( -ch_size -); - -302 if(! -ùx --> -pha£ -) { - -305 -ùx --> -pha£ - = 2; - -306 - `RETURN -( -RC_OK -); - -315 - `ASN_DEBUG -("UÃx³ùed XMLag (ex³ùed \"%s\")", -xml_g -); - -319 - `RETURN -( -RC_FAIL -); - -320 - } -} - -323 -size_t - - -324 - $x”_wh™e¥aû_¥ª -(cÚ¡ * -chunk_buf -, -size_t - -chunk_size -) { - -325 cÚ¡ * -p - = (cÚ¡ *) -chunk_buf -; - -326 cÚ¡ * -³nd - = -p - + -chunk_size -; - -328 ; -p - < -³nd -;…++) { - -329 * -p -) { - -343  ( -p - - (cÚ¡ *) -chunk_buf -); - -344 - } -} - -350 - $x”_sk_unknown -( -x”_check_g_e - -tcv -, -b”_Žv_Ën_t - * -d•th -) { - -351 - `as£¹ -(* -d•th - > 0); - -352  -tcv -) { - -353  -XCT_BOTH -: - -354  -XCT_UNKNOWN_BO -: - -357  -XCT_OPENING -: - -358  -XCT_UNKNOWN_OP -: - -359 ++(* -d•th -); - -361  -XCT_CLOSING -: - -362  -XCT_UNKNOWN_CL -: - -363 if(--(* -d•th -) == 0) - -364  ( -tcv - =ð -XCT_CLOSING -) ? 2 : 1; - -369 - } -} - - @xer_encoder.c - -5  - ~ - -6  - ~<¡dio.h -> - -7  - ~<”ºo.h -> - -12 -a¢_’c_rv®_t - - -13 - $x”_’code -(cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -, - -14 -x”_’cod”_æags_e - -x”_æags -, -a¢_­p_cÚsume_by‹s_f - * -cb -, - -15 * -­p_key -) { - -16 -a¢_’c_rv®_t - -” - = {0, 0, 0}; - -17 -a¢_’c_rv®_t - -tm³r -; - -18 cÚ¡ * -mÇme -; - -19 -size_t - -mËn -; - -20  -xÿn - = ( -x”_æags - & -XER_F_CANONICAL -) ? 1 : 2; - -22 if(! -td - || ! -¥Œ -è -cb_çžed -; - -24 -mÇme - = -td --> -xml_g -; - -25 -mËn - = - `¡¾’ -( -mÇme -); - -27 - `ASN__CALLBACK3 -("<", 1, -mÇme -, -mËn -, ">", 1); - -29 -tm³r - = -td --> -Ý --> - `x”_’cod” -Ñd, -¥Œ -, 1, -x”_æags -, -cb -, -­p_key -); - -30 if( -tm³r -. -’coded - == -1) mper; - -31 -” -. -’coded - +ð -tm³r -.encoded; - -33 - `ASN__CALLBACK3 -("\n", -xÿn -); - -35 - `ASN__ENCODED_OK -( -” -); - -36 -cb_çžed -: - -37 -ASN__ENCODE_FAILED -; - -38 - } -} - -45 - $x”__´št2å -(cÚ¡ * -bufãr -, -size_t - -size -, * -­p_key -) { - -46 -FILE - * -¡»am - = (FILE *) -­p_key -; - -48 if( - `fwr™e -( -bufãr -, 1, -size -, -¡»am -) != size) - -52 - } -} - -55 - $x”_åršt -( -FILE - * -¡»am -, cÚ¡ -a¢_TYPE_desütÜ_t - * -td -, cÚ¡ * -¥Œ -) { - -56 -a¢_’c_rv®_t - -” - = {0,0,0}; - -58 if(! -¡»am -è¡»am = -¡dout -; - -59 if(! -td - || ! -¥Œ -) - -62 -” - = - `x”_’code -( -td -, -¥Œ -, -XER_F_BASIC -, -x”__´št2å -, -¡»am -); - -63 if( -” -. -’coded - == -1) - -66  - `fæush -( -¡»am -); - -67 - } -} - -69  - sx”_bufãr - { - -70 * - mbufãr -; - -71 -size_t - - mbufãr_size -; - -72 -size_t - - m®loÿ‹d_size -; - -76 - $x”__bufãr_­³nd -(cÚ¡ * -bufãr -, -size_t - -size -, * -­p_key -) { - -77  -x”_bufãr - * -xb - = -­p_key -; - -79  -xb --> -bufãr_size - + -size - + 1 > xb-> -®loÿ‹d_size -) { - -80 -size_t - -Ãw_size - = 2 * ( -xb --> -®loÿ‹d_size - ? xb->allocated_size : 64); - -81 * -Ãw_buf - = - `MALLOC -( -Ãw_size -); - -82 if(! -Ãw_buf -)  -1; - -83 ià( -xb --> -bufãr -) { - -84 - `memýy -( -Ãw_buf -, -xb --> -bufãr -, xb-> -bufãr_size -); - -86 - `FREEMEM -( -xb --> -bufãr -); - -87 -xb --> -bufãr - = -Ãw_buf -; - -88 -xb --> -®loÿ‹d_size - = -Ãw_size -; - -91 - `memýy -( -xb --> -bufãr - + xb-> -bufãr_size -, bufãr, -size -); - -92 -xb --> -bufãr_size - +ð -size -; - -93 -xb --> -bufãr -[xb-> -bufãr_size -] = '\0'; - -95 - } -} - -97 -x”_equiv®’û_e - - -98 - $x”_equiv®’t -(cÚ¡  -a¢_TYPE_desütÜ_s - * -td -, cÚ¡ * -¡ruù1 -, - -99 cÚ¡ * -¡ruù2 -, -FILE - * -Ýt_debug_¡»am -) { - -100  -x”_bufãr - -xb1 - = {0, 0, 0}; - -101  -x”_bufãr - -xb2 - = {0, 0, 0}; - -102 -a¢_’c_rv®_t - -e1 -, -e2 -; - -103 -a¢_dec_rv®_t - -rv® -; - -104 * -¥Œ - = -NULL -; - -106 if(! -td - || ! -¡ruù1 - || ! -¡ruù2 -) { - -107 if( -Ýt_debug_¡»am -) { - -108 if(! -td -è - `årštf -( -Ýt_debug_¡»am -, "Type descriptor missing\n"); - -109 if(! -¡ruù1 -è - `årštf -( -Ýt_debug_¡»am -, "Structure 1 missing\n"); - -110 if(! -¡ruù2 -è - `årštf -( -Ýt_debug_¡»am -, "Structure 2 missing\n"); - -112  -XEQ_FAILURE -; - -115 -e1 - = - `x”_’code -( -td -, -¡ruù1 -, -XER_F_BASIC -, -x”__bufãr_­³nd -, & -xb1 -); - -116 if( -e1 -. -’coded - == -1) { - -117 if( -Ýt_debug_¡»am -) { - -118 - `årštf -( -¡d”r -, "XER Encodšg oà% çžed\n", -td --> -Çme -); - -120 - `FREEMEM -( -xb1 -. -bufãr -); - -121  -XEQ_ENCODE1_FAILED -; - -124 -e2 - = - `x”_’code -( -td -, -¡ruù2 -, -XER_F_BASIC -, -x”__bufãr_­³nd -, & -xb2 -); - -125 if( -e2 -. -’coded - == -1) { - -126 if( -Ýt_debug_¡»am -) { - -127 - `årštf -( -¡d”r -, "XER Encodšg oà% çžed\n", -td --> -Çme -); - -129 - `FREEMEM -( -xb1 -. -bufãr -); - -130 - `FREEMEM -( -xb2 -. -bufãr -); - -131  -XEQ_ENCODE1_FAILED -; - -134 if( -xb1 -. -bufãr_size - !ð -xb2 -.buffer_size - -135 || - `memcmp -( -xb1 -. -bufãr -, -xb2 -.bufãr, xb1. -bufãr_size -) != 0) { - -136 if( -Ýt_debug_¡»am -) { - -137 - `årštf -( -Ýt_debug_¡»am -, - -140 -xb1 -. -bufãr -, -xb2 -.buffer); - -142 - `FREEMEM -( -xb1 -. -bufãr -); - -143 - `FREEMEM -( -xb2 -. -bufãr -); - -144  -XEQ_DIFFERENT -; - -146 if( -Ýt_debug_¡»am -) { - -147 - `årštf -( -Ýt_debug_¡»am -, - -149 "oàsiz%" -ASN_PRI_SIZE - ":\n%s", - -150 -xb1 -. -bufãr_size -, xb1. -bufãr -); - -154 -rv® - = - `x”_decode -( -NULL -, -td -, (**)& -¥Œ -, -xb1 -. -bufãr -, - -155 -xb1 -. -bufãr_size -); - -156  -rv® -. -code -) { - -157  -RC_OK -: - -159  -RC_WMORE -: - -160 if( -Ýt_debug_¡»am -) { - -161 - `årštf -( -Ýt_debug_¡»am -, - -164 -td --> -Çme -, -xb1 -. -bufãr -); - -167  -RC_FAIL -: - -169 if( -Ýt_debug_¡»am -) { - -170 - `årštf -( -Ýt_debug_¡»am -, - -172 -td --> -Çme -); - -174 - `ASN_STRUCT_FREE -(* -td -, -¥Œ -); - -175 - `FREEMEM -( -xb1 -. -bufãr -); - -176 - `FREEMEM -( -xb2 -. -bufãr -); - -177  -XEQ_DECODE_FAILED -; - -180 if( -rv® -. -cÚsumed - !ð -xb1 -. -bufãr_size - - -181 && (( -rv® -. -cÚsumed - > -xb1 -. -bufãr_size -) - -182 || - `x”_wh™e¥aû_¥ª -( -xb1 -. -bufãr - + -rv® -. -cÚsumed -, - -183 -xb1 -. -bufãr_size - - -rv® -. -cÚsumed -) - -184 !ð( -xb1 -. -bufãr_size - - -rv® -. -cÚsumed -))) { - -185 if( -Ýt_debug_¡»am -) { - -186 - `årštf -( -Ýt_debug_¡»am -, - -187 "Round-Œ decodoà% »quœed†es by‹ (%" -ASN_PRI_SIZE - ")han " - -188 "’coded (%" -ASN_PRI_SIZE - ")\n", - -189 -td --> -Çme -, -rv® -. -cÚsumed -, -xb1 -. -bufãr_size -); - -191 - `ASN_STRUCT_FREE -(* -td -, -¥Œ -); - -192 - `FREEMEM -( -xb1 -. -bufãr -); - -193 - `FREEMEM -( -xb2 -. -bufãr -); - -194  -XEQ_ROUND_TRIP_FAILED -; - -200 - `FREEMEM -( -xb2 -. -bufãr -); - -201 - `mem£t -(& -xb2 -, 0, (xb2)); - -203 -e2 - = - `x”_’code -( -td -, -¥Œ -, -XER_F_BASIC -, -x”__bufãr_­³nd -, & -xb2 -); - -204 if( -e2 -. -’coded - == -1) { - -205 if( -Ýt_debug_¡»am -) { - -206 - `årštf -( -¡d”r -, "XER Encoding of„ound-trip decode of %s failed\n", - -207 -td --> -Çme -); - -209 - `ASN_STRUCT_FREE -(* -td -, -¥Œ -); - -210 - `FREEMEM -( -xb1 -. -bufãr -); - -211 - `FREEMEM -( -xb2 -. -bufãr -); - -212  -XEQ_ROUND_TRIP_FAILED -; - -215 - `ASN_STRUCT_FREE -(* -td -, -¥Œ -); - -216 -¥Œ - = 0; - -218 if( -xb1 -. -bufãr_size - !ð -xb2 -.buffer_size - -219 || - `memcmp -( -xb1 -. -bufãr -, -xb2 -.bufãr, xb1. -bufãr_size -) != 0) { - -220 if( -Ýt_debug_¡»am -) { - -221 - `årštf -( -Ýt_debug_¡»am -, - -226 -xb1 -. -bufãr -, -xb2 -.bufãr, -td --> -Çme -); - -228 - `FREEMEM -( -xb1 -. -bufãr -); - -229 - `FREEMEM -( -xb2 -. -bufãr -); - -230  -XEQ_ROUND_TRIP_FAILED -; - -233 - `FREEMEM -( -xb1 -. -bufãr -); - -234 - `FREEMEM -( -xb2 -. -bufãr -); - -235  -XEQ_SUCCESS -; - -236 - } -} - - @xer_support.c - -7  - ~ - -8  - ~ - -12 - mST_TEXT -, - -13 - mST_TAG_START -, - -14 - mST_TAG_BODY -, - -15 - mST_TAG_QUOTE_WAIT -, - -16 - mST_TAG_QUOTED_STRING -, - -17 - mST_TAG_UNQUOTED_STRING -, - -18 - mST_COMMENT_WAIT_DASH1 -, - -19 - mST_COMMENT_WAIT_DASH2 -, - -20 - mST_COMMENT -, - -21 - mST_COMMENT_CLO_DASH2 -, - -22 - mST_COMMENT_CLO_RT - - -23 } - tp¡©e_e -; - -26 - g_ch¬þass -[256] = { - -36  - #WHITESPACE -( -c -è( -_ch¬þass -[()(c)] =ð1) - - ) - -37  - #ALNUM -( -c -è( -_ch¬þass -[()(c)] >ð2) - - ) - -38  - #ALPHA -( -c -è( -_ch¬þass -[()(c)] =ð3) - - ) - -41  - #EXCLAM - 0x21 - - ) - -42  - #CQUOTE - 0x22 - - ) - -43  - #CDASH - 0x2d - - ) - -44  - #CSLASH - 0x2à - - ) - -45  - #LANGLE - 0x3ø - - ) - -46  - #CEQUAL - 0x3d - - ) - -47  - #RANGLE - 0x3 - - ) - -48  - #CQUEST - 0x3à - - ) - -51  - #TOKEN_CB_CALL -( -ty³ -, -_ns -, -_cu¼’t_too -, -_fš® -) do { \ - -52  -_»t -; \ - -53 -p¡©e_e - -ns - = -_ns -; \ - -54 -ssize_t - -_sz - = ( -p - - -chunk_¡¬t -è+ -_cu¼’t_too -; \ - -55 ià(! -_sz -) { \ - -57 -¡©e - = -_ns -; \ - -60 -_»t - = - `cb -( -ty³ -, -chunk_¡¬t -, -_sz -, -key -); \ - -61 if( -_»t - < -_sz -) { \ - -62 if( -_cu¼’t_too - && -_»t - == -1) \ - -63 -¡©e - = -ns -; \ - -64  -fšish -; \ - -66 -chunk_¡¬t - = -p - + -_cu¼’t_too -; \ - -67 -¡©e - = -ns -; \ - -68 } 0) - - ) - -70  - #TOKEN_CB -( -_ty³ -, -_ns -, -_cu¼’t_too -) \ - -71 - `TOKEN_CB_CALL -( -_ty³ -, -_ns -, -_cu¼’t_too -, 0) - - ) - -73  - #PXML_TAG_FINAL_CHUNK_TYPE - -PXML_TAG_END - - - ) - -74  - #PXML_COMMENT_FINAL_CHUNK_TYPE - -PXML_COMMENT_END - - - ) - -76  - #TOKEN_CB_FINAL -( -_ty³ -, -_ns -, -_cu¼’t_too -) \ - -77 - `TOKEN_CB_CALL -Ð -_ty³ - ## -_FINAL_CHUNK_TYPE - , -_ns -, -_cu¼’t_too -, 1) - - ) - -82 -ssize_t - - $pxml_·r£ -(* -¡©eCڋxt -, cÚ¡ * -xmlbuf -, -size_t - -size -, -pxml_ÿÎback_f - * -cb -, * -key -) { - -83 -p¡©e_e - -¡©e - = (p¡©e_e)* -¡©eCڋxt -; - -84 cÚ¡ * -chunk_¡¬t - = (cÚ¡ *) -xmlbuf -; - -85 cÚ¡ * -p - = -chunk_¡¬t -; - -86 cÚ¡ * -’d - = -p - + -size -; - -88 ; -p - < -’d -;…++) { - -89  -C - = *(cÚ¡ *) -p -; - -90  -¡©e -) { - -91  -ST_TEXT -: - -96 ià( -C - =ð -LANGLE -) - -98 - `TOKEN_CB -( -PXML_TEXT -, -ST_TAG_START -, 0); - -100  -ST_TAG_START -: - -101 ià( - `ALPHA -( -C -è|| (C =ð -CSLASH -)) - -102 -¡©e - = -ST_TAG_BODY -; - -103 ià( -C - =ð -EXCLAM -) - -104 -¡©e - = -ST_COMMENT_WAIT_DASH1 -; - -110 - `TOKEN_CB -( -PXML_TEXT -, -ST_TEXT -, 1); - -112  -ST_TAG_BODY -: - -113  -C -) { - -114  -RANGLE -: - -116 - `TOKEN_CB_FINAL -( -PXML_TAG -, -ST_TEXT -, 1); - -118  -LANGLE -: - -123 - `TOKEN_CB_FINAL -( -PXML_TAG -, -ST_TAG_START -, 0); - -125  -CEQUAL -: - -126 -¡©e - = -ST_TAG_QUOTE_WAIT -; - -130  -ST_TAG_QUOTE_WAIT -: - -134  -C -) { - -135  -CQUOTE -: - -136 -¡©e - = -ST_TAG_QUOTED_STRING -; - -138  -RANGLE -: - -140 - `TOKEN_CB_FINAL -( -PXML_TAG -, -ST_TEXT -, 1); - -143 if(! - `WHITESPACE -( -C -)) - -145 -¡©e - = -ST_TAG_UNQUOTED_STRING -; - -148  -ST_TAG_QUOTED_STRING -: - -152 if( -C - =ð -CQUOTE -) { - -154 -¡©e - = -ST_TAG_BODY -; - -157  -ST_TAG_UNQUOTED_STRING -: - -158 if( -C - =ð -RANGLE -) { - -160 - `TOKEN_CB_FINAL -( -PXML_TAG -, -ST_TEXT -, 1); - -161 } if( - `WHITESPACE -( -C -)) { - -163 -¡©e - = -ST_TAG_BODY -; - -166  -ST_COMMENT_WAIT_DASH1 -: - -167 if( -C - =ð -CDASH -) { - -168 -¡©e - = -ST_COMMENT_WAIT_DASH2 -; - -171 -¡©e - = -ST_TAG_BODY -; - -174  -ST_COMMENT_WAIT_DASH2 -: - -175 if( -C - =ð -CDASH -) { - -177 -¡©e - = -ST_COMMENT -; - -180 -¡©e - = -ST_TAG_BODY -; - -183  -ST_COMMENT -: - -184 if( -C - =ð -CDASH -) { - -185 -¡©e - = -ST_COMMENT_CLO_DASH2 -; - -188  -ST_COMMENT_CLO_DASH2 -: - -189 if( -C - =ð -CDASH -) { - -190 -¡©e - = -ST_COMMENT_CLO_RT -; - -193 -¡©e - = -ST_COMMENT -; - -196  -ST_COMMENT_CLO_RT -: - -197 if( -C - =ð -RANGLE -) { - -198 - `TOKEN_CB_FINAL -( -PXML_COMMENT -, -ST_TEXT -, 1); - -199 } if( -C - =ð -CDASH -) { - -202 -¡©e - = -ST_COMMENT -; - -211 if( -p - - -chunk_¡¬t -) { - -212  -¡©e -) { - -213  -ST_COMMENT -: - -214 - `TOKEN_CB -( -PXML_COMMENT -, -¡©e -, 0); - -216  -ST_TEXT -: - -217 - `TOKEN_CB -( -PXML_TEXT -, -¡©e -, 0); - -223 -fšish -: - -224 * -¡©eCڋxt - = () -¡©e -; - -225  -chunk_¡¬t - - (cÚ¡ *) -xmlbuf -; - -226 - } -} - - @/usr/include/errno.h - -22 #iâdef -_ERRNO_H - - -23  - #_ERRNO_H - 1 - - ) - -25  - ~<ã©u»s.h -> - -28  - ~ - -32 #iâdeà -__ASSEMBLER__ - - -34 -__BEGIN_DECLS - - -37 * - $__”ºo_loÿtiÚ - (è -__THROW - -__©Œibu‹_cÚ¡__ -; - -38  - #”ºo - (* - `__”ºo_loÿtiÚ - ()) - - ) - -40 #ifdeà -__USE_GNU - - -45 * -´og¿m_švoÿtiÚ_Çme -; - -46 * -´og¿m_švoÿtiÚ_shÜt_Çme -; - -50 #iâdeà -__”rÜ_t_defšed - - -51  - #__”rÜ_t_defšed - 1 - - ) - -52  - t”rÜ_t -; - -57 -__END_DECLS - - - @/usr/include/math.h - -23 #iâdef -_MATH_H - - -24  - #_MATH_H - 1 - - ) - -26  - #__GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION - - - ) - -27  - ~ - -29 #ià -defšed - -log - && defšed -__GNUC__ - - -30 #w¬nšg -A - -maüo - -ÿÎed - -log - -was - -®»ady - -defšed - -wh’ - < -m©h -. -h -> wa  -šþuded -. - -31 #w¬nšg -This - -wžl - -ÿu£ - -compž©iÚ - -´obËms -. - -34 - g__BEGIN_DECLS - - -37  - ~ - -40  - ~ - -43  - ~ - -47 #ià -__GNUC_PREREQ - (3, 3) - -48  - #HUGE_VAL - ( - `__bužtš_huge_v® - ()) - - ) - -55  - #HUGE_VAL - 1e10000 - - ) - -57 #ifdeà -__USE_ISOC99 - - -58 #ià -__GNUC_PREREQ - (3, 3) - -59  - #HUGE_VALF - ( - `__bužtš_huge_v®f - ()) - - ) - -60  - #HUGE_VALL - ( - `__bužtš_huge_v®l - ()) - - ) - -62  - #HUGE_VALF - 1e10000f - - ) - -63  - #HUGE_VALL - 1e10000L - - ) - -66 #ià -__HAVE_FLOAT16 - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -67  - #HUGE_VAL_F16 - ( - `__bužtš_huge_v®f16 - ()) - - ) - -69 #ià -__HAVE_FLOAT32 - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -70  - #HUGE_VAL_F32 - ( - `__bužtš_huge_v®f32 - ()) - - ) - -72 #ià -__HAVE_FLOAT64 - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -73  - #HUGE_VAL_F64 - ( - `__bužtš_huge_v®f64 - ()) - - ) - -75 #ià -__HAVE_FLOAT128 - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -76  - #HUGE_VAL_F128 - ( - `__bužtš_huge_v®f128 - ()) - - ) - -78 #ià -__HAVE_FLOAT32X - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -79  - #HUGE_VAL_F32X - ( - `__bužtš_huge_v®f32x - ()) - - ) - -81 #ià -__HAVE_FLOAT64X - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -82  - #HUGE_VAL_F64X - ( - `__bužtš_huge_v®f64x - ()) - - ) - -84 #ià -__HAVE_FLOAT128X - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -85  - #HUGE_VAL_F128X - ( - `__bužtš_huge_v®f128x - ()) - - ) - -88 #ifdeà -__USE_ISOC99 - - -90 #ià -__GNUC_PREREQ - (3, 3) - -91  - #INFINITY - ( - `__bužtš_šff - ()) - - ) - -93  - #INFINITY - -HUGE_VALF - - - ) - -97 #ià -__GNUC_PREREQ - (3, 3) - -98  - #NAN - ( - `__bužtš_Çnf - ("")) - - ) - -103  - #NAN - (0.0à/ 0.0f) - - ) - -107 #ià -__GLIBC_USE - ( -IEC_60559_BFP_EXT -) - -109 #ià -__GNUC_PREREQ - (3, 3) - -110  - #SNANF - ( - `__bužtš_Çnsf - ("")) - - ) - -111  - #SNAN - ( - `__bužtš_Çns - ("")) - - ) - -112  - #SNANL - ( - `__bužtš_Çn¦ - ("")) - - ) - -115 #ià -__HAVE_FLOAT16 - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -116  - #SNANF16 - ( - `__bužtš_Çnsf16 - ("")) - - ) - -118 #ià -__HAVE_FLOAT32 - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -119  - #SNANF32 - ( - `__bužtš_Çnsf32 - ("")) - - ) - -121 #ià -__HAVE_FLOAT64 - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -122  - #SNANF64 - ( - `__bužtš_Çnsf64 - ("")) - - ) - -124 #ià -__HAVE_FLOAT128 - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -125  - #SNANF128 - ( - `__bužtš_Çnsf128 - ("")) - - ) - -127 #ià -__HAVE_FLOAT32X - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -128  - #SNANF32X - ( - `__bužtš_Çnsf32x - ("")) - - ) - -130 #ià -__HAVE_FLOAT64X - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -131  - #SNANF64X - ( - `__bužtš_Çnsf64x - ("")) - - ) - -133 #ià -__HAVE_FLOAT128X - && -__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -134  - #SNANF128X - ( - `__bužtš_Çnsf128x - ("")) - - ) - -138  - ~ - -140 #ifdeà -__USE_ISOC99 - - -148 #ià -__GLIBC_FLT_EVAL_METHOD - == 0 || __GLIBC_FLT_EVAL_METHOD == 16 - -149  - tæßt_t -; - -150  - tdoubË_t -; - -151 #–ià -__GLIBC_FLT_EVAL_METHOD - == 1 - -152  - tæßt_t -; - -153  - tdoubË_t -; - -154 #–ià -__GLIBC_FLT_EVAL_METHOD - == 2 - -155  - tæßt_t -; - -156  - tdoubË_t -; - -157 #–ià -__GLIBC_FLT_EVAL_METHOD - == 32 - -158  -_Flßt32 - - tæßt_t -; - -159  - tdoubË_t -; - -160 #–ià -__GLIBC_FLT_EVAL_METHOD - == 33 - -161  -_Flßt32x - - tæßt_t -; - -162  -_Flßt32x - - tdoubË_t -; - -163 #–ià -__GLIBC_FLT_EVAL_METHOD - == 64 - -164  -_Flßt64 - - tæßt_t -; - -165  -_Flßt64 - - tdoubË_t -; - -166 #–ià -__GLIBC_FLT_EVAL_METHOD - == 65 - -167  -_Flßt64x - - tæßt_t -; - -168  -_Flßt64x - - tdoubË_t -; - -169 #–ià -__GLIBC_FLT_EVAL_METHOD - == 128 - -170  -_Flßt128 - - tæßt_t -; - -171  -_Flßt128 - - tdoubË_t -; - -172 #–ià -__GLIBC_FLT_EVAL_METHOD - == 129 - -173  -_Flßt128x - - tæßt_t -; - -174  -_Flßt128x - - tdoubË_t -; - -190  - ~ - -191 #ifdeà -__USE_ISOC99 - - -192 #ià -__FP_LOGB0_IS_MIN - - -193  - #FP_ILOGB0 - (-2147483647 - 1) - - ) - -195  - #FP_ILOGB0 - (-2147483647) - - ) - -197 #ià -__FP_LOGBNAN_IS_MIN - - -198  - #FP_ILOGBNAN - (-2147483647 - 1) - - ) - -200  - #FP_ILOGBNAN - 2147483647 - - ) - -203 #ià -__GLIBC_USE - ( -IEC_60559_BFP_EXT -) - -204 #ià -__WORDSIZE - == 32 - -205  - #__FP_LONG_MAX - 0x7fffffffL - - ) - -207  - #__FP_LONG_MAX - 0x7fffffffffffffffL - - ) - -209 #ià -__FP_LOGB0_IS_MIN - - -210  - #FP_LLOGB0 - (- -__FP_LONG_MAX - - 1) - - ) - -212  - #FP_LLOGB0 - (- -__FP_LONG_MAX -) - - ) - -214 #ià -__FP_LOGBNAN_IS_MIN - - -215  - #FP_LLOGBNAN - (- -__FP_LONG_MAX - - 1) - - ) - -217  - #FP_LLOGBNAN - -__FP_LONG_MAX - - - ) - -233  - ~ - -235 #ià -__GLIBC_USE - ( -IEC_60559_BFP_EXT -) - -239 - mFP_INT_UPWARD - = - -240  - #FP_INT_UPWARD - 0 - - ) - -241 -FP_INT_UPWARD -, - -242 - mFP_INT_DOWNWARD - = - -243  - #FP_INT_DOWNWARD - 1 - - ) - -244 -FP_INT_DOWNWARD -, - -245 - mFP_INT_TOWARDZERO - = - -246  - #FP_INT_TOWARDZERO - 2 - - ) - -247 -FP_INT_TOWARDZERO -, - -248 - mFP_INT_TONEARESTFROMZERO - = - -249  - #FP_INT_TONEARESTFROMZERO - 3 - - ) - -250 -FP_INT_TONEARESTFROMZERO -, - -251 - mFP_INT_TONEAREST - = - -252  - #FP_INT_TONEAREST - 4 - - ) - -253 -FP_INT_TONEAREST -, - -262  - #__SIMD_DECL -( -funùiÚ -è - `__CONCAT - ( -__DECL_SIMD_ -, funùiÚ) - - ) - -264  - #__MATHCALL_VEC -( -funùiÚ -, -suffix -, -¬gs -) \ - -265 - `__SIMD_DECL - ( - `__MATH_PRECNAME - ( -funùiÚ -, -suffix -)) \ - -266 - `__MATHCALL - ( -funùiÚ -, -suffix -, -¬gs -) - - ) - -268  - #__MATHDECL_VEC -( -ty³ -, -funùiÚ -, -suffix -, -¬gs -) \ - -269 - `__SIMD_DECL - ( - `__MATH_PRECNAME - ( -funùiÚ -, -suffix -)) \ - -270 - `__MATHDECL -( -ty³ -, -funùiÚ -, -suffix -, -¬gs -) - - ) - -272  - #__MATHCALL -( -funùiÚ -, -suffix -, -¬gs -) \ - -273 - `__MATHDECL - ( -_MdoubË_ -, -funùiÚ -, -suffix -, -¬gs -) - - ) - -274  - #__MATHDECL -( -ty³ -, -funùiÚ -, -suffix -, -¬gs -) \ - -275 - `__MATHDECL_1 -( -ty³ -, -funùiÚ -, -suffix -, -¬gs -); \ - -276 - `__MATHDECL_1 -( -ty³ -, - `__CONCAT -( -__ -, -funùiÚ -), -suffix -, -¬gs -) - - ) - -277  - #__MATHCALLX -( -funùiÚ -, -suffix -, -¬gs -, -©Œib -) \ - -278 - `__MATHDECLX - ( -_MdoubË_ -, -funùiÚ -, -suffix -, -¬gs -, -©Œib -) - - ) - -279  - #__MATHDECLX -( -ty³ -, -funùiÚ -, -suffix -, -¬gs -, -©Œib -) \ - -280 - `__MATHDECL_1 -( -ty³ -, -funùiÚ -, -suffix -, -¬gs -è - `__©Œibu‹__ - ( -©Œib -); \ - -281 - `__MATHDECL_1 -( -ty³ -, - `__CONCAT -( -__ -, -funùiÚ -), -suffix -, -¬gs -è - `__©Œibu‹__ - ( -©Œib -) - - ) - -282  - #__MATHDECL_1 -( -ty³ -, -funùiÚ -, -suffix -, -¬gs -) \ - -283 -ty³ - - `__MATH_PRECNAME -( -funùiÚ -, -suffix -è -¬gs - -__THROW - - - ) - -285  - #_MdoubË_ -  - - ) - -286  - #__MATH_PRECNAME -( -Çme -, -r -è - `__CONCAT -Òame,r) - - ) - -287  - #__MATH_DECLARING_DOUBLE - 1 - - ) - -288  - #__MATH_DECLARING_FLOATN - 0 - - ) - -289  - ~ - -290  - ~ - -291 #undeà -_MdoubË_ - - -292 #undeà -__MATH_PRECNAME - - -293 #undeà -__MATH_DECLARING_DOUBLE - - -294 #undeà -__MATH_DECLARING_FLOATN - - -296 #ifdeà -__USE_ISOC99 - - -302  - #_MdoubË_ -  - - ) - -303  - #__MATH_PRECNAME -( -Çme -, -r -èÇme## -f -## - ) -r - -304  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -305  - #__MATH_DECLARING_FLOATN - 0 - - ) - -306  - ~ - -307  - ~ - -308 #undeà -_MdoubË_ - - -309 #undeà -__MATH_PRECNAME - - -310 #undeà -__MATH_DECLARING_DOUBLE - - -311 #undeà -__MATH_DECLARING_FLOATN - - -313 #ià!( -defšed - -__NO_LONG_DOUBLE_MATH - && defšed -_LIBC -) \ - -314 || -defšed - -__LDBL_COMPAT - \ - -315 || -defšed - -_LIBC_TEST - - -316 #ifdeà -__LDBL_COMPAT - - -318 #ifdeà -__USE_ISOC99 - - -319  - $__Ædbl_Ãx‰ow¬df - ( -__x -,  -__y -) - -320 -__THROW - - `__©Œibu‹__ - (( -__cÚ¡__ -)); - -321 #ifdeà -__REDIRECT_NTH - - -322  - `__REDIRECT_NTH - ( -Ãx‰ow¬df -, ( -__x -,  -__y -), - -323 -__Ædbl_Ãx‰ow¬df -) - -324 - `__©Œibu‹__ - (( -__cÚ¡__ -)); - -325  - `__REDIRECT_NTH - ( -Ãx‰ow¬d -, ( -__x -,  -__y -), - -326 -Ãxá” -è - `__©Œibu‹__ - (( -__cÚ¡__ -)); - -327  - `__REDIRECT_NTH - ( -Ãx‰ow¬dl -, - -328 ( -__x -,  -__y -), - -329 -Ãxá” -è - `__©Œibu‹__ - (( -__cÚ¡__ -)); - -333 #undeà -__MATHDECL_1 - - -334  - #__MATHDECL_2 -( -ty³ -, -funùiÚ -, -suffix -, -¬gs -, -®Ÿs -) \ - -335 -ty³ - - `__REDIRECT_NTH -( - `__MATH_PRECNAME -( -funùiÚ -, -suffix -), \ - -336 -¬gs -, -®Ÿs -) - - ) - -337  - #__MATHDECL_1 -( -ty³ -, -funùiÚ -, -suffix -, -¬gs -) \ - -338 - `__MATHDECL_2 -( -ty³ -, -funùiÚ -, -suffix -, -¬gs -, - `__CONCAT -(funùiÚ,suffix)) - - ) - -344  - #_MdoubË_ -  - - ) - -345  - #__MATH_PRECNAME -( -Çme -, -r -èÇme## -l -## - ) -r - -346  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -347  - #__MATH_DECLARING_FLOATN - 0 - - ) - -348  - #__MATH_DECLARE_LDOUBLE - 1 - - ) - -349  - ~ - -350  - ~ - -351 #undeà -_MdoubË_ - - -352 #undeà -__MATH_PRECNAME - - -353 #undeà -__MATH_DECLARING_DOUBLE - - -354 #undeà -__MATH_DECLARING_FLOATN - - -363 #ià -__HAVE_DISTINCT_FLOAT16 - || ( -__HAVE_FLOAT16 - && ! -defšed - -_LIBC -) - -364  - #_MdoubË_ - -_Flßt16 - - - ) - -365  - #__MATH_PRECNAME -( -Çme -, -r -èÇme## -f16 -## - ) -r - -366  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -367  - #__MATH_DECLARING_FLOATN - 1 - - ) - -368 #ià -__HAVE_DISTINCT_FLOAT16 - - -369  - ~ - -371 #ià - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -372  - ~ - -374 #undeà -_MdoubË_ - - -375 #undeà -__MATH_PRECNAME - - -376 #undeà -__MATH_DECLARING_DOUBLE - - -377 #undeà -__MATH_DECLARING_FLOATN - - -380 #ià -__HAVE_DISTINCT_FLOAT32 - || ( -__HAVE_FLOAT32 - && ! -defšed - -_LIBC -) - -381  - #_MdoubË_ - -_Flßt32 - - - ) - -382  - #__MATH_PRECNAME -( -Çme -, -r -èÇme## -f32 -## - ) -r - -383  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -384  - #__MATH_DECLARING_FLOATN - 1 - - ) - -385 #ià -__HAVE_DISTINCT_FLOAT32 - - -386  - ~ - -388 #ià - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -389  - ~ - -391 #undeà -_MdoubË_ - - -392 #undeà -__MATH_PRECNAME - - -393 #undeà -__MATH_DECLARING_DOUBLE - - -394 #undeà -__MATH_DECLARING_FLOATN - - -397 #ià -__HAVE_DISTINCT_FLOAT64 - || ( -__HAVE_FLOAT64 - && ! -defšed - -_LIBC -) - -398  - #_MdoubË_ - -_Flßt64 - - - ) - -399  - #__MATH_PRECNAME -( -Çme -, -r -èÇme## -f64 -## - ) -r - -400  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -401  - #__MATH_DECLARING_FLOATN - 1 - - ) - -402 #ià -__HAVE_DISTINCT_FLOAT64 - - -403  - ~ - -405 #ià - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -406  - ~ - -408 #undeà -_MdoubË_ - - -409 #undeà -__MATH_PRECNAME - - -410 #undeà -__MATH_DECLARING_DOUBLE - - -411 #undeà -__MATH_DECLARING_FLOATN - - -414 #ià -__HAVE_DISTINCT_FLOAT128 - || ( -__HAVE_FLOAT128 - && ! -defšed - -_LIBC -) - -415  - #_MdoubË_ - -_Flßt128 - - - ) - -416  - #__MATH_PRECNAME -( -Çme -, -r -èÇme## -f128 -## - ) -r - -417  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -418  - #__MATH_DECLARING_FLOATN - 1 - - ) - -419 #ià -__HAVE_DISTINCT_FLOAT128 - - -420  - ~ - -422 #ià - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -423  - ~ - -425 #undeà -_MdoubË_ - - -426 #undeà -__MATH_PRECNAME - - -427 #undeà -__MATH_DECLARING_DOUBLE - - -428 #undeà -__MATH_DECLARING_FLOATN - - -431 #ià -__HAVE_DISTINCT_FLOAT32X - || ( -__HAVE_FLOAT32X - && ! -defšed - -_LIBC -) - -432  - #_MdoubË_ - -_Flßt32x - - - ) - -433  - #__MATH_PRECNAME -( -Çme -, -r -èÇme## -f32x -## - ) -r - -434  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -435  - #__MATH_DECLARING_FLOATN - 1 - - ) - -436 #ià -__HAVE_DISTINCT_FLOAT32X - - -437  - ~ - -439 #ià - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -440  - ~ - -442 #undeà -_MdoubË_ - - -443 #undeà -__MATH_PRECNAME - - -444 #undeà -__MATH_DECLARING_DOUBLE - - -445 #undeà -__MATH_DECLARING_FLOATN - - -448 #ià -__HAVE_DISTINCT_FLOAT64X - || ( -__HAVE_FLOAT64X - && ! -defšed - -_LIBC -) - -449  - #_MdoubË_ - -_Flßt64x - - - ) - -450  - #__MATH_PRECNAME -( -Çme -, -r -èÇme## -f64x -## - ) -r - -451  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -452  - #__MATH_DECLARING_FLOATN - 1 - - ) - -453 #ià -__HAVE_DISTINCT_FLOAT64X - - -454  - ~ - -456 #ià - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -457  - ~ - -459 #undeà -_MdoubË_ - - -460 #undeà -__MATH_PRECNAME - - -461 #undeà -__MATH_DECLARING_DOUBLE - - -462 #undeà -__MATH_DECLARING_FLOATN - - -465 #ià -__HAVE_DISTINCT_FLOAT128X - || ( -__HAVE_FLOAT128X - && ! -defšed - -_LIBC -) - -466  - #_MdoubË_ - -_Flßt128x - - - ) - -467  - #__MATH_PRECNAME -( -Çme -, -r -èÇme## -f128x -## - ) -r - -468  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -469  - #__MATH_DECLARING_FLOATN - 1 - - ) - -470 #ià -__HAVE_DISTINCT_FLOAT128X - - -471  - ~ - -473 #ià - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -474  - ~ - -476 #undeà -_MdoubË_ - - -477 #undeà -__MATH_PRECNAME - - -478 #undeà -__MATH_DECLARING_DOUBLE - - -479 #undeà -__MATH_DECLARING_FLOATN - - -482 #undeà -__MATHDECL_1 - - -483 #undeà -__MATHDECL - - -484 #undeà -__MATHCALL - - -487 #ià -defšed - -__USE_MISC - || defšed -__USE_XOPEN - - -489  -signgam -; - -492 #ià( -__HAVE_DISTINCT_FLOAT16 - \ - -493 || -__HAVE_DISTINCT_FLOAT32 - \ - -494 || -__HAVE_DISTINCT_FLOAT64 - \ - -495 || -__HAVE_DISTINCT_FLOAT32X - \ - -496 || -__HAVE_DISTINCT_FLOAT64X - \ - -497 || -__HAVE_DISTINCT_FLOAT128X -) - -510 #ifdeà -__NO_LONG_DOUBLE_MATH - - -511 #ià -__HAVE_DISTINCT_FLOAT128 - - -514  - #__MATH_TG -( -TG_ARG -, -FUNC -, -ARGS -) \ - -515 ( ( -TG_ARG -è=ð (è? -FUNC - ## -f - -ARGS - : FUNC ARGS) - - ) - -516 #–ià -__HAVE_DISTINCT_FLOAT128 - - -517 #ià -__HAVE_GENERIC_SELECTION - - -518 #ià -__HAVE_FLOATN_NOT_TYPEDEF - && -__HAVE_FLOAT32 - - -519  - #__MATH_TG_F32 -( -FUNC -, -ARGS -è -_Flßt32 -: FUNC ## -f - ARGS, - - ) - -521  - #__MATH_TG_F32 -( -FUNC -, -ARGS -) - - ) - -523 #ià -__HAVE_FLOATN_NOT_TYPEDEF - && -__HAVE_FLOAT64X - - -524 #ià -__HAVE_FLOAT64X_LONG_DOUBLE - - -525  - #__MATH_TG_F64X -( -FUNC -, -ARGS -è -_Flßt64x -: FUNC ## -l - ARGS, - - ) - -527  - #__MATH_TG_F64X -( -FUNC -, -ARGS -è -_Flßt64x -: FUNC ## -f128 - ARGS, - - ) - -530  - #__MATH_TG_F64X -( -FUNC -, -ARGS -) - - ) - -532  - #__MATH_TG -( -TG_ARG -, -FUNC -, -ARGS -) \ - -533 - `_G’”ic - (( -TG_ARG -), \ - -534 : -FUNC - ## -f - -ARGS -, \ - -535 - `__MATH_TG_F32 - ( -FUNC -, -ARGS -) \ - -536 : -FUNC - -ARGS -, \ - -537 : -FUNC - ## -l - -ARGS -, \ - -538 - `__MATH_TG_F64X - ( -FUNC -, -ARGS -) \ - -539 -_Flßt128 -: -FUNC - ## -f128 - -ARGS -) - - ) - -541 #ià -__HAVE_FLOATN_NOT_TYPEDEF - - -544  - #__MATH_TG -( -TG_ARG -, -FUNC -, -ARGS -) \ - -545 -__bužtš_choo£_ex´ - \ - -546 ( - `__bužtš_ty³s_com·tibË_p - ( - `__ty³of - ( -TG_ARG -), ), \ - -547 -FUNC - ## -f - -ARGS -, \ - -548 -__bužtš_choo£_ex´ - \ - -549 ( - `__bužtš_ty³s_com·tibË_p - ( - `__ty³of - ( -TG_ARG -), ), \ - -550 -FUNC - -ARGS -, \ - -551 -__bužtš_choo£_ex´ - \ - -552 ( - `__bužtš_ty³s_com·tibË_p - ( - `__ty³of - ( -TG_ARG -), ), \ - -553 -FUNC - ## -l - -ARGS -, \ - -554 -FUNC - ## -f128 - -ARGS -))) - - ) - -557  - #__MATH_TG -( -TG_ARG -, -FUNC -, -ARGS -) \ - -558 ( ( -TG_ARG -) ==  () \ - -559 ? -FUNC - ## -f - -ARGS - \ - -560 :  ( -TG_ARG -) ==  () \ - -561 ? -FUNC - -ARGS - \ - -562 : -FUNC - ## -l - -ARGS -) - - ) - -566 #ifdeà -__USE_ISOC99 - - -571 -FP_NAN - = - -572  - #FP_NAN - 0 - - ) - -573 -FP_NAN -, - -574 -FP_INFINITE - = - -575  - #FP_INFINITE - 1 - - ) - -576 -FP_INFINITE -, - -577 -FP_ZERO - = - -578  - #FP_ZERO - 2 - - ) - -579 -FP_ZERO -, - -580 -FP_SUBNORMAL - = - -581  - #FP_SUBNORMAL - 3 - - ) - -582 -FP_SUBNORMAL -, - -583 -FP_NORMAL - = - -584  - #FP_NORMAL - 4 - - ) - -585 -FP_NORMAL - - -593 #ià - `__GNUC_PREREQ - (4,4è&& ! -defšed - -__SUPPORT_SNAN__ - \ - -594 && (! -defšed - -__OPTIMIZE_SIZE__ - || defšed -__ýlu¥lus -) - -601  - #åþassify -( -x -è - `__bužtš_åþassify - ( -FP_NAN -, -FP_INFINITE -, \ - -602 -FP_NORMAL -, -FP_SUBNORMAL -, -FP_ZERO -, -x -) - - ) - -604  - #åþassify -( -x -è - `__MATH_TG - ((x), -__åþassify -, (x)) - - ) - -608 #ià - `__GNUC_PREREQ - (6,0) - -609  - #signb™ -( -x -è - `__bužtš_signb™ - (x) - - ) - -610 #–ià -defšed - -__ýlu¥lus - - -618  - #signb™ -( -x -è - `__bužtš_signb™l - (x) - - ) - -619 #–ià - `__GNUC_PREREQ - (4,0) - -620  - #signb™ -( -x -è - `__MATH_TG - ((x), -__bužtš_signb™ -, (x)) - - ) - -622  - #signb™ -( -x -è - `__MATH_TG - ((x), -__signb™ -, (x)) - - ) - -626 #ià - `__GNUC_PREREQ - (4,4è&& ! -defšed - -__SUPPORT_SNAN__ - - -627  - #isfš™e -( -x -è - `__bužtš_isfš™e - (x) - - ) - -629  - #isfš™e -( -x -è - `__MATH_TG - ((x), -__fš™e -, (x)) - - ) - -633 #ià - `__GNUC_PREREQ - (4,4è&& ! -defšed - -__SUPPORT_SNAN__ - - -634  - #i¢Üm® -( -x -è - `__bužtš_i¢Üm® - (x) - - ) - -636  - #i¢Üm® -( -x -è( - `åþassify - (xè=ð -FP_NORMAL -) - - ) - -641 #ià - `__GNUC_PREREQ - (4,4è&& ! -defšed - -__SUPPORT_SNAN__ - - -642  - #i¢ª -( -x -è - `__bužtš_i¢ª - (x) - - ) - -644  - #i¢ª -( -x -è - `__MATH_TG - ((x), -__i¢ª -, (x)) - - ) - -648 #ià -__HAVE_DISTINCT_FLOAT128 - && ! - `__GNUC_PREREQ - (7,0) \ - -649 && ! -defšed - -__SUPPORT_SNAN__ - && !defšed -__ýlu¥lus - - -655  - #isšf -( -x -) \ - -656 ( - `__bužtš_ty³s_com·tibË_p - ( - `__ty³of - ( -x -), -_Flßt128 -) \ - -657 ? - `__isšff128 - ( -x -è: - `__bužtš_isšf_sign - (x)) - - ) - -658 #–ià - `__GNUC_PREREQ - (4,4è&& ! -defšed - -__SUPPORT_SNAN__ - - -659  - #isšf -( -x -è - `__bužtš_isšf_sign - (x) - - ) - -661  - #isšf -( -x -è - `__MATH_TG - ((x), -__isšf -, (x)) - - ) - -665  - #MATH_ERRNO - 1 - - ) - -666  - #MATH_ERREXCEPT - 2 - - ) - -673 #ifdeà -__FAST_MATH__ - - -674  - #m©h_”rhªdlšg - 0 - - ) - -675 #–ià -defšed - -__NO_MATH_ERRNO__ - - -676  - #m©h_”rhªdlšg - ( -MATH_ERREXCEPT -) - - ) - -678  - #m©h_”rhªdlšg - ( -MATH_ERRNO - | -MATH_ERREXCEPT -) - - ) - -683 #ià - `__GLIBC_USE - ( -IEC_60559_BFP_EXT -) - -684  - ~ - -687 #iâdeà -__ýlu¥lus - - -688  - #issigÇlšg -( -x -è - `__MATH_TG - ((x), -__issigÇlšg -, (x)) - - ) - -697 -šlše -  - `issigÇlšg - ( -__v® -è{  - `__issigÇlšgf - (__val); } - -698 -šlše -  - `issigÇlšg - ( -__v® -è{  - `__issigÇlšg - (__val); } - -699 -šlše -  - -700 - `issigÇlšg - ( -__v® -) - -702 #ifdeà -__NO_LONG_DOUBLE_MATH - - -703  - `__issigÇlšg - ( -__v® -); - -705  - `__issigÇlšgl - ( -__v® -); - -708 #ià -__HAVE_DISTINCT_FLOAT128 - - -709 -šlše -  - `issigÇlšg - ( -_Flßt128 - -__v® -è{  - `__issigÇlšgf128 - (__val); } - -711 - } -} - -715  - #issubnÜm® -( -x -è( - `åþassify - (xè=ð -FP_SUBNORMAL -) - - ) - -718 #iâdeà -__ýlu¥lus - - -719 #ifdeà -__SUPPORT_SNAN__ - - -720  - #isz”o -( -x -è( - `åþassify - (xè=ð -FP_ZERO -) - - ) - -722  - #isz”o -( -x -è((( - `__ty³of - (x)è(x)è=ð0) - - ) - -726 #ifdeà -__SUPPORT_SNAN__ - - -727 -šlše -  - -728 -isz”o - ( -__v® -) - -730  -__åþassifyf - ( -__v® -è=ð -FP_ZERO -; - -732 -šlše -  - -733 -isz”o - ( -__v® -) - -735  -__åþassify - ( -__v® -è=ð -FP_ZERO -; - -737 -šlše -  - -738 -isz”o - ( -__v® -) - -740 #ifdeà -__NO_LONG_DOUBLE_MATH - - -741  -__åþassify - ( -__v® -è=ð -FP_ZERO -; - -743  -__åþassifyl - ( -__v® -è=ð -FP_ZERO -; - -746 #ià -__HAVE_DISTINCT_FLOAT128 - - -747 -šlše -  - -748 -isz”o - ( -_Flßt128 - -__v® -) - -750  -__åþassifyf128 - ( -__v® -è=ð -FP_ZERO -; - -754 -‹m¶©e - < -þass - -__T -> -šlše - -boÞ - - -755 -isz”o - ( -__T - -__v® -) - -757  -__v® - == 0; - -764 #ifdeà -__USE_XOPEN - - -766  - #MAXFLOAT - 3.40282347e+38F - - ) - -771 #ià -defšed - -__USE_MISC - || defšed -__USE_XOPEN - - -772  - #M_E - 2.7182818284590452354 - - ) - -773  - #M_LOG2E - 1.4426950408889634074 - - ) - -774  - #M_LOG10E - 0.43429448190325182765 - - ) - -775  - #M_LN2 - 0.69314718055994530942 - - ) - -776  - #M_LN10 - 2.30258509299404568402 - - ) - -777  - #M_PI - 3.14159265358979323846 - - ) - -778  - #M_PI_2 - 1.57079632679489661923 - - ) - -779  - #M_PI_4 - 0.78539816339744830962 - - ) - -780  - #M_1_PI - 0.31830988618379067154 - - ) - -781  - #M_2_PI - 0.63661977236758134308 - - ) - -782  - #M_2_SQRTPI - 1.12837916709551257390 - - ) - -783  - #M_SQRT2 - 1.41421356237309504880 - - ) - -784  - #M_SQRT1_2 - 0.70710678118654752440 - - ) - -790 #ifdeà -__USE_GNU - - -791  - #M_El - 2.718281828459045235360287471352662498L - - ) - -792  - #M_LOG2El - 1.442695040888963407359924681001892137L - - ) - -793  - #M_LOG10El - 0.434294481903251827651128918916605082L - - ) - -794  - #M_LN2l - 0.693147180559945309417232121458176568L - - ) - -795  - #M_LN10l - 2.302585092994045684017991454684364208L - - ) - -796  - #M_PIl - 3.141592653589793238462643383279502884L - - ) - -797  - #M_PI_2l - 1.570796326794896619231321691639751442L - - ) - -798  - #M_PI_4l - 0.785398163397448309615660845819875721L - - ) - -799  - #M_1_PIl - 0.318309886183790671537767526745028724L - - ) - -800  - #M_2_PIl - 0.636619772367581343075535053490057448L - - ) - -801  - #M_2_SQRTPIl - 1.128379167095512573896158903121545172L - - ) - -802  - #M_SQRT2l - 1.414213562373095048801688724209698079L - - ) - -803  - #M_SQRT1_2l - 0.707106781186547524400844362104849039L - - ) - -806 #ià -__HAVE_FLOAT16 - && -defšed - -__USE_GNU - - -807  - #M_Ef16 - - `__f16 - (2.718281828459045235360287471352662498è - - ) - -808  - #M_LOG2Ef16 - - `__f16 - (1.442695040888963407359924681001892137è - - ) - -809  - #M_LOG10Ef16 - - `__f16 - (0.434294481903251827651128918916605082è - - ) - -810  - #M_LN2f16 - - `__f16 - (0.693147180559945309417232121458176568è - - ) - -811  - #M_LN10f16 - - `__f16 - (2.302585092994045684017991454684364208è - - ) - -812  - #M_PIf16 - - `__f16 - (3.141592653589793238462643383279502884è - - ) - -813  - #M_PI_2f16 - - `__f16 - (1.570796326794896619231321691639751442è - - ) - -814  - #M_PI_4f16 - - `__f16 - (0.785398163397448309615660845819875721è - - ) - -815  - #M_1_PIf16 - - `__f16 - (0.318309886183790671537767526745028724è - - ) - -816  - #M_2_PIf16 - - `__f16 - (0.636619772367581343075535053490057448è - - ) - -817  - #M_2_SQRTPIf16 - - `__f16 - (1.128379167095512573896158903121545172è - - ) - -818  - #M_SQRT2f16 - - `__f16 - (1.414213562373095048801688724209698079è - - ) - -819  - #M_SQRT1_2f16 - - `__f16 - (0.707106781186547524400844362104849039è - - ) - -822 #ià -__HAVE_FLOAT32 - && -defšed - -__USE_GNU - - -823  - #M_Ef32 - - `__f32 - (2.718281828459045235360287471352662498è - - ) - -824  - #M_LOG2Ef32 - - `__f32 - (1.442695040888963407359924681001892137è - - ) - -825  - #M_LOG10Ef32 - - `__f32 - (0.434294481903251827651128918916605082è - - ) - -826  - #M_LN2f32 - - `__f32 - (0.693147180559945309417232121458176568è - - ) - -827  - #M_LN10f32 - - `__f32 - (2.302585092994045684017991454684364208è - - ) - -828  - #M_PIf32 - - `__f32 - (3.141592653589793238462643383279502884è - - ) - -829  - #M_PI_2f32 - - `__f32 - (1.570796326794896619231321691639751442è - - ) - -830  - #M_PI_4f32 - - `__f32 - (0.785398163397448309615660845819875721è - - ) - -831  - #M_1_PIf32 - - `__f32 - (0.318309886183790671537767526745028724è - - ) - -832  - #M_2_PIf32 - - `__f32 - (0.636619772367581343075535053490057448è - - ) - -833  - #M_2_SQRTPIf32 - - `__f32 - (1.128379167095512573896158903121545172è - - ) - -834  - #M_SQRT2f32 - - `__f32 - (1.414213562373095048801688724209698079è - - ) - -835  - #M_SQRT1_2f32 - - `__f32 - (0.707106781186547524400844362104849039è - - ) - -838 #ià -__HAVE_FLOAT64 - && -defšed - -__USE_GNU - - -839  - #M_Ef64 - - `__f64 - (2.718281828459045235360287471352662498è - - ) - -840  - #M_LOG2Ef64 - - `__f64 - (1.442695040888963407359924681001892137è - - ) - -841  - #M_LOG10Ef64 - - `__f64 - (0.434294481903251827651128918916605082è - - ) - -842  - #M_LN2f64 - - `__f64 - (0.693147180559945309417232121458176568è - - ) - -843  - #M_LN10f64 - - `__f64 - (2.302585092994045684017991454684364208è - - ) - -844  - #M_PIf64 - - `__f64 - (3.141592653589793238462643383279502884è - - ) - -845  - #M_PI_2f64 - - `__f64 - (1.570796326794896619231321691639751442è - - ) - -846  - #M_PI_4f64 - - `__f64 - (0.785398163397448309615660845819875721è - - ) - -847  - #M_1_PIf64 - - `__f64 - (0.318309886183790671537767526745028724è - - ) - -848  - #M_2_PIf64 - - `__f64 - (0.636619772367581343075535053490057448è - - ) - -849  - #M_2_SQRTPIf64 - - `__f64 - (1.128379167095512573896158903121545172è - - ) - -850  - #M_SQRT2f64 - - `__f64 - (1.414213562373095048801688724209698079è - - ) - -851  - #M_SQRT1_2f64 - - `__f64 - (0.707106781186547524400844362104849039è - - ) - -854 #ià -__HAVE_FLOAT128 - && -defšed - -__USE_GNU - - -855  - #M_Ef128 - - `__f128 - (2.718281828459045235360287471352662498è - - ) - -856  - #M_LOG2Ef128 - - `__f128 - (1.442695040888963407359924681001892137è - - ) - -857  - #M_LOG10Ef128 - - `__f128 - (0.434294481903251827651128918916605082è - - ) - -858  - #M_LN2f128 - - `__f128 - (0.693147180559945309417232121458176568è - - ) - -859  - #M_LN10f128 - - `__f128 - (2.302585092994045684017991454684364208è - - ) - -860  - #M_PIf128 - - `__f128 - (3.141592653589793238462643383279502884è - - ) - -861  - #M_PI_2f128 - - `__f128 - (1.570796326794896619231321691639751442è - - ) - -862  - #M_PI_4f128 - - `__f128 - (0.785398163397448309615660845819875721è - - ) - -863  - #M_1_PIf128 - - `__f128 - (0.318309886183790671537767526745028724è - - ) - -864  - #M_2_PIf128 - - `__f128 - (0.636619772367581343075535053490057448è - - ) - -865  - #M_2_SQRTPIf128 - - `__f128 - (1.128379167095512573896158903121545172è - - ) - -866  - #M_SQRT2f128 - - `__f128 - (1.414213562373095048801688724209698079è - - ) - -867  - #M_SQRT1_2f128 - - `__f128 - (0.707106781186547524400844362104849039è - - ) - -870 #ià -__HAVE_FLOAT32X - && -defšed - -__USE_GNU - - -871  - #M_Ef32x - - `__f32x - (2.718281828459045235360287471352662498è - - ) - -872  - #M_LOG2Ef32x - - `__f32x - (1.442695040888963407359924681001892137è - - ) - -873  - #M_LOG10Ef32x - - `__f32x - (0.434294481903251827651128918916605082è - - ) - -874  - #M_LN2f32x - - `__f32x - (0.693147180559945309417232121458176568è - - ) - -875  - #M_LN10f32x - - `__f32x - (2.302585092994045684017991454684364208è - - ) - -876  - #M_PIf32x - - `__f32x - (3.141592653589793238462643383279502884è - - ) - -877  - #M_PI_2f32x - - `__f32x - (1.570796326794896619231321691639751442è - - ) - -878  - #M_PI_4f32x - - `__f32x - (0.785398163397448309615660845819875721è - - ) - -879  - #M_1_PIf32x - - `__f32x - (0.318309886183790671537767526745028724è - - ) - -880  - #M_2_PIf32x - - `__f32x - (0.636619772367581343075535053490057448è - - ) - -881  - #M_2_SQRTPIf32x - - `__f32x - (1.128379167095512573896158903121545172è - - ) - -882  - #M_SQRT2f32x - - `__f32x - (1.414213562373095048801688724209698079è - - ) - -883  - #M_SQRT1_2f32x - - `__f32x - (0.707106781186547524400844362104849039è - - ) - -886 #ià -__HAVE_FLOAT64X - && -defšed - -__USE_GNU - - -887  - #M_Ef64x - - `__f64x - (2.718281828459045235360287471352662498è - - ) - -888  - #M_LOG2Ef64x - - `__f64x - (1.442695040888963407359924681001892137è - - ) - -889  - #M_LOG10Ef64x - - `__f64x - (0.434294481903251827651128918916605082è - - ) - -890  - #M_LN2f64x - - `__f64x - (0.693147180559945309417232121458176568è - - ) - -891  - #M_LN10f64x - - `__f64x - (2.302585092994045684017991454684364208è - - ) - -892  - #M_PIf64x - - `__f64x - (3.141592653589793238462643383279502884è - - ) - -893  - #M_PI_2f64x - - `__f64x - (1.570796326794896619231321691639751442è - - ) - -894  - #M_PI_4f64x - - `__f64x - (0.785398163397448309615660845819875721è - - ) - -895  - #M_1_PIf64x - - `__f64x - (0.318309886183790671537767526745028724è - - ) - -896  - #M_2_PIf64x - - `__f64x - (0.636619772367581343075535053490057448è - - ) - -897  - #M_2_SQRTPIf64x - - `__f64x - (1.128379167095512573896158903121545172è - - ) - -898  - #M_SQRT2f64x - - `__f64x - (1.414213562373095048801688724209698079è - - ) - -899  - #M_SQRT1_2f64x - - `__f64x - (0.707106781186547524400844362104849039è - - ) - -902 #ià -__HAVE_FLOAT128X - && -defšed - -__USE_GNU - - -909 #ià -defšed - -__STRICT_ANSI__ - && !defšed -__NO_MATH_INLINES - - -910  - #__NO_MATH_INLINES - 1 - - ) - -913 #ifdeà -__USE_ISOC99 - - -914 #ià -__GNUC_PREREQ - (3, 1) - -921  - #isg»©” -( -x -, -y -è - `__bužtš_isg»©” -(x, y) - - ) - -922  - #isg»©”equ® -( -x -, -y -è - `__bužtš_isg»©”equ® -(x, y) - - ) - -923  - #i¦ess -( -x -, -y -è - `__bužtš_i¦ess -(x, y) - - ) - -924  - #i¦es£qu® -( -x -, -y -è - `__bužtš_i¦es£qu® -(x, y) - - ) - -925  - #i¦essg»©” -( -x -, -y -è - `__bužtš_i¦essg»©” -(x, y) - - ) - -926  - #isunÜd”ed -( -x -, -y -è - `__bužtš_isunÜd”ed -(x, y) - - ) - -928  - #isg»©” -( -x -, -y -) \ - -929 ( - `__ex‹nsiÚ__ - ({ - `__ty³of__ - ( -x -è -__x - = (x); __ty³of__ ( -y -è -__y - = (y); \ - -930 ! - `isunÜd”ed - ( -__x -, -__y -è&& __x > __y; })) - - ) - -931  - #isg»©”equ® -( -x -, -y -) \ - -932 ( - `__ex‹nsiÚ__ - ({ - `__ty³of__ - ( -x -è -__x - = (x); __ty³of__ ( -y -è -__y - = (y); \ - -933 ! - `isunÜd”ed - ( -__x -, -__y -è&& __x >ð__y; })) - - ) - -934  - #i¦ess -( -x -, -y -) \ - -935 ( - `__ex‹nsiÚ__ - ({ - `__ty³of__ - ( -x -è -__x - = (x); __ty³of__ ( -y -è -__y - = (y); \ - -936 ! - `isunÜd”ed - ( -__x -, -__y -è&& __x < __y; })) - - ) - -937  - #i¦es£qu® -( -x -, -y -) \ - -938 ( - `__ex‹nsiÚ__ - ({ - `__ty³of__ - ( -x -è -__x - = (x); __ty³of__ ( -y -è -__y - = (y); \ - -939 ! - `isunÜd”ed - ( -__x -, -__y -è&& __x <ð__y; })) - - ) - -940  - #i¦essg»©” -( -x -, -y -) \ - -941 ( - `__ex‹nsiÚ__ - ({ - `__ty³of__ - ( -x -è -__x - = (x); __ty³of__ ( -y -è -__y - = (y); \ - -942 ! - `isunÜd”ed - ( -__x -, -__y -è&& __x !ð__y; })) - - ) - -944  - #isunÜd”ed -( -x -, -y -) \ - -945 ( - `__ex‹nsiÚ__ - ({ - `__ty³of__ - ( -x -è -__u - = (x); __ty³of__ ( -y -è -__v - = (y); \ - -946 -__u - !ð -__v - && (__u !ð__u || __v !ð__v); })) - - ) - -951 #ifdeà -__USE_EXTERN_INLINES - - -952  - ~ - -957 #ià -defšed - -__FINITE_MATH_ONLY__ - && __FINITE_MATH_ONLY__ > 0 - -960  - #_MdoubË_ -  - - ) - -961  - #__MATH_DECLARING_DOUBLE - 1 - - ) - -962  - #__MATH_DECLARING_FLOATN - 0 - - ) - -963  - #__REDIRFROM_X -( -funùiÚ -, -»’Œªt -) \ - -964 -funùiÚ - ## -»’Œªt - - - ) - -965  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -966 -__ - ## -funùiÚ - ## -»’Œªt - ## -_fš™e - - - ) - -967  - ~ - -968 #undeà -_MdoubË_ - - -969 #undeà -__MATH_DECLARING_DOUBLE - - -970 #undeà -__MATH_DECLARING_FLOATN - - -971 #undeà -__REDIRFROM_X - - -972 #undeà -__REDIRTO_X - - -976 #ifdeà -__USE_ISOC99 - - -979  - #_MdoubË_ -  - - ) - -980  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -981  - #__MATH_DECLARING_FLOATN - 0 - - ) - -982  - #__REDIRFROM_X -( -funùiÚ -, -»’Œªt -) \ - -983 -funùiÚ - ## -f - ## -»’Œªt - - - ) - -984  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -985 -__ - ## -funùiÚ - ## -f - ## -»’Œªt - ## -_fš™e - - - ) - -986  - ~ - -987 #undeà -_MdoubË_ - - -988 #undeà -__MATH_DECLARING_DOUBLE - - -989 #undeà -__MATH_DECLARING_FLOATN - - -990 #undeà -__REDIRFROM_X - - -991 #undeà -__REDIRTO_X - - -994 #ifdeà -__MATH_DECLARE_LDOUBLE - - -995  - #_MdoubË_ -  - - ) - -996  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -997  - #__MATH_DECLARING_FLOATN - 0 - - ) - -998  - #__REDIRFROM_X -( -funùiÚ -, -»’Œªt -) \ - -999 -funùiÚ - ## -l - ## -»’Œªt - - - ) - -1000 #ifdeà -__NO_LONG_DOUBLE_MATH - - -1001  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1002 -__ - ## -funùiÚ - ## -»’Œªt - ## -_fš™e - - - ) - -1004  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1005 -__ - ## -funùiÚ - ## -l - ## -»’Œªt - ## -_fš™e - - - ) - -1007  - ~ - -1008 #undeà -_MdoubË_ - - -1009 #undeà -__MATH_DECLARING_DOUBLE - - -1010 #undeà -__MATH_DECLARING_FLOATN - - -1011 #undeà -__REDIRFROM_X - - -1012 #undeà -__REDIRTO_X - - -1019 #ià( -__HAVE_DISTINCT_FLOAT16 - || ( -__HAVE_FLOAT16 - && ! -defšed - -_LIBC -)) \ - -1020 && - $__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -1021  - #_MdoubË_ - -_Flßt16 - - - ) - -1022  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -1023  - #__MATH_DECLARING_FLOATN - 1 - - ) - -1024  - #__REDIRFROM_X -( -funùiÚ -, -»’Œªt -) \ - -1025 -funùiÚ - ## -f16 - ## -»’Œªt - - - ) - -1026 #ià -__HAVE_DISTINCT_FLOAT16 - - -1027  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1028 -__ - ## -funùiÚ - ## -f16 - ## -»’Œªt - ## -_fš™e - - - ) - -1032  - ~ - -1033 #undeà -_MdoubË_ - - -1034 #undeà -__MATH_DECLARING_DOUBLE - - -1035 #undeà -__MATH_DECLARING_FLOATN - - -1036 #undeà -__REDIRFROM_X - - -1037 #undeà -__REDIRTO_X - - -1040 #ià( -__HAVE_DISTINCT_FLOAT32 - || ( -__HAVE_FLOAT32 - && ! -defšed - -_LIBC -)) \ - -1041 && - $__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -1042  - #_MdoubË_ - -_Flßt32 - - - ) - -1043  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -1044  - #__MATH_DECLARING_FLOATN - 1 - - ) - -1045  - #__REDIRFROM_X -( -funùiÚ -, -»’Œªt -) \ - -1046 -funùiÚ - ## -f32 - ## -»’Œªt - - - ) - -1047 #ià -__HAVE_DISTINCT_FLOAT32 - - -1048  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1049 -__ - ## -funùiÚ - ## -f32 - ## -»’Œªt - ## -_fš™e - - - ) - -1051  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1052 -__ - ## -funùiÚ - ## -f - ## -»’Œªt - ## -_fš™e - - - ) - -1054  - ~ - -1055 #undeà -_MdoubË_ - - -1056 #undeà -__MATH_DECLARING_DOUBLE - - -1057 #undeà -__MATH_DECLARING_FLOATN - - -1058 #undeà -__REDIRFROM_X - - -1059 #undeà -__REDIRTO_X - - -1062 #ià( -__HAVE_DISTINCT_FLOAT64 - || ( -__HAVE_FLOAT64 - && ! -defšed - -_LIBC -)) \ - -1063 && - $__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -1064  - #_MdoubË_ - -_Flßt64 - - - ) - -1065  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -1066  - #__MATH_DECLARING_FLOATN - 1 - - ) - -1067  - #__REDIRFROM_X -( -funùiÚ -, -»’Œªt -) \ - -1068 -funùiÚ - ## -f64 - ## -»’Œªt - - - ) - -1069 #ià -__HAVE_DISTINCT_FLOAT64 - - -1070  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1071 -__ - ## -funùiÚ - ## -f64 - ## -»’Œªt - ## -_fš™e - - - ) - -1073  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1074 -__ - ## -funùiÚ - ## -»’Œªt - ## -_fš™e - - - ) - -1076  - ~ - -1077 #undeà -_MdoubË_ - - -1078 #undeà -__MATH_DECLARING_DOUBLE - - -1079 #undeà -__MATH_DECLARING_FLOATN - - -1080 #undeà -__REDIRFROM_X - - -1081 #undeà -__REDIRTO_X - - -1084 #ià( -__HAVE_DISTINCT_FLOAT128 - || ( -__HAVE_FLOAT128 - && ! -defšed - -_LIBC -)) \ - -1085 && - $__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -1086  - #_MdoubË_ - -_Flßt128 - - - ) - -1087  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -1088  - #__MATH_DECLARING_FLOATN - 1 - - ) - -1089  - #__REDIRFROM_X -( -funùiÚ -, -»’Œªt -) \ - -1090 -funùiÚ - ## -f128 - ## -»’Œªt - - - ) - -1091 #ià -__HAVE_DISTINCT_FLOAT128 - - -1092  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1093 -__ - ## -funùiÚ - ## -f128 - ## -»’Œªt - ## -_fš™e - - - ) - -1095  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1096 -__ - ## -funùiÚ - ## -l - ## -»’Œªt - ## -_fš™e - - - ) - -1098  - ~ - -1099 #undeà -_MdoubË_ - - -1100 #undeà -__MATH_DECLARING_DOUBLE - - -1101 #undeà -__MATH_DECLARING_FLOATN - - -1102 #undeà -__REDIRFROM_X - - -1103 #undeà -__REDIRTO_X - - -1106 #ià( -__HAVE_DISTINCT_FLOAT32X - || ( -__HAVE_FLOAT32X - && ! -defšed - -_LIBC -)) \ - -1107 && - $__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -1108  - #_MdoubË_ - -_Flßt32x - - - ) - -1109  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -1110  - #__MATH_DECLARING_FLOATN - 1 - - ) - -1111  - #__REDIRFROM_X -( -funùiÚ -, -»’Œªt -) \ - -1112 -funùiÚ - ## -f32x - ## -»’Œªt - - - ) - -1113 #ià -__HAVE_DISTINCT_FLOAT32X - - -1114  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1115 -__ - ## -funùiÚ - ## -f32x - ## -»’Œªt - ## -_fš™e - - - ) - -1117  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1118 -__ - ## -funùiÚ - ## -»’Œªt - ## -_fš™e - - - ) - -1120  - ~ - -1121 #undeà -_MdoubË_ - - -1122 #undeà -__MATH_DECLARING_DOUBLE - - -1123 #undeà -__MATH_DECLARING_FLOATN - - -1124 #undeà -__REDIRFROM_X - - -1125 #undeà -__REDIRTO_X - - -1128 #ià( -__HAVE_DISTINCT_FLOAT64X - || ( -__HAVE_FLOAT64X - && ! -defšed - -_LIBC -)) \ - -1129 && - $__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -1130  - #_MdoubË_ - -_Flßt64x - - - ) - -1131  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -1132  - #__MATH_DECLARING_FLOATN - 1 - - ) - -1133  - #__REDIRFROM_X -( -funùiÚ -, -»’Œªt -) \ - -1134 -funùiÚ - ## -f64x - ## -»’Œªt - - - ) - -1135 #ià -__HAVE_DISTINCT_FLOAT64X - - -1136  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1137 -__ - ## -funùiÚ - ## -f64x - ## -»’Œªt - ## -_fš™e - - - ) - -1138 #–ià -__HAVE_FLOAT64X_LONG_DOUBLE - - -1139  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1140 -__ - ## -funùiÚ - ## -l - ## -»’Œªt - ## -_fš™e - - - ) - -1142  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1143 -__ - ## -funùiÚ - ## -f128 - ## -»’Œªt - ## -_fš™e - - - ) - -1145  - ~ - -1146 #undeà -_MdoubË_ - - -1147 #undeà -__MATH_DECLARING_DOUBLE - - -1148 #undeà -__MATH_DECLARING_FLOATN - - -1149 #undeà -__REDIRFROM_X - - -1150 #undeà -__REDIRTO_X - - -1153 #ià( -__HAVE_DISTINCT_FLOAT128X - || ( -__HAVE_FLOAT128X - && ! -defšed - -_LIBC -)) \ - -1154 && - $__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -1155  - #_MdoubË_ - -_Flßt128x - - - ) - -1156  - #__MATH_DECLARING_DOUBLE - 0 - - ) - -1157  - #__MATH_DECLARING_FLOATN - 1 - - ) - -1158  - #__REDIRFROM_X -( -funùiÚ -, -»’Œªt -) \ - -1159 -funùiÚ - ## -f128x - ## -»’Œªt - - - ) - -1160 #ià -__HAVE_DISTINCT_FLOAT128X - - -1161  - #__REDIRTO_X -( -funùiÚ -, -»’Œªt -) \ - -1162 -__ - ## -funùiÚ - ## -f128x - ## -»’Œªt - ## -_fš™e - - - ) - -1166  - ~ - -1167 #undeà -_MdoubË_ - - -1168 #undeà -__MATH_DECLARING_DOUBLE - - -1169 #undeà -__MATH_DECLARING_FLOATN - - -1170 #undeà -__REDIRFROM_X - - -1171 #undeà -__REDIRTO_X - - -1176 #ià - `__GLIBC_USE - ( -IEC_60559_BFP_EXT -) - -1179 #ià -__FLT_EVAL_METHOD__ - == 2 || __FLT_EVAL_METHOD__ > 64 - -1180  - #__MATH_EVAL_FMT2 -( -x -, -y -è((xè+ (yè+ 0.0L) - - ) - -1181 #–ià -__FLT_EVAL_METHOD__ - == 1 || __FLT_EVAL_METHOD__ > 32 - -1182  - #__MATH_EVAL_FMT2 -( -x -, -y -è((xè+ (yè+ 0.0) - - ) - -1183 #–ià -__FLT_EVAL_METHOD__ - == 0 || __FLT_EVAL_METHOD__ == 32 - -1184  - #__MATH_EVAL_FMT2 -( -x -, -y -è((xè+ (yè+ 0.0f) - - ) - -1186  - #__MATH_EVAL_FMT2 -( -x -, -y -è((xè+ (y)) - - ) - -1191 #ià! -defšed - -__ýlu¥lus - || (__ýlu¥lu < 201103L && !defšed -__GNUC__ -) - -1192  - #i£qsig -( -x -, -y -) \ - -1193 - `__MATH_TG - ( - `__MATH_EVAL_FMT2 - ( -x -, -y -), -__i£qsig -, ((x), (y))) - - ) - -1206 -‹m¶©e -< -ty³Çme ->  -__i£qsig_ty³ -; - -1208 -‹m¶©e -<>  -__i£qsig_ty³ -<> - -1210  - `__ÿÎ - ( -__x -,  -__y -è - `throw - () - -1212  - `__i£qsigf - ( -__x -, -__y -); - -1216 -‹m¶©e -<>  -__i£qsig_ty³ -<> - -1218  - `__ÿÎ - ( -__x -,  -__y -è - `throw - () - -1220  - `__i£qsig - ( -__x -, -__y -); - -1224 -‹m¶©e -<>  -__i£qsig_ty³ -<> - -1226  - `__ÿÎ - ( -__x -,  -__y -è - `throw - () - -1228 #iâdeà -__NO_LONG_DOUBLE_MATH - - -1229  - `__i£qsigl - ( -__x -, -__y -); - -1231  - `__i£qsig - ( -__x -, -__y -); - -1236 #ià -__HAVE_DISTINCT_FLOAT128 - - -1237 -‹m¶©e -<>  -__i£qsig_ty³ -< -_Flßt128 -> - -1239  - `__ÿÎ - ( -_Flßt128 - -__x -, _Flßt128 -__y -è - `throw - () - -1241  - `__i£qsigf128 - ( -__x -, -__y -); - -1246 -‹m¶©e -< -ty³Çme - -_T1 -,y³Çm -_T2 -> - -1247 -šlše -  - -1248 - `i£qsig - ( -_T1 - -__x -, -_T2 - -__y -è - `throw - () - -1250 #ià -__ýlu¥lus - >= 201103L - -1251  - `deþty³ - ( - t__MATH_EVAL_FMT2 - ( - t__x -, - t__y -)è - t_T3 -; - -1253  - `__ty³of - ( - t__MATH_EVAL_FMT2 - ( - t__x -, - t__y -)è - t_T3 -; - -1255  -__i£qsig_ty³ -< -_T3 ->:: - `__ÿÎ - ( -__x -, -__y -); - -1258 - } -} - -1263 -__END_DECLS - - - @/usr/include/stdio.h - -23 #iâdeà -_STDIO_H - - -24  - #_STDIO_H - 1 - - ) - -26  - #__GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION - - - ) - -27  - ~ - -29 - g__BEGIN_DECLS - - -31  - #__Ãed_size_t - - - ) - -32  - #__Ãed_NULL - - - ) - -33  - ~<¡ddef.h -> - -35  - ~ - -36  - ~ - -37  - ~ - -39  - #_STDIO_USES_IOSTREAM - - - ) - -41  - ~ - -43 #ià -defšed - -__USE_XOPEN - || defšed -__USE_XOPEN2K8 - - -44 #ifdeà -__GNUC__ - - -45 #iâdeà -_VA_LIST_DEFINED - - -46  -_G_va_li¡ - - tva_li¡ -; - -47  - #_VA_LIST_DEFINED - - - ) - -50  - ~<¡d¬g.h -> - -54 #ià -defšed - -__USE_UNIX98 - || defšed -__USE_XOPEN2K - - -55 #iâdeà -__off_t_defšed - - -56 #iâdeà -__USE_FILE_OFFSET64 - - -57  -__off_t - - toff_t -; - -59  -__off64_t - - toff_t -; - -61  - #__off_t_defšed - - - ) - -63 #ià -defšed - -__USE_LARGEFILE64 - && !defšed -__off64_t_defšed - - -64  -__off64_t - - toff64_t -; - -65  - #__off64_t_defšed - - - ) - -69 #ifdeà -__USE_XOPEN2K8 - - -70 #iâdeà -__ssize_t_defšed - - -71  -__ssize_t - - tssize_t -; - -72  - #__ssize_t_defšed - - - ) - -77 #iâdeà -__USE_FILE_OFFSET64 - - -78  -_G_åos_t - - tåos_t -; - -80  -_G_åos64_t - - tåos_t -; - -82 #ifdeà -__USE_LARGEFILE64 - - -83  -_G_åos64_t - - tåos64_t -; - -87  - #_IOFBF - 0 - - ) - -88  - #_IOLBF - 1 - - ) - -89  - #_IONBF - 2 - - ) - -93 #iâdeà -BUFSIZ - - -94  - #BUFSIZ - -_IO_BUFSIZ - - - ) - -100 #iâdeà -EOF - - -101  - #EOF - (-1) - - ) - -107  - #SEEK_SET - 0 - - ) - -108  - #SEEK_CUR - 1 - - ) - -109  - #SEEK_END - 2 - - ) - -110 #ifdeà -__USE_GNU - - -111  - #SEEK_DATA - 3 - - ) - -112  - #SEEK_HOLE - 4 - - ) - -116 #ià -defšed - -__USE_MISC - || defšed -__USE_XOPEN - - -118  - #P_tmpdœ - "/tmp" - - ) - -131  - ~ - -135  -_IO_FILE - * -¡dš -; - -136  -_IO_FILE - * -¡dout -; - -137  -_IO_FILE - * -¡d”r -; - -139  - #¡dš - -¡dš - - - ) - -140  - #¡dout - -¡dout - - - ) - -141  - #¡d”r - -¡d”r - - - ) - -144  - $»move - (cÚ¡ * -__fž’ame -è -__THROW -; - -146  - $»Çme - (cÚ¡ * -__Þd -, cÚ¡ * -__Ãw -è -__THROW -; - -148 #ifdeà -__USE_ATFILE - - -150  - $»Çm—t - ( -__Þdfd -, cÚ¡ * -__Þd -,  -__Ãwfd -, - -151 cÚ¡ * -__Ãw -è -__THROW -; - -158 #iâdeà -__USE_FILE_OFFSET64 - - -159 -FILE - * - $tmpfže - (è -__wur -; - -161 #ifdeà -__REDIRECT - - -162 -FILE - * - `__REDIRECT - ( -tmpfže -, (), -tmpfže64 -è -__wur -; - -164  - #tmpfže - -tmpfže64 - - - ) - -168 #ifdeà -__USE_LARGEFILE64 - - -169 -FILE - * - $tmpfže64 - (è -__wur -; - -173 * - $tm²am - (* -__s -è -__THROW - -__wur -; - -175 #ifdeà -__USE_MISC - - -178 * - $tm²am_r - (* -__s -è -__THROW - -__wur -; - -182 #ià -defšed - -__USE_MISC - || defšed -__USE_XOPEN - - -190 * - $‹m²am - (cÚ¡ * -__dœ -, cÚ¡ * -__pfx -) - -191 -__THROW - -__©Œibu‹_m®loc__ - -__wur -; - -199  - `fþo£ - ( -FILE - * -__¡»am -); - -204  - `fæush - ( -FILE - * -__¡»am -); - -206 #ifdeà -__USE_MISC - - -213  - `fæush_uÆocked - ( -FILE - * -__¡»am -); - -216 #ifdeà -__USE_GNU - - -223  - `fþo£®l - (); - -227 #iâdeà -__USE_FILE_OFFSET64 - - -232 -FILE - * - $fݒ - (cÚ¡ * -__»¡riù - -__fž’ame -, - -233 cÚ¡ * -__»¡riù - -__modes -è -__wur -; - -238 -FILE - * - $äeݒ - (cÚ¡ * -__»¡riù - -__fž’ame -, - -239 cÚ¡ * -__»¡riù - -__modes -, - -240 -FILE - * -__»¡riù - -__¡»am -è -__wur -; - -242 #ifdeà -__REDIRECT - - -243 -FILE - * - `__REDIRECT - ( -fݒ -, (cÚ¡ * -__»¡riù - -__fž’ame -, - -244 cÚ¡ * -__»¡riù - -__modes -), -fݒ64 -) - -245 -__wur -; - -246 -FILE - * - `__REDIRECT - ( -äeݒ -, (cÚ¡ * -__»¡riù - -__fž’ame -, - -247 cÚ¡ * -__»¡riù - -__modes -, - -248 -FILE - * -__»¡riù - -__¡»am -), -äeݒ64 -) - -249 -__wur -; - -251  - #fݒ - -fݒ64 - - - ) - -252  - #äeݒ - -äeݒ64 - - - ) - -255 #ifdeà -__USE_LARGEFILE64 - - -256 -FILE - * - $fݒ64 - (cÚ¡ * -__»¡riù - -__fž’ame -, - -257 cÚ¡ * -__»¡riù - -__modes -è -__wur -; - -258 -FILE - * - $äeݒ64 - (cÚ¡ * -__»¡riù - -__fž’ame -, - -259 cÚ¡ * -__»¡riù - -__modes -, - -260 -FILE - * -__»¡riù - -__¡»am -è -__wur -; - -263 #ifdef -__USE_POSIX - - -265 -FILE - * - $fdݒ - ( -__fd -, cÚ¡ * -__modes -è -__THROW - -__wur -; - -268 #ifdef -__USE_GNU - - -271 -FILE - * - $fݒcook› - (* -__»¡riù - -__magic_cook› -, - -272 cÚ¡ * -__»¡riù - -__modes -, - -273 -_IO_cook›_io_funùiÚs_t - -__io_funcs -è -__THROW - -__wur -; - -276 #ià -defšed - -__USE_XOPEN2K8 - || - `__GLIBC_USE - ( -LIB_EXT2 -) - -278 -FILE - * - $fmemݒ - (* -__s -, -size_t - -__Ën -, cÚ¡ * -__modes -) - -279 -__THROW - -__wur -; - -284 -FILE - * - $ݒ_mem¡»am - (** -__buæoc -, -size_t - * -__siz–oc -è -__THROW - -__wur -; - -290  - $£tbuf - ( -FILE - * -__»¡riù - -__¡»am -, *__»¡riù -__buf -è -__THROW -; - -294  - $£tvbuf - ( -FILE - * -__»¡riù - -__¡»am -, *__»¡riù -__buf -, - -295  -__modes -, -size_t - -__n -è -__THROW -; - -297 #ifdef -__USE_MISC - - -300  - $£tbufãr - ( -FILE - * -__»¡riù - -__¡»am -, *__»¡riù -__buf -, - -301 -size_t - -__size -è -__THROW -; - -304  - $£Žšebuf - ( -FILE - * -__¡»am -è -__THROW -; - -312  - `årštf - ( -FILE - * -__»¡riù - -__¡»am -, - -313 cÚ¡ * -__»¡riù - -__fÜm© -, ...); - -318  - `´štf - (cÚ¡ * -__»¡riù - -__fÜm© -, ...); - -320  - $¥rštf - (* -__»¡riù - -__s -, - -321 cÚ¡ * -__»¡riù - -__fÜm© -, ...è -__THROWNL -; - -327  - `vårštf - ( -FILE - * -__»¡riù - -__s -, cÚ¡ *__»¡riù -__fÜm© -, - -328 -_G_va_li¡ - -__¬g -); - -333  - `v´štf - (cÚ¡ * -__»¡riù - -__fÜm© -, -_G_va_li¡ - -__¬g -); - -335  - $v¥rštf - (* -__»¡riù - -__s -, cÚ¡ *__»¡riù -__fÜm© -, - -336 -_G_va_li¡ - -__¬g -è -__THROWNL -; - -338 #ià -defšed - -__USE_ISOC99 - || defšed -__USE_UNIX98 - - -340  - $¢´štf - (* -__»¡riù - -__s -, -size_t - -__maxËn -, - -341 cÚ¡ * -__»¡riù - -__fÜm© -, ...) - -342 -__THROWNL - - `__©Œibu‹__ - (( - `__fÜm©__ - ( -__´štf__ -, 3, 4))); - -344  - $v¢´štf - (* -__»¡riù - -__s -, -size_t - -__maxËn -, - -345 cÚ¡ * -__»¡riù - -__fÜm© -, -_G_va_li¡ - -__¬g -) - -346 -__THROWNL - - `__©Œibu‹__ - (( - `__fÜm©__ - ( -__´štf__ -, 3, 0))); - -349 #ià - `__GLIBC_USE - ( -LIB_EXT2 -) - -352  - $va¥rštf - (** -__»¡riù - -__±r -, cÚ¡ *__»¡riù -__f -, - -353 -_G_va_li¡ - -__¬g -) - -354 -__THROWNL - - `__©Œibu‹__ - (( - $__fÜm©__ - ( -__´štf__ -, 2, 0))è -__wur -; - -355  - $__a¥rštf - (** -__»¡riù - -__±r -, - -356 cÚ¡ * -__»¡riù - -__fmt -, ...) - -357 -__THROWNL - - `__©Œibu‹__ - (( - $__fÜm©__ - ( -__´štf__ -, 2, 3))è -__wur -; - -358  - $a¥rštf - (** -__»¡riù - -__±r -, - -359 cÚ¡ * -__»¡riù - -__fmt -, ...) - -360 -__THROWNL - - `__©Œibu‹__ - (( - $__fÜm©__ - ( -__´štf__ -, 2, 3))è -__wur -; - -363 #ifdeà -__USE_XOPEN2K8 - - -365  - $vd´štf - ( -__fd -, cÚ¡ * -__»¡riù - -__fmt -, - -366 -_G_va_li¡ - -__¬g -) - -367 - `__©Œibu‹__ - (( - `__fÜm©__ - ( -__´štf__ -, 2, 0))); - -368  - $d´štf - ( -__fd -, cÚ¡ * -__»¡riù - -__fmt -, ...) - -369 - `__©Œibu‹__ - (( - `__fÜm©__ - ( -__´štf__ -, 2, 3))); - -377  - $fsÿnf - ( -FILE - * -__»¡riù - -__¡»am -, - -378 cÚ¡ * -__»¡riù - -__fÜm© -, ...è -__wur -; - -383  - $sÿnf - (cÚ¡ * -__»¡riù - -__fÜm© -, ...è -__wur -; - -385  - $ssÿnf - (cÚ¡ * -__»¡riù - -__s -, - -386 cÚ¡ * -__»¡riù - -__fÜm© -, ...è -__THROW -; - -388 #ià -defšed - -__USE_ISOC99 - && !defšed -__USE_GNU - \ - -389 && (! -defšed - -__LDBL_COMPAT - || !defšed -__REDIRECT -) \ - -390 && ( -defšed - -__STRICT_ANSI__ - || defšed -__USE_XOPEN2K -) - -391 #ifdeà -__REDIRECT - - -395  - `__REDIRECT - ( -fsÿnf -, ( -FILE - * -__»¡riù - -__¡»am -, - -396 cÚ¡ * -__»¡riù - -__fÜm© -, ...), - -397 -__isoc99_fsÿnf -è -__wur -; - -398  - `__REDIRECT - ( -sÿnf -, (cÚ¡ * -__»¡riù - -__fÜm© -, ...), - -399 -__isoc99_sÿnf -è -__wur -; - -400  - `__REDIRECT_NTH - ( -ssÿnf -, (cÚ¡ * -__»¡riù - -__s -, - -401 cÚ¡ * -__»¡riù - -__fÜm© -, ...), - -402 -__isoc99_ssÿnf -); - -404  - $__isoc99_fsÿnf - ( -FILE - * -__»¡riù - -__¡»am -, - -405 cÚ¡ * -__»¡riù - -__fÜm© -, ...è -__wur -; - -406  - $__isoc99_sÿnf - (cÚ¡ * -__»¡riù - -__fÜm© -, ...è -__wur -; - -407  - $__isoc99_ssÿnf - (cÚ¡ * -__»¡riù - -__s -, - -408 cÚ¡ * -__»¡riù - -__fÜm© -, ...è -__THROW -; - -409  - #fsÿnf - -__isoc99_fsÿnf - - - ) - -410  - #sÿnf - -__isoc99_sÿnf - - - ) - -411  - #ssÿnf - -__isoc99_ssÿnf - - - ) - -415 #ifdef -__USE_ISOC99 - - -420  - $vfsÿnf - ( -FILE - * -__»¡riù - -__s -, cÚ¡ *__»¡riù -__fÜm© -, - -421 -_G_va_li¡ - -__¬g -) - -422 - `__©Œibu‹__ - (( - $__fÜm©__ - ( -__sÿnf__ -, 2, 0))è -__wur -; - -428  - $vsÿnf - (cÚ¡ * -__»¡riù - -__fÜm© -, -_G_va_li¡ - -__¬g -) - -429 - `__©Œibu‹__ - (( - $__fÜm©__ - ( -__sÿnf__ -, 1, 0))è -__wur -; - -432  - $vssÿnf - (cÚ¡ * -__»¡riù - -__s -, - -433 cÚ¡ * -__»¡riù - -__fÜm© -, -_G_va_li¡ - -__¬g -) - -434 -__THROW - - `__©Œibu‹__ - (( - `__fÜm©__ - ( -__sÿnf__ -, 2, 0))); - -436 #ià! -defšed - -__USE_GNU - \ - -437 && (! -defšed - -__LDBL_COMPAT - || !defšed -__REDIRECT -) \ - -438 && ( -defšed - -__STRICT_ANSI__ - || defšed -__USE_XOPEN2K -) - -439 #ifdeà -__REDIRECT - - -443  - `__REDIRECT - ( -vfsÿnf -, - -444 ( -FILE - * -__»¡riù - -__s -, - -445 cÚ¡ * -__»¡riù - -__fÜm© -, -_G_va_li¡ - -__¬g -), - -446 -__isoc99_vfsÿnf -) - -447 - `__©Œibu‹__ - (( - $__fÜm©__ - ( -__sÿnf__ -, 2, 0))è -__wur -; - -448  - `__REDIRECT - ( -vsÿnf -, (cÚ¡ * -__»¡riù - -__fÜm© -, - -449 -_G_va_li¡ - -__¬g -), -__isoc99_vsÿnf -) - -450 - `__©Œibu‹__ - (( - $__fÜm©__ - ( -__sÿnf__ -, 1, 0))è -__wur -; - -451  - `__REDIRECT_NTH - ( -vssÿnf -, - -452 (cÚ¡ * -__»¡riù - -__s -, - -453 cÚ¡ * -__»¡riù - -__fÜm© -, - -454 -_G_va_li¡ - -__¬g -), -__isoc99_vssÿnf -) - -455 - `__©Œibu‹__ - (( - `__fÜm©__ - ( -__sÿnf__ -, 2, 0))); - -457  - $__isoc99_vfsÿnf - ( -FILE - * -__»¡riù - -__s -, - -458 cÚ¡ * -__»¡riù - -__fÜm© -, - -459 -_G_va_li¡ - -__¬g -è -__wur -; - -460  - $__isoc99_vsÿnf - (cÚ¡ * -__»¡riù - -__fÜm© -, - -461 -_G_va_li¡ - -__¬g -è -__wur -; - -462  - $__isoc99_vssÿnf - (cÚ¡ * -__»¡riù - -__s -, - -463 cÚ¡ * -__»¡riù - -__fÜm© -, - -464 -_G_va_li¡ - -__¬g -è -__THROW -; - -465  - #vfsÿnf - -__isoc99_vfsÿnf - - - ) - -466  - #vsÿnf - -__isoc99_vsÿnf - - - ) - -467  - #vssÿnf - -__isoc99_vssÿnf - - - ) - -477  - `fg‘c - ( -FILE - * -__¡»am -); - -478  - `g‘c - ( -FILE - * -__¡»am -); - -484  - `g‘ch¬ - (); - -488  - #g‘c -( -_å -è - `_IO_g‘c - (_å) - - ) - -490 #ifdeà -__USE_POSIX199506 - - -495  - `g‘c_uÆocked - ( -FILE - * -__¡»am -); - -496  - `g‘ch¬_uÆocked - (); - -499 #ifdeà -__USE_MISC - - -506  - `fg‘c_uÆocked - ( -FILE - * -__¡»am -); - -517  - `åutc - ( -__c -, -FILE - * -__¡»am -); - -518  - `putc - ( -__c -, -FILE - * -__¡»am -); - -524  - `putch¬ - ( -__c -); - -528  - #putc -( -_ch -, -_å -è - `_IO_putc - (_ch, _å) - - ) - -530 #ifdeà -__USE_MISC - - -537  - `åutc_uÆocked - ( -__c -, -FILE - * -__¡»am -); - -540 #ifdeà -__USE_POSIX199506 - - -545  - `putc_uÆocked - ( -__c -, -FILE - * -__¡»am -); - -546  - `putch¬_uÆocked - ( -__c -); - -550 #ià -defšed - -__USE_MISC - \ - -551 || ( -defšed - -__USE_XOPEN - && !defšed -__USE_XOPEN2K -) - -553  - `g‘w - ( -FILE - * -__¡»am -); - -556  - `putw - ( -__w -, -FILE - * -__¡»am -); - -564 * - $fg‘s - (* -__»¡riù - -__s -,  -__n -, -FILE - *__»¡riù -__¡»am -) - -565 -__wur -; - -567 #ià - `__GLIBC_USE - ( -DEPRECATED_GETS -) - -577 * - $g‘s - (* -__s -è -__wur - -__©Œibu‹_d•»ÿ‹d__ -; - -580 #ifdeà -__USE_GNU - - -587 * - $fg‘s_uÆocked - (* -__»¡riù - -__s -,  -__n -, - -588 -FILE - * -__»¡riù - -__¡»am -è -__wur -; - -592 #ià -defšed - -__USE_XOPEN2K8 - || - `__GLIBC_USE - ( -LIB_EXT2 -) - -603 -_IO_ssize_t - - $__g‘d–im - (** -__»¡riù - -__lš•Œ -, - -604 -size_t - * -__»¡riù - -__n -,  -__d–im™” -, - -605 -FILE - * -__»¡riù - -__¡»am -è -__wur -; - -606 -_IO_ssize_t - - $g‘d–im - (** -__»¡riù - -__lš•Œ -, - -607 -size_t - * -__»¡riù - -__n -,  -__d–im™” -, - -608 -FILE - * -__»¡riù - -__¡»am -è -__wur -; - -616 -_IO_ssize_t - - $g‘lše - (** -__»¡riù - -__lš•Œ -, - -617 -size_t - * -__»¡riù - -__n -, - -618 -FILE - * -__»¡riù - -__¡»am -è -__wur -; - -626  - `åuts - (cÚ¡ * -__»¡riù - -__s -, -FILE - *__»¡riù -__¡»am -); - -632  - `puts - (cÚ¡ * -__s -); - -639  - `ung‘c - ( -__c -, -FILE - * -__¡»am -); - -646 -size_t - - $ä—d - (* -__»¡riù - -__±r -, -size_t - -__size -, - -647 -size_t - -__n -, -FILE - * -__»¡riù - -__¡»am -è -__wur -; - -652 -size_t - - `fwr™e - (cÚ¡ * -__»¡riù - -__±r -, size_ˆ -__size -, - -653 -size_t - -__n -, -FILE - * -__»¡riù - -__s -); - -655 #ifdeà -__USE_GNU - - -662  - `åuts_uÆocked - (cÚ¡ * -__»¡riù - -__s -, - -663 -FILE - * -__»¡riù - -__¡»am -); - -666 #ifdeà -__USE_MISC - - -673 -size_t - - $ä—d_uÆocked - (* -__»¡riù - -__±r -, -size_t - -__size -, - -674 -size_t - -__n -, -FILE - * -__»¡riù - -__¡»am -è -__wur -; - -675 -size_t - - `fwr™e_uÆocked - (cÚ¡ * -__»¡riù - -__±r -, size_ˆ -__size -, - -676 -size_t - -__n -, -FILE - * -__»¡riù - -__¡»am -); - -684  - `f£ek - ( -FILE - * -__¡»am -,  -__off -,  -__wh’û -); - -689  - $á–l - ( -FILE - * -__¡»am -è -__wur -; - -694  - `»wšd - ( -FILE - * -__¡»am -); - -701 #ià -defšed - -__USE_LARGEFILE - || defšed -__USE_XOPEN2K - - -702 #iâdeà -__USE_FILE_OFFSET64 - - -707  - `f£eko - ( -FILE - * -__¡»am -, -__off_t - -__off -,  -__wh’û -); - -712 -__off_t - - $á–lo - ( -FILE - * -__¡»am -è -__wur -; - -714 #ifdeà -__REDIRECT - - -715  - `__REDIRECT - ( -f£eko -, - -716 ( -FILE - * -__¡»am -, -__off64_t - -__off -,  -__wh’û -), - -717 -f£eko64 -); - -718 -__off64_t - - `__REDIRECT - ( -á–lo -, ( -FILE - * -__¡»am -), -á–lo64 -); - -720  - #f£eko - -f£eko64 - - - ) - -721  - #á–lo - -á–lo64 - - - ) - -726 #iâdeà -__USE_FILE_OFFSET64 - - -731  - `fg‘pos - ( -FILE - * -__»¡riù - -__¡»am -, -åos_t - *__»¡riù -__pos -); - -736  - `f£os - ( -FILE - * -__¡»am -, cÚ¡ -åos_t - * -__pos -); - -738 #ifdeà -__REDIRECT - - -739  - `__REDIRECT - ( -fg‘pos -, ( -FILE - * -__»¡riù - -__¡»am -, - -740 -åos_t - * -__»¡riù - -__pos -), -fg‘pos64 -); - -741  - `__REDIRECT - ( -f£os -, - -742 ( -FILE - * -__¡»am -, cÚ¡ -åos_t - * -__pos -), -f£os64 -); - -744  - #fg‘pos - -fg‘pos64 - - - ) - -745  - #f£os - -f£os64 - - - ) - -749 #ifdeà -__USE_LARGEFILE64 - - -750  - `f£eko64 - ( -FILE - * -__¡»am -, -__off64_t - -__off -,  -__wh’û -); - -751 -__off64_t - - $á–lo64 - ( -FILE - * -__¡»am -è -__wur -; - -752  - `fg‘pos64 - ( -FILE - * -__»¡riù - -__¡»am -, -åos64_t - *__»¡riù -__pos -); - -753  - `f£os64 - ( -FILE - * -__¡»am -, cÚ¡ -åos64_t - * -__pos -); - -757  - $þ—»¼ - ( -FILE - * -__¡»am -è -__THROW -; - -759  - $ãof - ( -FILE - * -__¡»am -è -__THROW - -__wur -; - -761  - $ã¼Ü - ( -FILE - * -__¡»am -è -__THROW - -__wur -; - -763 #ifdeà -__USE_MISC - - -765  - $þ—»¼_uÆocked - ( -FILE - * -__¡»am -è -__THROW -; - -766  - $ãof_uÆocked - ( -FILE - * -__¡»am -è -__THROW - -__wur -; - -767  - $ã¼Ü_uÆocked - ( -FILE - * -__¡»am -è -__THROW - -__wur -; - -775  - `³¼Ü - (cÚ¡ * -__s -); - -781  - ~ - -784 #ifdef -__USE_POSIX - - -786  - $fž’o - ( -FILE - * -__¡»am -è -__THROW - -__wur -; - -789 #ifdeà -__USE_MISC - - -791  - $fž’o_uÆocked - ( -FILE - * -__¡»am -è -__THROW - -__wur -; - -795 #ifdeà -__USE_POSIX2 - - -800 -FILE - * - $pݒ - (cÚ¡ * -__commªd -, cÚ¡ * -__modes -è -__wur -; - -806  - `pþo£ - ( -FILE - * -__¡»am -); - -810 #ifdef -__USE_POSIX - - -812 * - $ù”mid - (* -__s -è -__THROW -; - -816 #ià( -defšed - -__USE_XOPEN - && !defšed -__USE_XOPEN2K -è|| defšed -__USE_GNU - - -818 * - `cu£rid - (* -__s -); - -822 #ifdef -__USE_GNU - - -823  -ob¡ack -; - -826  - $ob¡ack_´štf - ( -ob¡ack - * -__»¡riù - -__ob¡ack -, - -827 cÚ¡ * -__»¡riù - -__fÜm© -, ...) - -828 -__THROWNL - - `__©Œibu‹__ - (( - `__fÜm©__ - ( -__´štf__ -, 2, 3))); - -829  - $ob¡ack_v´štf - ( -ob¡ack - * -__»¡riù - -__ob¡ack -, - -830 cÚ¡ * -__»¡riù - -__fÜm© -, - -831 -_G_va_li¡ - -__¬gs -) - -832 -__THROWNL - - `__©Œibu‹__ - (( - `__fÜm©__ - ( -__´štf__ -, 2, 0))); - -836 #ifdeà -__USE_POSIX199506 - - -840  - $æockfže - ( -FILE - * -__¡»am -è -__THROW -; - -844  - $árylockfže - ( -FILE - * -__¡»am -è -__THROW - -__wur -; - -847  - $fuÆockfže - ( -FILE - * -__¡»am -è -__THROW -; - -850 #ià -defšed - -__USE_XOPEN - && !defšed -__USE_XOPEN2K - && !defšed -__USE_GNU - - -853  - ~ - -858 #ifdeà -__USE_EXTERN_INLINES - - -859  - ~ - -861 #ià -__USE_FORTIFY_LEVEL - > 0 && -defšed - -__fÜtify_funùiÚ - - -862  - ~ - -864 #ifdeà -__LDBL_COMPAT - - -865  - ~ - -868 -__END_DECLS - - - @/usr/include/stdlib.h - -22 #iâdef -_STDLIB_H - - -24  - #__GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION - - - ) - -25  - ~ - -28  - #__Ãed_size_t - - - ) - -29  - #__Ãed_wch¬_t - - - ) - -30  - #__Ãed_NULL - - - ) - -31  - ~<¡ddef.h -> - -33 - g__BEGIN_DECLS - - -35  - #_STDLIB_H - 1 - - ) - -37 #ià( -defšed - -__USE_XOPEN - || defšed -__USE_XOPEN2K8 -è&& !defšed -_SYS_WAIT_H - - -39  - ~ - -40  - ~ - -43  - #WEXITSTATUS -( -¡©us -è - `__WEXITSTATUS - (¡©us) - - ) - -44  - #WTERMSIG -( -¡©us -è - `__WTERMSIG - (¡©us) - - ) - -45  - #WSTOPSIG -( -¡©us -è - `__WSTOPSIG - (¡©us) - - ) - -46  - #WIFEXITED -( -¡©us -è - `__WIFEXITED - (¡©us) - - ) - -47  - #WIFSIGNALED -( -¡©us -è - `__WIFSIGNALED - (¡©us) - - ) - -48  - #WIFSTOPPED -( -¡©us -è - `__WIFSTOPPED - (¡©us) - - ) - -49 #ifdeà -__WIFCONTINUED - - -50  - #WIFCONTINUED -( -¡©us -è - `__WIFCONTINUED - (¡©us) - - ) - -55  - ~ - -60  - mquÙ -; - -61  - m»m -; - -62 } - tdiv_t -; - -65 #iâdeà -__ldiv_t_defšed - - -68  - mquÙ -; - -69  - m»m -; - -70 } - tldiv_t -; - -71  - #__ldiv_t_defšed - 1 - - ) - -74 #ià -defšed - -__USE_ISOC99 - && !defšed -__Îdiv_t_defšed - - -76 -__ex‹nsiÚ__ - struct - -78  - mquÙ -; - -79  - m»m -; - -80 } - tÎdiv_t -; - -81  - #__Îdiv_t_defšed - 1 - - ) - -86  - #RAND_MAX - 2147483647 - - ) - -91  - #EXIT_FAILURE - 1 - - ) - -92  - #EXIT_SUCCESS - 0 - - ) - -96  - #MB_CUR_MAX - ( - `__ùy³_g‘_mb_cur_max - ()) - - ) - -97 -size_t - - $__ùy³_g‘_mb_cur_max - (è -__THROW - -__wur -; - -101  - $©of - (cÚ¡ * -__Ō -) - -102 -__THROW - -__©Œibu‹_pu»__ - - `__nÚnuÎ - ((1)è -__wur -; - -104  - $©oi - (cÚ¡ * -__Ō -) - -105 -__THROW - -__©Œibu‹_pu»__ - - `__nÚnuÎ - ((1)è -__wur -; - -107  - $©Þ - (cÚ¡ * -__Ō -) - -108 -__THROW - -__©Œibu‹_pu»__ - - `__nÚnuÎ - ((1)è -__wur -; - -110 #ifdeà -__USE_ISOC99 - - -112 -__ex‹nsiÚ__ -  - $©Þl - (cÚ¡ * -__Ō -) - -113 -__THROW - -__©Œibu‹_pu»__ - - `__nÚnuÎ - ((1)è -__wur -; - -117  - $¡¹od - (cÚ¡ * -__»¡riù - -__Ō -, - -118 ** -__»¡riù - -__’d±r -) - -119 -__THROW - - `__nÚnuÎ - ((1)); - -121 #ifdef -__USE_ISOC99 - - -123  - $¡¹of - (cÚ¡ * -__»¡riù - -__Ō -, - -124 ** -__»¡riù - -__’d±r -è -__THROW - - `__nÚnuÎ - ((1)); - -126  - $¡¹Þd - (cÚ¡ * -__»¡riù - -__Ō -, - -127 ** -__»¡riù - -__’d±r -) - -128 -__THROW - - `__nÚnuÎ - ((1)); - -133 #ià -__HAVE_FLOAT16 - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -134 -_Flßt16 - - $¡¹of16 - (cÚ¡ * -__»¡riù - -__Ō -, - -135 ** -__»¡riù - -__’d±r -) - -136 -__THROW - - `__nÚnuÎ - ((1)); - -139 #ià -__HAVE_FLOAT32 - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -140 -_Flßt32 - - $¡¹of32 - (cÚ¡ * -__»¡riù - -__Ō -, - -141 ** -__»¡riù - -__’d±r -) - -142 -__THROW - - `__nÚnuÎ - ((1)); - -145 #ià -__HAVE_FLOAT64 - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -146 -_Flßt64 - - $¡¹of64 - (cÚ¡ * -__»¡riù - -__Ō -, - -147 ** -__»¡riù - -__’d±r -) - -148 -__THROW - - `__nÚnuÎ - ((1)); - -151 #ià -__HAVE_FLOAT128 - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -152 -_Flßt128 - - $¡¹of128 - (cÚ¡ * -__»¡riù - -__Ō -, - -153 ** -__»¡riù - -__’d±r -) - -154 -__THROW - - `__nÚnuÎ - ((1)); - -157 #ià -__HAVE_FLOAT32X - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -158 -_Flßt32x - - $¡¹of32x - (cÚ¡ * -__»¡riù - -__Ō -, - -159 ** -__»¡riù - -__’d±r -) - -160 -__THROW - - `__nÚnuÎ - ((1)); - -163 #ià -__HAVE_FLOAT64X - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -164 -_Flßt64x - - $¡¹of64x - (cÚ¡ * -__»¡riù - -__Ō -, - -165 ** -__»¡riù - -__’d±r -) - -166 -__THROW - - `__nÚnuÎ - ((1)); - -169 #ià -__HAVE_FLOAT128X - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -170 -_Flßt128x - - $¡¹of128x - (cÚ¡ * -__»¡riù - -__Ō -, - -171 ** -__»¡riù - -__’d±r -) - -172 -__THROW - - `__nÚnuÎ - ((1)); - -176  - $¡¹Þ - (cÚ¡ * -__»¡riù - -__Ō -, - -177 ** -__»¡riù - -__’d±r -,  -__ba£ -) - -178 -__THROW - - `__nÚnuÎ - ((1)); - -180  - $¡¹oul - (cÚ¡ * -__»¡riù - -__Ō -, - -181 ** -__»¡riù - -__’d±r -,  -__ba£ -) - -182 -__THROW - - `__nÚnuÎ - ((1)); - -184 #ifdeà -__USE_MISC - - -186 -__ex‹nsiÚ__ - - -187  - $¡¹oq - (cÚ¡ * -__»¡riù - -__Ō -, - -188 ** -__»¡riù - -__’d±r -,  -__ba£ -) - -189 -__THROW - - `__nÚnuÎ - ((1)); - -191 -__ex‹nsiÚ__ - - -192  - $¡¹ouq - (cÚ¡ * -__»¡riù - -__Ō -, - -193 ** -__»¡riù - -__’d±r -,  -__ba£ -) - -194 -__THROW - - `__nÚnuÎ - ((1)); - -197 #ifdeà -__USE_ISOC99 - - -199 -__ex‹nsiÚ__ - - -200  - $¡¹Þl - (cÚ¡ * -__»¡riù - -__Ō -, - -201 ** -__»¡riù - -__’d±r -,  -__ba£ -) - -202 -__THROW - - `__nÚnuÎ - ((1)); - -204 -__ex‹nsiÚ__ - - -205  - $¡¹ouÎ - (cÚ¡ * -__»¡riù - -__Ō -, - -206 ** -__»¡riù - -__’d±r -,  -__ba£ -) - -207 -__THROW - - `__nÚnuÎ - ((1)); - -211 #ià - `__GLIBC_USE - ( -IEC_60559_BFP_EXT -) - -212  - $¡räomd - (* -__de¡ -, -size_t - -__size -, cÚ¡ * -__fÜm© -, - -213  -__f -) - -214 -__THROW - - `__nÚnuÎ - ((3)); - -216  - $¡räomf - (* -__de¡ -, -size_t - -__size -, cÚ¡ * -__fÜm© -, - -217  -__f -) - -218 -__THROW - - `__nÚnuÎ - ((3)); - -220  - $¡räoml - (* -__de¡ -, -size_t - -__size -, cÚ¡ * -__fÜm© -, - -221  -__f -) - -222 -__THROW - - `__nÚnuÎ - ((3)); - -225 #ià -__HAVE_FLOAT16 - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -226  - $¡räomf16 - (* -__de¡ -, -size_t - -__size -, cÚ¡ * -__fÜm© -, - -227 -_Flßt16 - -__f -) - -228 -__THROW - - `__nÚnuÎ - ((3)); - -231 #ià -__HAVE_FLOAT32 - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -232  - $¡räomf32 - (* -__de¡ -, -size_t - -__size -, cÚ¡ * -__fÜm© -, - -233 -_Flßt32 - -__f -) - -234 -__THROW - - `__nÚnuÎ - ((3)); - -237 #ià -__HAVE_FLOAT64 - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -238  - $¡räomf64 - (* -__de¡ -, -size_t - -__size -, cÚ¡ * -__fÜm© -, - -239 -_Flßt64 - -__f -) - -240 -__THROW - - `__nÚnuÎ - ((3)); - -243 #ià -__HAVE_FLOAT128 - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -244  - $¡räomf128 - (* -__de¡ -, -size_t - -__size -, cÚ¡ * -__fÜm© -, - -245 -_Flßt128 - -__f -) - -246 -__THROW - - `__nÚnuÎ - ((3)); - -249 #ià -__HAVE_FLOAT32X - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -250  - $¡räomf32x - (* -__de¡ -, -size_t - -__size -, cÚ¡ * -__fÜm© -, - -251 -_Flßt32x - -__f -) - -252 -__THROW - - `__nÚnuÎ - ((3)); - -255 #ià -__HAVE_FLOAT64X - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -256  - $¡räomf64x - (* -__de¡ -, -size_t - -__size -, cÚ¡ * -__fÜm© -, - -257 -_Flßt64x - -__f -) - -258 -__THROW - - `__nÚnuÎ - ((3)); - -261 #ià -__HAVE_FLOAT128X - && - `__GLIBC_USE - ( -IEC_60559_TYPES_EXT -) - -262  - $¡räomf128x - (* -__de¡ -, -size_t - -__size -, cÚ¡ * -__fÜm© -, - -263 -_Flßt128x - -__f -) - -264 -__THROW - - `__nÚnuÎ - ((3)); - -268 #ifdeà -__USE_GNU - - -272  - ~ - -274  - $¡¹Þ_l - (cÚ¡ * -__»¡riù - -__Ō -, - -275 ** -__»¡riù - -__’d±r -,  -__ba£ -, - -276 -loÿË_t - -__loc -è -__THROW - - `__nÚnuÎ - ((1, 4)); - -278  - $¡¹oul_l - (cÚ¡ * -__»¡riù - -__Ō -, - -279 ** -__»¡riù - -__’d±r -, - -280  -__ba£ -, -loÿË_t - -__loc -) - -281 -__THROW - - `__nÚnuÎ - ((1, 4)); - -283 -__ex‹nsiÚ__ - - -284  - $¡¹Þl_l - (cÚ¡ * -__»¡riù - -__Ō -, - -285 ** -__»¡riù - -__’d±r -,  -__ba£ -, - -286 -loÿË_t - -__loc -) - -287 -__THROW - - `__nÚnuÎ - ((1, 4)); - -289 -__ex‹nsiÚ__ - - -290  - $¡¹ouÎ_l - (cÚ¡ * -__»¡riù - -__Ō -, - -291 ** -__»¡riù - -__’d±r -, - -292  -__ba£ -, -loÿË_t - -__loc -) - -293 -__THROW - - `__nÚnuÎ - ((1, 4)); - -295  - $¡¹od_l - (cÚ¡ * -__»¡riù - -__Ō -, - -296 ** -__»¡riù - -__’d±r -, -loÿË_t - -__loc -) - -297 -__THROW - - `__nÚnuÎ - ((1, 3)); - -299  - $¡¹of_l - (cÚ¡ * -__»¡riù - -__Ō -, - -300 ** -__»¡riù - -__’d±r -, -loÿË_t - -__loc -) - -301 -__THROW - - `__nÚnuÎ - ((1, 3)); - -303  - $¡¹Þd_l - (cÚ¡ * -__»¡riù - -__Ō -, - -304 ** -__»¡riù - -__’d±r -, - -305 -loÿË_t - -__loc -) - -306 -__THROW - - `__nÚnuÎ - ((1, 3)); - -308 #ià -__HAVE_FLOAT16 - - -309 -_Flßt16 - - $¡¹of16_l - (cÚ¡ * -__»¡riù - -__Ō -, - -310 ** -__»¡riù - -__’d±r -, - -311 -loÿË_t - -__loc -) - -312 -__THROW - - `__nÚnuÎ - ((1, 3)); - -315 #ià -__HAVE_FLOAT32 - - -316 -_Flßt32 - - $¡¹of32_l - (cÚ¡ * -__»¡riù - -__Ō -, - -317 ** -__»¡riù - -__’d±r -, - -318 -loÿË_t - -__loc -) - -319 -__THROW - - `__nÚnuÎ - ((1, 3)); - -322 #ià -__HAVE_FLOAT64 - - -323 -_Flßt64 - - $¡¹of64_l - (cÚ¡ * -__»¡riù - -__Ō -, - -324 ** -__»¡riù - -__’d±r -, - -325 -loÿË_t - -__loc -) - -326 -__THROW - - `__nÚnuÎ - ((1, 3)); - -329 #ià -__HAVE_FLOAT128 - - -330 -_Flßt128 - - $¡¹of128_l - (cÚ¡ * -__»¡riù - -__Ō -, - -331 ** -__»¡riù - -__’d±r -, - -332 -loÿË_t - -__loc -) - -333 -__THROW - - `__nÚnuÎ - ((1, 3)); - -336 #ià -__HAVE_FLOAT32X - - -337 -_Flßt32x - - $¡¹of32x_l - (cÚ¡ * -__»¡riù - -__Ō -, - -338 ** -__»¡riù - -__’d±r -, - -339 -loÿË_t - -__loc -) - -340 -__THROW - - `__nÚnuÎ - ((1, 3)); - -343 #ià -__HAVE_FLOAT64X - - -344 -_Flßt64x - - $¡¹of64x_l - (cÚ¡ * -__»¡riù - -__Ō -, - -345 ** -__»¡riù - -__’d±r -, - -346 -loÿË_t - -__loc -) - -347 -__THROW - - `__nÚnuÎ - ((1, 3)); - -350 #ià -__HAVE_FLOAT128X - - -351 -_Flßt128x - - $¡¹of128x_l - (cÚ¡ * -__»¡riù - -__Ō -, - -352 ** -__»¡riù - -__’d±r -, - -353 -loÿË_t - -__loc -) - -354 -__THROW - - `__nÚnuÎ - ((1, 3)); - -359 #ifdeà -__USE_EXTERN_INLINES - - -360 -__ex‹º_šlše -  - -361 - `__NTH - ( - $©oi - (cÚ¡ * -__Ō -)) - -363  (è - `¡¹Þ - ( -__Ō -, (**è -NULL -, 10); - -364 - } -} - -365 -__ex‹º_šlše -  - -366 -__NTH - ( - $©Þ - (cÚ¡ * -__Ō -)) - -368  - `¡¹Þ - ( -__Ō -, (**è -NULL -, 10); - -369 - } -} - -371 #ifdeà -__USE_ISOC99 - - -372 -__ex‹nsiÚ__ - -__ex‹º_šlše -  - -373 -__NTH - ( - $©Þl - (cÚ¡ * -__Ō -)) - -375  - `¡¹Þl - ( -__Ō -, (**è -NULL -, 10); - -376 - } -} - -381 #ià -defšed - -__USE_MISC - || defšed -__USE_XOPEN_EXTENDED - - -385 * - $l64a - ( -__n -è -__THROW - -__wur -; - -388  - $a64l - (cÚ¡ * -__s -) - -389 -__THROW - -__©Œibu‹_pu»__ - - `__nÚnuÎ - ((1)è -__wur -; - -393 #ià -defšed - -__USE_MISC - || defšed -__USE_XOPEN_EXTENDED - - -394  - ~ - -401  - $¿ndom - (è -__THROW -; - -404  - $¤ªdom - ( -__£ed -è -__THROW -; - -410 * - $𙡩e - ( -__£ed -, * -__¡©ebuf -, - -411 -size_t - -__¡©–’ -è -__THROW - - `__nÚnuÎ - ((2)); - -415 * - $£t¡©e - (* -__¡©ebuf -è -__THROW - - `__nÚnuÎ - ((1)); - -418 #ifdeà -__USE_MISC - - -423  - s¿ndom_d©a - - -425 -št32_t - * -åŒ -; - -426 -št32_t - * -½Œ -; - -427 -št32_t - * -¡©e -; - -428  -¿nd_ty³ -; - -429  -¿nd_deg -; - -430  -¿nd_£p -; - -431 -št32_t - * -’d_±r -; - -434  - $¿ndom_r - ( -¿ndom_d©a - * -__»¡riù - -__buf -, - -435 -št32_t - * -__»¡riù - -__»suÉ -è -__THROW - - `__nÚnuÎ - ((1, 2)); - -437  - $¤ªdom_r - ( -__£ed -,  -¿ndom_d©a - * -__buf -) - -438 -__THROW - - `__nÚnuÎ - ((2)); - -440  - $𙡩e_r - ( -__£ed -, * -__»¡riù - -__¡©ebuf -, - -441 -size_t - -__¡©–’ -, - -442  -¿ndom_d©a - * -__»¡riù - -__buf -) - -443 -__THROW - - `__nÚnuÎ - ((2, 4)); - -445  - $£t¡©e_r - (* -__»¡riù - -__¡©ebuf -, - -446  -¿ndom_d©a - * -__»¡riù - -__buf -) - -447 -__THROW - - `__nÚnuÎ - ((1, 2)); - -453  - $¿nd - (è -__THROW -; - -455  - $¤ªd - ( -__£ed -è -__THROW -; - -457 #ifdeà -__USE_POSIX199506 - - -459  - $¿nd_r - (* -__£ed -è -__THROW -; - -463 #ià -defšed - -__USE_MISC - || defšed -__USE_XOPEN - - -467  - $d¿nd48 - (è -__THROW -; - -468  - $”ªd48 - ( -__xsubi -[3]è -__THROW - - `__nÚnuÎ - ((1)); - -471  - $̪d48 - (è -__THROW -; - -472  - $Īd48 - ( -__xsubi -[3]) - -473 -__THROW - - `__nÚnuÎ - ((1)); - -476  - $m¿nd48 - (è -__THROW -; - -477  - $j¿nd48 - ( -__xsubi -[3]) - -478 -__THROW - - `__nÚnuÎ - ((1)); - -481  - $¤ªd48 - ( -__£edv® -è -__THROW -; - -482 * - $£ed48 - ( -__£ed16v -[3]) - -483 -__THROW - - `__nÚnuÎ - ((1)); - -484  - $lcÚg48 - ( -__·¿m -[7]è -__THROW - - `__nÚnuÎ - ((1)); - -486 #ifdeà -__USE_MISC - - -490  - sd¿nd48_d©a - - -492  -__x -[3]; - -493  -__Þd_x -[3]; - -494  -__c -; - -495  -__š™ -; - -496 -__ex‹nsiÚ__ -  -__a -; - -501  - $d¿nd48_r - ( -d¿nd48_d©a - * -__»¡riù - -__bufãr -, - -502 * -__»¡riù - -__»suÉ -è -__THROW - - `__nÚnuÎ - ((1, 2)); - -503  - $”ªd48_r - ( -__xsubi -[3], - -504  -d¿nd48_d©a - * -__»¡riù - -__bufãr -, - -505 * -__»¡riù - -__»suÉ -è -__THROW - - `__nÚnuÎ - ((1, 2)); - -508  - $̪d48_r - ( -d¿nd48_d©a - * -__»¡riù - -__bufãr -, - -509 * -__»¡riù - -__»suÉ -) - -510 -__THROW - - `__nÚnuÎ - ((1, 2)); - -511  - $Īd48_r - ( -__xsubi -[3], - -512  -d¿nd48_d©a - * -__»¡riù - -__bufãr -, - -513 * -__»¡riù - -__»suÉ -) - -514 -__THROW - - `__nÚnuÎ - ((1, 2)); - -517  - $m¿nd48_r - ( -d¿nd48_d©a - * -__»¡riù - -__bufãr -, - -518 * -__»¡riù - -__»suÉ -) - -519 -__THROW - - `__nÚnuÎ - ((1, 2)); - -520  - $j¿nd48_r - ( -__xsubi -[3], - -521  -d¿nd48_d©a - * -__»¡riù - -__bufãr -, - -522 * -__»¡riù - -__»suÉ -) - -523 -__THROW - - `__nÚnuÎ - ((1, 2)); - -526  - $¤ªd48_r - ( -__£edv® -,  -d¿nd48_d©a - * -__bufãr -) - -527 -__THROW - - `__nÚnuÎ - ((2)); - -529  - $£ed48_r - ( -__£ed16v -[3], - -530  -d¿nd48_d©a - * -__bufãr -è -__THROW - - `__nÚnuÎ - ((1, 2)); - -532  - $lcÚg48_r - ( -__·¿m -[7], - -533  -d¿nd48_d©a - * -__bufãr -) - -534 -__THROW - - `__nÚnuÎ - ((1, 2)); - -539 * - $m®loc - ( -size_t - -__size -è -__THROW - -__©Œibu‹_m®loc__ - -__wur -; - -541 * - $ÿÎoc - ( -size_t - -__nmemb -, size_ˆ -__size -) - -542 -__THROW - -__©Œibu‹_m®loc__ - -__wur -; - -549 * - $»®loc - (* -__±r -, -size_t - -__size -) - -550 -__THROW - -__©Œibu‹_w¬n_unu£d_»suÉ__ -; - -552 #ifdeà -__USE_GNU - - -558 * - $»®loÿ¼ay - (* -__±r -, -size_t - -__nmemb -, size_ˆ -__size -) - -559 -__THROW - -__©Œibu‹_w¬n_unu£d_»suÉ__ -; - -563  - $ä“ - (* -__±r -è -__THROW -; - -565 #ifdeà -__USE_MISC - - -566  - ~<®loÿ.h -> - -569 #ià( -defšed - -__USE_XOPEN_EXTENDED - && !defšed -__USE_XOPEN2K -) \ - -570 || -defšed - -__USE_MISC - - -572 * - $v®loc - ( -size_t - -__size -è -__THROW - -__©Œibu‹_m®loc__ - -__wur -; - -575 #ifdeà -__USE_XOPEN2K - - -577  - $posix_mem®ign - (** -__mem±r -, -size_t - -__®ignm’t -, size_ˆ -__size -) - -578 -__THROW - - `__nÚnuÎ - ((1)è -__wur -; - -581 #ifdeà -__USE_ISOC11 - - -583 * - $®igÃd_®loc - ( -size_t - -__®ignm’t -, size_ˆ -__size -) - -584 -__THROW - -__©Œibu‹_m®loc__ - - `__©Œibu‹_®loc_size__ - ((2)è -__wur -; - -588  - $abÜt - (è -__THROW - - `__©Œibu‹__ - (( -__nܑuº__ -)); - -592  - $©ex™ - ((* -__func -è()è -__THROW - - `__nÚnuÎ - ((1)); - -594 #ià -defšed - -__USE_ISOC11 - || defšed -__USE_ISOCXX11 - - -596 #ifdeà -__ýlu¥lus - - -597 "C++"  - $©_quick_ex™ - ((* -__func -) ()) - -598 -__THROW - - `__asm - ("©_quick_ex™"è - `__nÚnuÎ - ((1)); - -600  - $©_quick_ex™ - ((* -__func -è()è -__THROW - - `__nÚnuÎ - ((1)); - -604 #ifdef -__USE_MISC - - -607  - $Ú_ex™ - ((* -__func -è( -__¡©us -, * -__¬g -), *__arg) - -608 -__THROW - - `__nÚnuÎ - ((1)); - -614  - $ex™ - ( -__¡©us -è -__THROW - - `__©Œibu‹__ - (( -__nܑuº__ -)); - -616 #ià -defšed - -__USE_ISOC11 - || defšed -__USE_ISOCXX11 - - -620  - $quick_ex™ - ( -__¡©us -è -__THROW - - `__©Œibu‹__ - (( -__nܑuº__ -)); - -623 #ifdeà -__USE_ISOC99 - - -626  - $_Ex™ - ( -__¡©us -è -__THROW - - `__©Œibu‹__ - (( -__nܑuº__ -)); - -631 * - $g‘’v - (cÚ¡ * -__Çme -è -__THROW - - `__nÚnuÎ - ((1)è -__wur -; - -633 #ifdeà -__USE_GNU - - -636 * - $£cu»_g‘’v - (cÚ¡ * -__Çme -) - -637 -__THROW - - `__nÚnuÎ - ((1)è -__wur -; - -640 #ià -defšed - -__USE_MISC - || defšed -__USE_XOPEN - - -644  - $pu‹nv - (* -__¡ršg -è -__THROW - - `__nÚnuÎ - ((1)); - -647 #ifdeà -__USE_XOPEN2K - - -650  - $£‹nv - (cÚ¡ * -__Çme -, cÚ¡ * -__v®ue -,  -__»¶aû -) - -651 -__THROW - - `__nÚnuÎ - ((2)); - -654  - $un£‹nv - (cÚ¡ * -__Çme -è -__THROW - - `__nÚnuÎ - ((1)); - -657 #ifdef -__USE_MISC - - -661  - $þ—»nv - (è -__THROW -; - -665 #ià -defšed - -__USE_MISC - \ - -666 || ( -defšed - -__USE_XOPEN_EXTENDED - && !defšed -__USE_XOPEN2K8 -) - -672 * - $mk‹mp - (* -__‹m¶©e -è -__THROW - - `__nÚnuÎ - ((1)); - -675 #ià -defšed - -__USE_XOPEN_EXTENDED - || defšed -__USE_XOPEN2K8 - - -684 #iâdeà -__USE_FILE_OFFSET64 - - -685  - $mk¡emp - (* -__‹m¶©e -è - `__nÚnuÎ - ((1)è -__wur -; - -687 #ifdeà -__REDIRECT - - -688  - `__REDIRECT - ( -mk¡emp -, (* -__‹m¶©e -), -mk¡emp64 -) - -689 - `__nÚnuÎ - ((1)è -__wur -; - -691  - #mk¡emp - -mk¡emp64 - - - ) - -694 #ifdeà -__USE_LARGEFILE64 - - -695  - $mk¡emp64 - (* -__‹m¶©e -è - `__nÚnuÎ - ((1)è -__wur -; - -699 #ifdeà -__USE_MISC - - -706 #iâdeà -__USE_FILE_OFFSET64 - - -707  - $mk¡emps - (* -__‹m¶©e -,  -__suffixËn -è - `__nÚnuÎ - ((1)è -__wur -; - -709 #ifdeà -__REDIRECT - - -710  - `__REDIRECT - ( -mk¡emps -, (* -__‹m¶©e -,  -__suffixËn -), - -711 -mk¡emps64 -è - `__nÚnuÎ - ((1)è -__wur -; - -713  - #mk¡emps - -mk¡emps64 - - - ) - -716 #ifdeà -__USE_LARGEFILE64 - - -717  - $mk¡emps64 - (* -__‹m¶©e -,  -__suffixËn -) - -718 - `__nÚnuÎ - ((1)è -__wur -; - -722 #ifdeà -__USE_XOPEN2K8 - - -728 * - $mkd‹mp - (* -__‹m¶©e -è -__THROW - - `__nÚnuÎ - ((1)è -__wur -; - -731 #ifdeà -__USE_GNU - - -738 #iâdeà -__USE_FILE_OFFSET64 - - -739  - $mko¡emp - (* -__‹m¶©e -,  -__æags -è - `__nÚnuÎ - ((1)è -__wur -; - -741 #ifdeà -__REDIRECT - - -742  - `__REDIRECT - ( -mko¡emp -, (* -__‹m¶©e -,  -__æags -), -mko¡emp64 -) - -743 - `__nÚnuÎ - ((1)è -__wur -; - -745  - #mko¡emp - -mko¡emp64 - - - ) - -748 #ifdeà -__USE_LARGEFILE64 - - -749  - $mko¡emp64 - (* -__‹m¶©e -,  -__æags -è - `__nÚnuÎ - ((1)è -__wur -; - -758 #iâdeà -__USE_FILE_OFFSET64 - - -759  - $mko¡emps - (* -__‹m¶©e -,  -__suffixËn -,  -__æags -) - -760 - `__nÚnuÎ - ((1)è -__wur -; - -762 #ifdeà -__REDIRECT - - -763  - `__REDIRECT - ( -mko¡emps -, (* -__‹m¶©e -,  -__suffixËn -, - -764  -__æags -), -mko¡emps64 -) - -765 - `__nÚnuÎ - ((1)è -__wur -; - -767  - #mko¡emps - -mko¡emps64 - - - ) - -770 #ifdeà -__USE_LARGEFILE64 - - -771  - $mko¡emps64 - (* -__‹m¶©e -,  -__suffixËn -,  -__æags -) - -772 - `__nÚnuÎ - ((1)è -__wur -; - -781  - $sy¡em - (cÚ¡ * -__commªd -è -__wur -; - -784 #ifdef -__USE_GNU - - -787 * - $ÿnÚiÿlize_fže_Çme - (cÚ¡ * -__Çme -) - -788 -__THROW - - `__nÚnuÎ - ((1)è -__wur -; - -791 #ià -defšed - -__USE_MISC - || defšed -__USE_XOPEN_EXTENDED - - -797 * - $»®·th - (cÚ¡ * -__»¡riù - -__Çme -, - -798 * -__»¡riù - -__»sÞved -è -__THROW - -__wur -; - -803 #iâdeà -__COMPAR_FN_T - - -804  - #__COMPAR_FN_T - - - ) - -805 (* - t__com·r_â_t -) (const *, const *); - -807 #ifdef -__USE_GNU - - -808  -__com·r_â_t - - tcom·risÚ_â_t -; - -811 #ifdeà -__USE_GNU - - -812 (* - t__com·r_d_â_t -) (const *, const *, *); - -817 * - $b£¬ch - (cÚ¡ * -__key -, cÚ¡ * -__ba£ -, - -818 -size_t - -__nmemb -, size_ˆ -__size -, -__com·r_â_t - -__com·r -) - -819 - `__nÚnuÎ - ((1, 2, 5)è -__wur -; - -821 #ifdeà -__USE_EXTERN_INLINES - - -822  - ~ - -827  - $qsÜt - (* -__ba£ -, -size_t - -__nmemb -, size_ˆ -__size -, - -828 -__com·r_â_t - -__com·r -è - `__nÚnuÎ - ((1, 4)); - -829 #ifdeà -__USE_GNU - - -830  - $qsÜt_r - (* -__ba£ -, -size_t - -__nmemb -, size_ˆ -__size -, - -831 -__com·r_d_â_t - -__com·r -, * -__¬g -) - -832 - `__nÚnuÎ - ((1, 4)); - -837  - $abs - ( -__x -è -__THROW - - `__©Œibu‹__ - (( -__cÚ¡__ -)è -__wur -; - -838  - $Ïbs - ( -__x -è -__THROW - - `__©Œibu‹__ - (( -__cÚ¡__ -)è -__wur -; - -840 #ifdeà -__USE_ISOC99 - - -841 -__ex‹nsiÚ__ -  - $Îabs - ( -__x -) - -842 -__THROW - - `__©Œibu‹__ - (( -__cÚ¡__ -)è -__wur -; - -849 -div_t - - $div - ( -__num” -,  -__d’om -) - -850 -__THROW - - `__©Œibu‹__ - (( -__cÚ¡__ -)è -__wur -; - -851 -ldiv_t - - $ldiv - ( -__num” -,  -__d’om -) - -852 -__THROW - - `__©Œibu‹__ - (( -__cÚ¡__ -)è -__wur -; - -854 #ifdeà -__USE_ISOC99 - - -855 -__ex‹nsiÚ__ - -Îdiv_t - - $Îdiv - ( -__num” -, - -856  -__d’om -) - -857 -__THROW - - `__©Œibu‹__ - (( -__cÚ¡__ -)è -__wur -; - -861 #ià( -defšed - -__USE_XOPEN_EXTENDED - && !defšed -__USE_XOPEN2K8 -) \ - -862 || -defšed - -__USE_MISC - - -869 * - $ecvt - ( -__v®ue -,  -__ndig™ -, * -__»¡riù - -__deýt -, - -870 * -__»¡riù - -__sign -è -__THROW - - `__nÚnuÎ - ((3, 4)è -__wur -; - -875 * - $fcvt - ( -__v®ue -,  -__ndig™ -, * -__»¡riù - -__deýt -, - -876 * -__»¡riù - -__sign -è -__THROW - - `__nÚnuÎ - ((3, 4)è -__wur -; - -881 * - $gcvt - ( -__v®ue -,  -__ndig™ -, * -__buf -) - -882 -__THROW - - `__nÚnuÎ - ((3)è -__wur -; - -885 #ifdeà -__USE_MISC - - -887 * - $qecvt - ( -__v®ue -,  -__ndig™ -, - -888 * -__»¡riù - -__deýt -, *__»¡riù -__sign -) - -889 -__THROW - - `__nÚnuÎ - ((3, 4)è -__wur -; - -890 * - $qfcvt - ( -__v®ue -,  -__ndig™ -, - -891 * -__»¡riù - -__deýt -, *__»¡riù -__sign -) - -892 -__THROW - - `__nÚnuÎ - ((3, 4)è -__wur -; - -893 * - $qgcvt - ( -__v®ue -,  -__ndig™ -, * -__buf -) - -894 -__THROW - - `__nÚnuÎ - ((3)è -__wur -; - -899  - $ecvt_r - ( -__v®ue -,  -__ndig™ -, * -__»¡riù - -__deýt -, - -900 * -__»¡riù - -__sign -, *__»¡riù -__buf -, - -901 -size_t - -__Ën -è -__THROW - - `__nÚnuÎ - ((3, 4, 5)); - -902  - $fcvt_r - ( -__v®ue -,  -__ndig™ -, * -__»¡riù - -__deýt -, - -903 * -__»¡riù - -__sign -, *__»¡riù -__buf -, - -904 -size_t - -__Ën -è -__THROW - - `__nÚnuÎ - ((3, 4, 5)); - -906  - $qecvt_r - ( -__v®ue -,  -__ndig™ -, - -907 * -__»¡riù - -__deýt -, *__»¡riù -__sign -, - -908 * -__»¡riù - -__buf -, -size_t - -__Ën -) - -909 -__THROW - - `__nÚnuÎ - ((3, 4, 5)); - -910  - $qfcvt_r - ( -__v®ue -,  -__ndig™ -, - -911 * -__»¡riù - -__deýt -, *__»¡riù -__sign -, - -912 * -__»¡riù - -__buf -, -size_t - -__Ën -) - -913 -__THROW - - `__nÚnuÎ - ((3, 4, 5)); - -919  - $mbËn - (cÚ¡ * -__s -, -size_t - -__n -è -__THROW -; - -922  - $mbtowc - ( -wch¬_t - * -__»¡riù - -__pwc -, - -923 cÚ¡ * -__»¡riù - -__s -, -size_t - -__n -è -__THROW -; - -926  - $wùomb - (* -__s -, -wch¬_t - -__wch¬ -è -__THROW -; - -930 -size_t - - $mb¡owcs - ( -wch¬_t - * -__»¡riù - -__pwcs -, - -931 cÚ¡ * -__»¡riù - -__s -, -size_t - -__n -è -__THROW -; - -933 -size_t - - $wc¡ombs - (* -__»¡riù - -__s -, - -934 cÚ¡ -wch¬_t - * -__»¡riù - -__pwcs -, -size_t - -__n -) - -935 -__THROW -; - -938 #ifdeà -__USE_MISC - - -943  - $½m©ch - (cÚ¡ * -__»¥Ú£ -è -__THROW - - `__nÚnuÎ - ((1)è -__wur -; - -947 #ià -defšed - -__USE_XOPEN_EXTENDED - || defšed -__USE_XOPEN2K8 - - -954  - $g‘subÝt - (** -__»¡riù - -__ÝtiÚp -, - -955 *cÚ¡ * -__»¡riù - -__tok’s -, - -956 ** -__»¡riù - -__v®u• -) - -957 -__THROW - - `__nÚnuÎ - ((1, 2, 3)è -__wur -; - -961 #ifdeà -__USE_XOPEN - - -963  - $£tkey - (cÚ¡ * -__key -è -__THROW - - `__nÚnuÎ - ((1)); - -969 #ifdeà -__USE_XOPEN2KXSI - - -971  - $posix_ݒ± - ( -__oæag -è -__wur -; - -974 #ifdeà -__USE_XOPEN_EXTENDED - - -979  - $g¿Á± - ( -__fd -è -__THROW -; - -983  - $uÆock± - ( -__fd -è -__THROW -; - -988 * - $±¢ame - ( -__fd -è -__THROW - -__wur -; - -991 #ifdeà -__USE_GNU - - -995  - $±¢ame_r - ( -__fd -, * -__buf -, -size_t - -__buæ’ -) - -996 -__THROW - - `__nÚnuÎ - ((2)); - -999  - `g‘± - (); - -1002 #ifdeà -__USE_MISC - - -1006  - $g‘lßdavg - ( -__lßdavg -[],  -__ÃËm -) - -1007 -__THROW - - `__nÚnuÎ - ((1)); - -1010 #ià -defšed - -__USE_XOPEN_EXTENDED - && !defšed -__USE_XOPEN2K - - -1013  - $‰y¦Ù - (è -__THROW -; - -1016  - ~ - -1019 #ià -__USE_FORTIFY_LEVEL - > 0 && -defšed - -__fÜtify_funùiÚ - - -1020  - ~ - -1022 #ifdeà -__LDBL_COMPAT - - -1023  - ~ - -1026 -__END_DECLS - - - @/usr/include/alloca.h - -18 #iâdef -_ALLOCA_H - - -19  - #_ALLOCA_H - 1 - - ) - -21  - ~<ã©u»s.h -> - -23  - #__Ãed_size_t - - - ) - -24  - ~<¡ddef.h -> - -26 - g__BEGIN_DECLS - - -29 #undeà -®loÿ - - -32 * - $®loÿ - ( -size_t - -__size -è -__THROW -; - -34 #ifdef -__GNUC__ - - -35  - #®loÿ -( -size -è - `__bužtš_®loÿ - (size) - - ) - -38 -__END_DECLS - - - @/usr/include/features.h - -18 #iâdef -_FEATURES_H - - -19  - #_FEATURES_H - 1 - - ) - -119 #undeà -__USE_ISOC11 - - -120 #undeà -__USE_ISOC99 - - -121 #undeà -__USE_ISOC95 - - -122 #undeà -__USE_ISOCXX11 - - -123 #undeà -__USE_POSIX - - -124 #undeà -__USE_POSIX2 - - -125 #undeà -__USE_POSIX199309 - - -126 #undeà -__USE_POSIX199506 - - -127 #undeà -__USE_XOPEN - - -128 #undeà -__USE_XOPEN_EXTENDED - - -129 #undeà -__USE_UNIX98 - - -130 #undeà -__USE_XOPEN2K - - -131 #undeà -__USE_XOPEN2KXSI - - -132 #undeà -__USE_XOPEN2K8 - - -133 #undeà -__USE_XOPEN2K8XSI - - -134 #undeà -__USE_LARGEFILE - - -135 #undeà -__USE_LARGEFILE64 - - -136 #undeà -__USE_FILE_OFFSET64 - - -137 #undeà -__USE_MISC - - -138 #undeà -__USE_ATFILE - - -139 #undeà -__USE_GNU - - -140 #undeà -__USE_FORTIFY_LEVEL - - -141 #undeà -__KERNEL_STRICT_NAMES - - -142 #undeà -__GLIBC_USE_DEPRECATED_GETS - - -146 #iâdeà -_LOOSE_KERNEL_NAMES - - -147  - #__KERNEL_STRICT_NAMES - - - ) - -157 #ià -defšed - -__GNUC__ - && defšed -__GNUC_MINOR__ - - -158  - #__GNUC_PREREQ -( -maj -, -mš -) \ - -159 (( -__GNUC__ - << 16è+ -__GNUC_MINOR__ - >ð(( -maj -è<< 16è+ ( -mš -)) - - ) - -161  - #__GNUC_PREREQ -( -maj -, -mš -è0 - - ) - -168 #ià -defšed - -__þªg_majÜ__ - && defšed -__þªg_mšÜ__ - - -169  - #__glibc_þªg_´”eq -( -maj -, -mš -) \ - -170 (( -__þªg_majÜ__ - << 16è+ -__þªg_mšÜ__ - >ð(( -maj -è<< 16è+ ( -mš -)) - - ) - -172  - #__glibc_þªg_´”eq -( -maj -, -mš -è0 - - ) - -176  - #__GLIBC_USE -( -F -è -__GLIBC_USE_ - ## - ) -F - -182 #ià( -defšed - -_BSD_SOURCE - || defšed -_SVID_SOURCE -) \ - -183 && ! -defšed - - g_DEFAULT_SOURCE - - -185 #undeà -_DEFAULT_SOURCE - - -186  - #_DEFAULT_SOURCE - 1 - - ) - -190 #ifdeà -_GNU_SOURCE - - -191 #undeà -_ISOC95_SOURCE - - -192  - #_ISOC95_SOURCE - 1 - - ) - -193 #undeà -_ISOC99_SOURCE - - -194  - #_ISOC99_SOURCE - 1 - - ) - -195 #undeà -_ISOC11_SOURCE - - -196  - #_ISOC11_SOURCE - 1 - - ) - -197 #undeà -_POSIX_SOURCE - - -198  - #_POSIX_SOURCE - 1 - - ) - -199 #undeà -_POSIX_C_SOURCE - - -200  - #_POSIX_C_SOURCE - 200809L - - ) - -201 #undeà -_XOPEN_SOURCE - - -202  - #_XOPEN_SOURCE - 700 - - ) - -203 #undeà -_XOPEN_SOURCE_EXTENDED - - -204  - #_XOPEN_SOURCE_EXTENDED - 1 - - ) - -205 #undeà -_LARGEFILE64_SOURCE - - -206  - #_LARGEFILE64_SOURCE - 1 - - ) - -207 #undeà -_DEFAULT_SOURCE - - -208  - #_DEFAULT_SOURCE - 1 - - ) - -209 #undeà -_ATFILE_SOURCE - - -210  - #_ATFILE_SOURCE - 1 - - ) - -215 #ià( -defšed - -_DEFAULT_SOURCE - \ - -216 || (! -defšed - - g__STRICT_ANSI__ - \ - -217 && ! -defšed - - g_ISOC99_SOURCE - \ - -218 && ! -defšed - - g_POSIX_SOURCE - && !defšed - g_POSIX_C_SOURCE - \ - -219 && ! -defšed - - g_XOPEN_SOURCE -)) - -220 #undeà -_DEFAULT_SOURCE - - -221  - #_DEFAULT_SOURCE - 1 - - ) - -225 #ià( -defšed - -_ISOC11_SOURCE - \ - -226 || ( -defšed - - g__STDC_VERSION__ - && __STDC_VERSION__ >= 201112L)) - -227  - #__USE_ISOC11 - 1 - - ) - -231 #ià( -defšed - -_ISOC99_SOURCE - || defšed -_ISOC11_SOURCE - \ - -232 || ( -defšed - -__STDC_VERSION__ - && __STDC_VERSION__ >= 199901L)) - -233  - #__USE_ISOC99 - 1 - - ) - -237 #ià( -defšed - -_ISOC99_SOURCE - || defšed -_ISOC11_SOURCE - \ - -238 || ( -defšed - -__STDC_VERSION__ - && __STDC_VERSION__ >= 199409L)) - -239  - #__USE_ISOC95 - 1 - - ) - -242 #ifdeà -__ýlu¥lus - - -244 #ià -__ýlu¥lus - >= 201703L - -245  - #__USE_ISOC11 - 1 - - ) - -249 #ià -__ýlu¥lus - >ð201103L || -defšed - -__GXX_EXPERIMENTAL_CXX0X__ - - -250  - #__USE_ISOCXX11 - 1 - - ) - -251  - #__USE_ISOC99 - 1 - - ) - -258 #ifdeà -_DEFAULT_SOURCE - - -259 #ià! -defšed - -_POSIX_SOURCE - && !defšed -_POSIX_C_SOURCE - - -260  - #__USE_POSIX_IMPLICITLY - 1 - - ) - -262 #undeà -_POSIX_SOURCE - - -263  - #_POSIX_SOURCE - 1 - - ) - -264 #undeà -_POSIX_C_SOURCE - - -265  - #_POSIX_C_SOURCE - 200809L - - ) - -268 #ià((! -defšed - -__STRICT_ANSI__ - \ - -269 || ( -defšed - -_XOPEN_SOURCE - && (_XOPEN_SOURCE - 0) >= 500)) \ - -270 && ! -defšed - -_POSIX_SOURCE - && !defšed -_POSIX_C_SOURCE -) - -271  - #_POSIX_SOURCE - 1 - - ) - -272 #ià -defšed - -_XOPEN_SOURCE - && (_XOPEN_SOURCE - 0) < 500 - -273  - #_POSIX_C_SOURCE - 2 - - ) - -274 #–ià -defšed - -_XOPEN_SOURCE - && (_XOPEN_SOURCE - 0) < 600 - -275  - #_POSIX_C_SOURCE - 199506L - - ) - -276 #–ià -defšed - -_XOPEN_SOURCE - && (_XOPEN_SOURCE - 0) < 700 - -277  - #_POSIX_C_SOURCE - 200112L - - ) - -279  - #_POSIX_C_SOURCE - 200809L - - ) - -281  - #__USE_POSIX_IMPLICITLY - 1 - - ) - -290 #ià((! -defšed - -_POSIX_C_SOURCE - || (_POSIX_C_SOURCE - 0) < 199506L) \ - -291 && ( -defšed - -_REENTRANT - || defšed -_THREAD_SAFE -)) - -292  - #_POSIX_SOURCE - 1 - - ) - -293 #undeà -_POSIX_C_SOURCE - - -294  - #_POSIX_C_SOURCE - 199506L - - ) - -297 #ià( -defšed - -_POSIX_SOURCE - \ - -298 || ( -defšed - -_POSIX_C_SOURCE - && _POSIX_C_SOURCE >= 1) \ - -299 || -defšed - -_XOPEN_SOURCE -) - -300  - #__USE_POSIX - 1 - - ) - -303 #ià -defšed - -_POSIX_C_SOURCE - && _POSIX_C_SOURCE >ð2 || defšed -_XOPEN_SOURCE - - -304  - #__USE_POSIX2 - 1 - - ) - -307 #ià -defšed - -_POSIX_C_SOURCE - && (_POSIX_C_SOURCE - 0) >= 199309L - -308  - #__USE_POSIX199309 - 1 - - ) - -311 #ià -defšed - -_POSIX_C_SOURCE - && (_POSIX_C_SOURCE - 0) >= 199506L - -312  - #__USE_POSIX199506 - 1 - - ) - -315 #ià -defšed - -_POSIX_C_SOURCE - && (_POSIX_C_SOURCE - 0) >= 200112L - -316  - #__USE_XOPEN2K - 1 - - ) - -317 #undeà -__USE_ISOC95 - - -318  - #__USE_ISOC95 - 1 - - ) - -319 #undeà -__USE_ISOC99 - - -320  - #__USE_ISOC99 - 1 - - ) - -323 #ià -defšed - -_POSIX_C_SOURCE - && (_POSIX_C_SOURCE - 0) >= 200809L - -324  - #__USE_XOPEN2K8 - 1 - - ) - -325 #undeà -_ATFILE_SOURCE - - -326  - #_ATFILE_SOURCE - 1 - - ) - -329 #ifdef -_XOPEN_SOURCE - - -330  - #__USE_XOPEN - 1 - - ) - -331 #ià( -_XOPEN_SOURCE - - 0) >= 500 - -332  - #__USE_XOPEN_EXTENDED - 1 - - ) - -333  - #__USE_UNIX98 - 1 - - ) - -334 #undeà -_LARGEFILE_SOURCE - - -335  - #_LARGEFILE_SOURCE - 1 - - ) - -336 #ià( -_XOPEN_SOURCE - - 0) >= 600 - -337 #ià( -_XOPEN_SOURCE - - 0) >= 700 - -338  - #__USE_XOPEN2K8 - 1 - - ) - -339  - #__USE_XOPEN2K8XSI - 1 - - ) - -341  - #__USE_XOPEN2K - 1 - - ) - -342  - #__USE_XOPEN2KXSI - 1 - - ) - -343 #undeà -__USE_ISOC95 - - -344  - #__USE_ISOC95 - 1 - - ) - -345 #undeà -__USE_ISOC99 - - -346  - #__USE_ISOC99 - 1 - - ) - -349 #ifdeà -_XOPEN_SOURCE_EXTENDED - - -350  - #__USE_XOPEN_EXTENDED - 1 - - ) - -355 #ifdeà -_LARGEFILE_SOURCE - - -356  - #__USE_LARGEFILE - 1 - - ) - -359 #ifdeà -_LARGEFILE64_SOURCE - - -360  - #__USE_LARGEFILE64 - 1 - - ) - -363 #ià -defšed - -_FILE_OFFSET_BITS - && _FILE_OFFSET_BITS == 64 - -364  - #__USE_FILE_OFFSET64 - 1 - - ) - -367 #ià -defšed - -_DEFAULT_SOURCE - - -368  - #__USE_MISC - 1 - - ) - -371 #ifdef -_ATFILE_SOURCE - - -372  - #__USE_ATFILE - 1 - - ) - -375 #ifdef -_GNU_SOURCE - - -376  - #__USE_GNU - 1 - - ) - -379 #ià -defšed - -_FORTIFY_SOURCE - && _FORTIFY_SOURCE > 0 \ - -380 && -__GNUC_PREREQ - (4, 1è&& -defšed - - g__OPTIMIZE__ - && __OPTIMIZE__ > 0 - -381 #ià -_FORTIFY_SOURCE - > 1 - -382  - #__USE_FORTIFY_LEVEL - 2 - - ) - -384  - #__USE_FORTIFY_LEVEL - 1 - - ) - -387  - #__USE_FORTIFY_LEVEL - 0 - - ) - -394 #ià -defšed - -__ýlu¥lus - ? __ýlu¥lu >ð201402L : defšed -__USE_ISOC11 - - -395  - #__GLIBC_USE_DEPRECATED_GETS - 0 - - ) - -397  - #__GLIBC_USE_DEPRECATED_GETS - 1 - - ) - -402  - ~<¡dc-´edef.h -> - -410 #undeà -__GNU_LIBRARY__ - - -411  - #__GNU_LIBRARY__ - 6 - - ) - -415  - #__GLIBC__ - 2 - - ) - -416  - #__GLIBC_MINOR__ - 27 - - ) - -418  - #__GLIBC_PREREQ -( -maj -, -mš -) \ - -419 (( -__GLIBC__ - << 16è+ -__GLIBC_MINOR__ - >ð(( -maj -è<< 16è+ ( -mš -)) - - ) - -422 #iâdeà -__ASSEMBLER__ - - -423 #iâdeà -_SYS_CDEFS_H - - -424  - ~ - -429 #ià -defšed - -__USE_FILE_OFFSET64 - && !defšed -__REDIRECT - - -430  - #__USE_LARGEFILE - 1 - - ) - -431  - #__USE_LARGEFILE64 - 1 - - ) - -437 #ià -__GNUC_PREREQ - (2, 7è&& -defšed - -__OPTIMIZE__ - \ - -438 && ! -defšed - - g__OPTIMIZE_SIZE__ - && !defšed - g__NO_INLINE__ - \ - -439 && -defšed - - g__ex‹º_šlše - - -440  - #__USE_EXTERN_INLINES - 1 - - ) - -448  - ~ - - @/usr/include/stdc-predef.h - -18 #iâdef -_STDC_PREDEF_H - - -19  - #_STDC_PREDEF_H - 1 - - ) - -36 #ifdeà -__GCC_IEC_559 - - -37 #ià -__GCC_IEC_559 - > 0 - -38  - #__STDC_IEC_559__ - 1 - - ) - -41  - #__STDC_IEC_559__ - 1 - - ) - -44 #ifdeà -__GCC_IEC_559_COMPLEX - - -45 #ià -__GCC_IEC_559_COMPLEX - > 0 - -46  - #__STDC_IEC_559_COMPLEX__ - 1 - - ) - -49  - #__STDC_IEC_559_COMPLEX__ - 1 - - ) - -58  - #__STDC_ISO_10646__ - 201706L - - ) - -61  - #__STDC_NO_THREADS__ - 1 - - ) - - @ -1 -. -1 -/usr/include -176 -3161 -AMF-UE-NGAP-ID.c -AMFPointer.c -AMFRegionID.c -AMFSetID.c -BIT_STRING.c -BOOLEAN.c -CGI.c -CoreCPID.c -E-UTRA-ARFCN.c -E-UTRA-PCI.c -E-UTRA-TAC.c -E2SM-KPM-ActionDefinition-Format1.c -E2SM-KPM-ActionDefinition-Format2.c -E2SM-KPM-ActionDefinition-Format3.c -E2SM-KPM-ActionDefinition.c -E2SM-KPM-EventTriggerDefinition-Format1.c -E2SM-KPM-EventTriggerDefinition.c -E2SM-KPM-IndicationHeader-Format1.c -E2SM-KPM-IndicationHeader.c -E2SM-KPM-IndicationMessage-Format1.c -E2SM-KPM-IndicationMessage-Format2.c -E2SM-KPM-IndicationMessage.c -E2SM-KPM-RANfunction-Description.c -EN-GNB-ID.c -ENB-ID.c -ENB-UE-X2AP-ID-Extension.c -ENB-UE-X2AP-ID.c -EUTRA-CGI.c -EUTRACellIdentity.c -FiveGS-TAC.c -FiveQI.c -FreqBandNrItem.c -GNB-CU-CP-UE-E1AP-ID.c -GNB-CU-UE-F1AP-ID.c -GNB-CU-UP-ID.c -GNB-DU-ID.c -GNB-ID.c -GUAMI.c -GUMMEI.c -GlobalENB-ID.c -GlobalGNB-ID.c -GlobalNGRANNodeID.c -GlobalNgENB-ID.c -GlobalenGNB-ID.c -GranularityPeriod.c -GroupID.c -INTEGER.c -IndexToRFSP.c -Interface-MessageID.c -InterfaceID-E1.c -InterfaceID-F1.c -InterfaceID-NG.c -InterfaceID-S1.c -InterfaceID-W1.c -InterfaceID-X2.c -InterfaceID-Xn.c -InterfaceIdentifier.c -InterfaceType.c -LabelInfoItem.c -LabelInfoList.c -MME-Code.c -MME-Group-ID.c -MME-UE-S1AP-ID.c -MatchingCondItem.c -MatchingCondList.c -MatchingUEidItem.c -MatchingUEidList.c -MeasurementCondItem.c -MeasurementCondList.c -MeasurementCondUEidItem.c -MeasurementCondUEidList.c -MeasurementData.c -MeasurementDataItem.c -MeasurementInfo-Action-Item.c -MeasurementInfo-Action-List.c -MeasurementInfoItem.c -MeasurementInfoList.c -MeasurementLabel.c -MeasurementRecord.c -MeasurementRecordItem.c -MeasurementType.c -MeasurementTypeID.c -MeasurementTypeName.c -NG-RANnodeUEXnAPID.c -NGENB-CU-UE-W1AP-ID.c -NGENB-DU-ID.c -NR-ARFCN.c -NR-CGI.c -NR-PCI.c -NRCellIdentity.c -NRFrequencyBand-List.c -NRFrequencyBandItem.c -NRFrequencyInfo.c -NRFrequencyShift7p5khz.c -NULL.c -NativeEnumerated.c -NativeInteger.c -NativeReal.c -NgENB-ID.c -OCTET_STRING.c -OPEN_TYPE.c -PLMNIdentity.c -PrintableString.c -QCI.c -QoSID.c -QosFlowIdentifier.c -RANUEID.c -RANfunction-Name.c -REAL.c -RIC-EventTriggerStyle-Item.c -RIC-Format-Type.c -RIC-ReportStyle-Item.c -RIC-Style-Name.c -RIC-Style-Type.c -RRC-MessageID.c -RRCclass-LTE.c -RRCclass-NR.c -S-NSSAI.c -SD.c -SST.c -ServingCell-ARFCN.c -ServingCell-PCI.c -SubscriberProfileIDforRFP.c -SupportedSULBandList.c -SupportedSULFreqBandItem.c -TestCond-Expression.c -TestCond-Type.c -TestCond-Value.c -TestCondInfo.c -TimeStamp.c -UEID-EN-GNB.c -UEID-ENB.c -UEID-GNB-CU-CP-E1AP-ID-Item.c -UEID-GNB-CU-CP-E1AP-ID-List.c -UEID-GNB-CU-CP-F1AP-ID-Item.c -UEID-GNB-CU-F1AP-ID-List.c -UEID-GNB-CU-UP.c -UEID-GNB-DU.c -UEID-GNB.c -UEID-NG-ENB-DU.c -UEID-NG-ENB.c -UEID.c -asn_SEQUENCE_OF.c -asn_SET_OF.c -asn_application.c -asn_bit_data.c -asn_codecs_prim.c -asn_internal.c -asn_random_fill.c -ber_decoder.c -ber_tlv_length.c -ber_tlv_tag.c -constr_CHOICE.c -constr_SEQUENCE.c -constr_SEQUENCE_OF.c -constr_SET_OF.c -constr_TYPE.c -constraints.c -der_encoder.c -oer_decoder.c -oer_encoder.c -oer_support.c -per_decoder.c -per_encoder.c -per_opentype.c -per_support.c -xer_decoder.c -xer_encoder.c -xer_support.c -/usr/include/errno.h -/usr/include/math.h -/usr/include/stdio.h -/usr/include/stdlib.h -/usr/include/alloca.h -/usr/include/features.h -/usr/include/stdc-predef.h diff --git a/e2sm/lib/jer_encoder.c b/e2sm/lib/jer_encoder.c new file mode 100644 index 0000000..4fe5ce3 --- /dev/null +++ b/e2sm/lib/jer_encoder.c @@ -0,0 +1,69 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * The JER encoder of any type. May be invoked by the application. + */ +asn_enc_rval_t +jer_encode(const asn_TYPE_descriptor_t *td, const void *sptr, + 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; + + if(!td || !sptr) goto cb_failed; + + mname = td->xml_tag; + mlen = strlen(mname); + + ASN__CALLBACK3("{\n\"", 3, mname, mlen, "\":", 2); + + int xFlag = 0; + tmper = td->op->jer_encoder(td, sptr, 1, xFlag, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + + ASN__CALLBACK("}", 1); + // ASN__CALLBACK3("\n", xcan); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +/* + * This is a helper function for jer_fprint, which directs all incoming data + * into the provided file descriptor. + */ +static int +jer__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 +jer_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 = jer_encode(td, sptr, jer__print2fp, stream); + if(er.encoded == -1) + return -1; + + return fflush(stream); +} + diff --git a/e2sm/lib/per_decoder.c b/e2sm/lib/per_decoder.c index 8a3e39d..42b92ca 100644 --- a/e2sm/lib/per_decoder.c +++ b/e2sm/lib/per_decoder.c @@ -2,184 +2,4 @@ #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; -} - +// Absolutely nothing diff --git a/e2sm/lib/per_encoder.c b/e2sm/lib/per_encoder.c index a35e1f0..01ab70b 100644 --- a/e2sm/lib/per_encoder.c +++ b/e2sm/lib/per_encoder.c @@ -1,10 +1,7 @@ -#include #include #include -static int _uper_encode_flush_outp(asn_per_outp_t *po); - -static int +int ignore_output(const void *data, size_t size, void *app_key) { (void)data; (void)size; @@ -12,81 +9,7 @@ ignore_output(const void *data, size_t 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 +int encode_dyn_cb(const void *buffer, size_t size, void *key) { enc_dyn_arg *arg = key; if(arg->length + size >= arg->allocated) { @@ -110,156 +33,3 @@ encode_dyn_cb(const void *buffer, size_t size, void *key) { 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/e2sm/lib/per_opentype.c b/e2sm/lib/per_opentype.c index 28f3cb6..5620c5b 100644 --- a/e2sm/lib/per_opentype.c +++ b/e2sm/lib/per_opentype.c @@ -2,288 +2,13 @@ * 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 +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) { @@ -301,233 +26,3 @@ uper_sot_suck(const asn_codec_ctx_t *ctx, const asn_TYPE_descriptor_t *td, 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/e2sm/lib/per_support.c b/e2sm/lib/per_support.c index 2c87a76..62d343c 100644 --- a/e2sm/lib/per_support.c +++ b/e2sm/lib/per_support.c @@ -6,487 +6,4 @@ #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; - - // First check effective_bits parameter. - if (ebits >= 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); -} +// Absolutely nothing diff --git a/e2sm/lib/uper_decoder.c b/e2sm/lib/uper_decoder.c new file mode 100644 index 0000000..a88e95c --- /dev/null +++ b/e2sm/lib/uper_decoder.c @@ -0,0 +1,96 @@ +#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; +} diff --git a/e2sm/lib/uper_encoder.c b/e2sm/lib/uper_encoder.c new file mode 100644 index 0000000..4c1d24a --- /dev/null +++ b/e2sm/lib/uper_encoder.c @@ -0,0 +1,127 @@ +#include +#include +#include + +static int _uper_encode_flush_outp(asn_per_outp_t *po); + +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); +} + +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); +} diff --git a/e2sm/lib/uper_opentype.c b/e2sm/lib/uper_opentype.c new file mode 100644 index 0000000..17ee064 --- /dev/null +++ b/e2sm/lib/uper_opentype.c @@ -0,0 +1,372 @@ +/* + * 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); + +/* + * 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 == NULL)? NULL : 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; /* No one 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 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; +} diff --git a/e2sm/lib/uper_support.c b/e2sm/lib/uper_support.c new file mode 100644 index 0000000..ce8adc5 --- /dev/null +++ b/e2sm/lib/uper_support.c @@ -0,0 +1,311 @@ +/* + * 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, uintmax_t *out_value, int nbits) { + uintmax_t lhalf; /* Lower half of the number*/ + intmax_t 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 = ((uintmax_t)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, uintmax_t 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__imax_range(intmax_t lb, intmax_t ub, uintmax_t *range_r) { + uintmax_t bounds_range; + if((ub < 0) == (lb < 0)) { + bounds_range = ub - lb; + } else if(lb < 0) { + assert(ub >= 0); + bounds_range = 1 + ((uintmax_t)ub + (uintmax_t)-(lb + 1)); + } else { + assert(!"Unreachable"); + return -1; + } + *range_r = bounds_range; + return 0; +} + +int +per_imax_range_rebase(intmax_t v, intmax_t lb, intmax_t ub, uintmax_t *output) { + uintmax_t range; + + assert(lb <= ub); + + if(v < lb || v > ub || per__imax_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) { + uintmax_t rebased = 1 + (uintmax_t)-(v+1) + (uintmax_t)lb; + assert(rebased <= range); /* By construction */ + *output = rebased; + return 0; + } else if(lb < 0) { + uintmax_t rebased = 1 + (uintmax_t)-(lb+1) + (uintmax_t)v; + assert(rebased <= range); /* By construction */ + *output = rebased; + return 0; + } else { + assert(!"Unreachable"); + return -1; + } +} + +int +per_long_range_rebase(long v, intmax_t lb, intmax_t ub, unsigned long *output) { + uintmax_t tmp = *output; + int rc = per_imax_range_rebase((intmax_t)v, lb, ub, &tmp); + *output = tmp; + return rc; +} + +int +per_imax_range_unrebase(uintmax_t inp, intmax_t lb, intmax_t ub, intmax_t *outp) { + uintmax_t range; + + if(per__imax_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 <= INTMAX_MAX) { + *outp = (intmax_t)inp + lb; + } else { + *outp = (lb + INTMAX_MAX + 1) + (intmax_t)((inp - INTMAX_MAX) - 1); + } + + return 0; +} + +int +per_long_range_unrebase(unsigned long inp, intmax_t lb, intmax_t ub, long *outp) { + intmax_t tmp = *outp; + int rc = per_imax_range_unrebase((uintmax_t)inp, lb, ub, &tmp); + *outp = tmp; + return rc; +} diff --git a/e2sm/lib/xer_decoder.c b/e2sm/lib/xer_decoder.c index 5b87703..2a14557 100644 --- a/e2sm/lib/xer_decoder.c +++ b/e2sm/lib/xer_decoder.c @@ -323,7 +323,7 @@ xer_decode_general(const asn_codec_ctx_t *opt_codec_ctx, 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; + const char *pend = (p == NULL)? NULL : p + chunk_size; for(; p < pend; p++) { switch(*p) { diff --git a/e2sm/wrapper.c b/e2sm/wrapper.c index 2cb785d..dbd35aa 100644 --- a/e2sm/wrapper.c +++ b/e2sm/wrapper.c @@ -52,7 +52,7 @@ ranCellUeKpi_t buildRanCellUeKpi(const char *hex_values){ { printf( "[INFO] E2SM KPM RAN Function Description decode successfull rval.code = %d \n",rval.code); - asn_fprint(stdout, &asn_DEF_E2SM_KPM_RANfunction_Description, e2smKpmRanFunctDescrip); + //asn_fprint(stdout, &asn_DEF_E2SM_KPM_RANfunction_Description, e2smKpmRanFunctDescrip); for(int i=0; i< e2smKpmRanFunctDescrip->ric_ReportStyle_List->list.count; i++){ @@ -168,7 +168,7 @@ struct encode_act_Def_result encode_action_Definition(const char *hex_values, in { printf( "[INFO] E2SM KPM RAN Function Description decode successfull rval.code = %d \n",rval.code); - asn_fprint(stdout, &asn_DEF_E2SM_KPM_RANfunction_Description, e2smKpmRanFunctDescrip); + //asn_fprint(stdout, &asn_DEF_E2SM_KPM_RANfunction_Description, e2smKpmRanFunctDescrip); for(int i=0; i< e2smKpmRanFunctDescrip->ric_ReportStyle_List->list.count; i++){ @@ -300,6 +300,7 @@ struct encode_act_Def_result encode_action_Definition(const char *hex_values, in // Don't forget to free the allocated memory when done + /* free(hex_buffer); free(id_format1); @@ -313,6 +314,7 @@ struct encode_act_Def_result encode_action_Definition(const char *hex_values, in for(int i=0; ieventDefinition_formats.present = E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1; - eventTriggerDef->eventDefinition_formats.choice.eventDefinition_Format1 = innerDef; - - // struct E2SM_KPM_EventTriggerDefinition_Format1__policyTest_List *policyTestList = (struct E2SM_KPM_EventTriggerDefinition_Format1__policyTest_List *)calloc(1, sizeof(struct E2SM_KPM_EventTriggerDefinition_Format1__policyTest_List)); - // innerDef->policyTest_List = policyTestList; - - // int index = 0; - // while(index < event_trigger_count) { - // Trigger_ConditionIE_Item *triggerCondition = (Trigger_ConditionIE_Item *)calloc(1, sizeof(Trigger_ConditionIE_Item)); - // assert(triggerCondition != 0); - // triggerCondition->report_Period_IE = RT_periods[index]; - // ASN_SEQUENCE_ADD(&policyTestList->list, triggerCondition); - // index++; - // } - - asn_enc_rval_t encode_result; - encode_result = uper_encode_to_buffer(&asn_DEF_E2SM_KPM_EventTriggerDefinition, NULL, eventTriggerDef, buffer, buf_size); - ASN_STRUCT_FREE(asn_DEF_E2SM_KPM_EventTriggerDefinition, eventTriggerDef); - if(encode_result.encoded == -1) { - fprintf(stderr, "Cannot encode %s: %s\n", encode_result.failed_type->name, strerror(errno)); - return -1; - } else { - return encode_result.encoded; - } -} size_t e2sm_encode_ric_action_definition_format3_by_name(unsigned char *buf, size_t *buf_size, char **id_tmp , size_t measIdcount, long ric_style_type, unsigned long granulPeriod) { E2SM_KPM_ActionDefinition_t *actionDef = (E2SM_KPM_ActionDefinition_t *)calloc(1, sizeof(E2SM_KPM_ActionDefinition_t)); if (!actionDef) { @@ -750,7 +713,7 @@ size_t e2sm_encode_ric_action_definition_format3_by_name(unsigned char *buf, siz else { fprintf(stderr, "successfully\n"); - xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, actionDef); + //xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, actionDef); /* FILE *fp = fopen("sandeep.bin", "wb"); @@ -858,7 +821,7 @@ size_t e2sm_encode_ric_action_definition_format3_by_id(unsigned char *buf, size_ } else { fprintf(stderr, "successfully\n"); - xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, actionDef); + //xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, actionDef); /* FILE *fp = fopen("sandeep.bin", "wb"); @@ -881,6 +844,45 @@ size_t e2sm_encode_ric_action_definition_format3_by_id(unsigned char *buf, size_ return encode_result.encoded; } } +ssize_t e2sm_encode_ric_event_trigger_definition(void *buffer, size_t buf_size, size_t event_trigger_count, long *RT_periods) { + E2SM_KPM_EventTriggerDefinition_t *eventTriggerDef = (E2SM_KPM_EventTriggerDefinition_t *)calloc(1, sizeof(E2SM_KPM_EventTriggerDefinition_t)); + if(!eventTriggerDef) { + fprintf(stderr, "Alloc EventTriggerDefinition failed\n"); + return -1; + } + + E2SM_KPM_EventTriggerDefinition_Format1_t *innerDef = (E2SM_KPM_EventTriggerDefinition_Format1_t *)calloc(1, sizeof(E2SM_KPM_EventTriggerDefinition_Format1_t)); + if(!innerDef) { + fprintf(stderr, "alloc EventTriggerDefinition Format1 failed\n"); + ASN_STRUCT_FREE(asn_DEF_E2SM_KPM_EventTriggerDefinition, eventTriggerDef); + return -1; + } + + eventTriggerDef->eventDefinition_formats.present = E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1; + eventTriggerDef->eventDefinition_formats.choice.eventDefinition_Format1 = innerDef; + + // struct E2SM_KPM_EventTriggerDefinition_Format1__policyTest_List *policyTestList = (struct E2SM_KPM_EventTriggerDefinition_Format1__policyTest_List *)calloc(1, sizeof(struct E2SM_KPM_EventTriggerDefinition_Format1__policyTest_List)); + // innerDef->policyTest_List = policyTestList; + + // int index = 0; + // while(index < event_trigger_count) { + // Trigger_ConditionIE_Item *triggerCondition = (Trigger_ConditionIE_Item *)calloc(1, sizeof(Trigger_ConditionIE_Item)); + // assert(triggerCondition != 0); + // triggerCondition->report_Period_IE = RT_periods[index]; + // ASN_SEQUENCE_ADD(&policyTestList->list, triggerCondition); + // index++; + // } + + asn_enc_rval_t encode_result; + encode_result = uper_encode_to_buffer(&asn_DEF_E2SM_KPM_EventTriggerDefinition, NULL, eventTriggerDef, buffer, buf_size); + ASN_STRUCT_FREE(asn_DEF_E2SM_KPM_EventTriggerDefinition, eventTriggerDef); + if(encode_result.encoded == -1) { + fprintf(stderr, "Cannot encode %s: %s\n", encode_result.failed_type->name, strerror(errno)); + return -1; + } else { + return encode_result.encoded; + } +} /* diff --git a/e2sm/wrapper.h b/e2sm/wrapper.h index 56bd638..94a2057 100644 --- a/e2sm/wrapper.h +++ b/e2sm/wrapper.h @@ -17,7 +17,8 @@ #include #include #include -#include +//#include +#include #include #include #include @@ -64,7 +65,7 @@ #include #include #include -#include +//#include #include #include #include @@ -117,6 +118,8 @@ ssize_t e2sm_encode_ric_event_trigger_definition(void *buffer, size_t buf_size, ranCellUeKpi_t buildRanCellUeKpi(const char *hex_values); +void freeMemorydRanCellUeKpi(ranCellUeKpi_t res); + struct encode_act_Def_result encode_action_Definition(const char *hex_values, int determine); size_t e2sm_encode_ric_action_definition_format1_by_name(unsigned char *buf, size_t *buf_size, const char **id_tmp , size_t measIdcount, long ric_style_type, unsigned long granulPeriod, unsigned char *p, unsigned char *nR); diff --git a/entripoint.sh b/entripoint.sh new file mode 100755 index 0000000..494ec64 --- /dev/null +++ b/entripoint.sh @@ -0,0 +1,3 @@ +#!/bin/bash +./f1apServer & # Start the API server in the background +./kpimon # Run the client application diff --git a/f1ap.tar.gz b/f1ap.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..c3a36767a1790e8b76d289619a001a2dc5c081e5 GIT binary patch literal 2705138 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/O=?lj3=i1rX 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

Z|29Z^f6&7?D`dT-G6zEl9Sm`*-~dP*od?!S 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 =c>jL@=|C30_8-q3 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%0A&0Z4`fxcR52pRwWcjkM29fC{xHrE6W9|2f7&C- zFJ&RLh4qD&6>8uXGZG%`8;C1D{KcQpP(qcL8NzE)6297(Nl5(R`->puK|Li*H3E*m zT&%8_a|i3u*Dg}my__)O!>dAiiBHVV$Qh3bL60^)L%#rx(>?fHZfp??8&MIKf9 z!h&u1&`m#5tn5vX2iTo>&;){;M@DFFSI!>9j7=fTlao4=mq&*HpjG7xLMB8c zo+A~6nZ+n@$+y|iULw_V@85u$g_k!{?1VdiVo9Q~LNThS;&DHl;`1~Hl+-vUE$WqR zy$KgZGW(4FTNJC|LG(c)ET(_|;X&x10bUD2JgAQMvlUhEX43_6e4&~;C3S?4da#w2 z3RSgWEpYbej2Bb%5m;%U0(yjk$EiY3w60zD+8u_fSa{u=&aD+z#YU4c*m&^~B)H~O z16xdB5Yh5LBO#=thA!hsL3>_B70vdZ&vj2W{_&vSm8)n2Wgy{Is?hF$d1RA-JnDdh>v%P zUqY=)BtP~!-UENZOWQlO^@KVJi_3OYc?PN^byj?m_vCPHsn}hYbq{{}g>2^F5#Y|} z)6iBTR2F4Qz<#2_3{*oqO0x1E*rDNx*39EnY3l^3;1I6t7n0GNre4Q? zU*7M%gg*v*5!Mw!%Z=9Qr3F1BQNT{+KbH}VEMXf<7!}}b1MiRbE9{bNkyCZDc0)TN zb={yNK|rF;jPmS^Bz{L!QKo&}z-p5B6XbM^Guo;2811dFy-twE0ERKN45SbiWPU+0t_gVq(e?jN&ySEnsK`jspWFP#kK`J7=Q7Qpl+@ zKZJ-F(OC6008HP-1rQ~iZn`8Z7lx|A9nz~7oBwkmmsQD{6Z}QOOy?a>j02+Ia-7nV zglnTlps^I5wKb9iZA48I`JN=&9x>d1+jximAA1`4z6eQ=%wa^xNsn~JKN^2Z4;pA8 ztlfble#FLsJ_(Fa(>zDhXIySM^v2Q3eCOifSVrLeXOt3`DY6sK?$`AI7S-?sO{g$ zH7%Yro}Izt@Kdfm^qs*+oTZD$>KOV;96E6 z^L3fopWTPBgGw`Z0iA2f`3$zfJX%We>ZCA|GtZUGy!7+{>3{d#yb7b zrm_-s3t1sO{uX>fsdmJjUVd6&-?+%!m;UoD|H*M+kO$Y0dYmQo#OcS67D!J+D+c{D ze9p`cjrT0NG5J(CA6H0}xR9O}K5jh@dL4idBpg?RpXA6HgUcCqxg9tYc#Who!ozfI)SEOFv!Vrv8#a9XedTkABY(#x9nl25AU5C_(+*_9^%{`O z4kL0(FR00O+Ju==nH~QOQMUL9ewGM>A3Wf3t``zhW?Y8jhz$2WYmqRH=>{;wF~>e1 zFe2nzVTURuBWvSV6l@cVVFqHXc(2R^U;z7@RJViC1O=xqrX=}0uHeo1(Aw zLCQTIIDDCHF(oz&BvCoTe}XX`cDlo(5By+l{J^fZW}F;6*cHY60Z$-VK&q|5vPkB%wmHw$Vdx7f3~NhwNpmw$VW^r<3smdi7%C zXS!I%5RV;Sf%QDk$T0Zm^~^o^x>O{UKwk@!%Bds)R49p+1_>q6!Y_fCN{fb1fft12 zN|U@wBr!ae(!ACoGJU~l)W#gsyNRUCO>6I+b^3-~mVOnd#s8;EcGn+a@;p0 z3v<#JF}i>X&r8xWE0mIEKvr2{5viJ02vtkkoFDO}Mxdw>B<$@7kd@|ZM+FoCIchfo#jT7+aNtLqcdWBar;i%>seb&Sy0G1`Xo+thkT)M`@I zK%&a4i}R7|IgM5l*^M>ylia#i>MU#NED|YX4eccoGatj*M)@Q^-2ZEJesXYd=S(K< z_`+STX2(l+UB@r_B3PR{$_{)O;|?aP zJCz@ptb&@g5?&u4npN?xd~KCl-5Oe*f7+;GN4bE8g1}d|6}ez^Wb^A92~5z;M$Zo~ z0K3_1oON~^C1b3?7^9;)pUDV?-*;6?iYwE5Pp3y>vZ6I^P=pJDD7IDBciN;)B{nD15($+*zv8gD|4|10R?XJ8wh|A2I5eI7h^o6(aFKjQLvXz!$gvB76?x2vT!4 zG)H8qn5()M%0)wOWybmy#vzP`((UPgADXzjbDTnB;bs^8A=&@0)oKUhKeSu@Qvb{2 zDbN3W8ewo1#Gms8zD}dv1&Tg~bG!0hPZ7snqZym7<^v>oos8DJ0F-q8)9Hur|2KQ3{GZ2D z%KtwHPkUlkf&6Ib_^5t?qnY}ShO&;n%wI8f8zF9riJt`3H#G2~gQChDOZ*a5 zib;L;lz1w_3sH$yHRr=T>DLWbr?^`cj%`~ydu$#$D1w+suf~MU&C^QBCM0IE5u6#7 zu&x3jgfCKMs`rbZ1 z6tGAqeHaq+;Cq%1j8tUbIHNJbA4mzdgug>7iBKA_4ID=o%YkoRY`oauNwLsx8#pP) z!6oG5sL(=?$qLd>(RMdqE`Fh6Bp9b}M_=5DRY5Ob;uI3-3!aM9wm%#rShnGBCrAad z?J8<>gXVy!H_<=70}Z6QJufX0CXwXNVKi3AH}CeW#tGzyBL955XLTC8-IFSz9vj=) za9D#ocktO-tOf&YKqvbFZMy+Yv%Ega-R5I$k+EK@&I`Z#innA>n$W@t$=9P4pj7iefPNEjiBU4B8$<)?AqWAqk6m6WWlsi1KrS6$U zo{pB_$^T3RxAW;Q_BB&JkMJGm-2j?>p!`q3ZlC@ zppcN5Qq(1yrCPFqYGiQd|-QS>v1a#Lf;bf2F1Q9=nP%@ABg_O8R;wfVa)d)MLbcG$Zv&0+>^G}z0Y@Uq8V_W8?}_vH?M+4kt! z8f{%wn7Tq6YV*KPi~&1quf8DF}=(jE5CHk}_`qtw9u_SMO z{;E;w)6aO7Fbh+@E_ufbcPq4HlMhF) zQ)$uxX?BFSsF@CV&EM`+=&NSadxgGJO=TCkK4pjY;)Ie@ua-ZTUDOIrk;N{GX%h3- zHT$Xw?3z1|B!ivUS8TLtMVQv)_c>yHF&bfae?;!p0(2l}JVwgT&7yugo?bg+$mQ;S zn@tz4&r?WhtrJP6lfNmv!*;sBzZJ6Ig$E*Rq6>c`vxP~9wDD)vs)Juv$UG-$R>?HC z4k?(7)>GGjrS8(*^WHA^7R?6oi7GA~{6*172= zfT1srNBY?(Uzv^H5j;pqJ@H$yT3+#7u@$SWnPizLbDSzCk)rCsVB}1cCKgP~Xe^j^ zYqvy}9Am*qw#U~n~L398iKEiFhczh)d6>A=Kz zP|LoT`Ay3KM0Qa&c4}%&-BpSq6V0W1A!O>p9$-TdVx_3Dd0re9Fb&(yhGcYGJ~+ab z&nL)8N?ny~UU1R0$!?qC&dbN*c`;6$#n^7ju4y)XT!d87C&)wTdmUz|KH`KvlZIM- z*^oSQRub&Vc2lO5{E)1a*z1y&l5fGsS)1)7j;Ail)cdV(($f*VK%BYd4l@{#P4jBH?| z;~U6YR=T>g9yJ++IFO$96n>eLU#5d;AP*pWk8&xJ9l(@ zw+!qVLwA;9&yck#;H%drK|NeIivomqUP1!hP15civc}1n_WfH((#WLPNs>DJ<83Ii z9%I1iC+{omV)qpp>6A4#CBNZaCgQ!qW)nS7;XNn%TN&8LOhNPx6hn^EMwBIq8Ei{& zC(Dm)cUq6s;y0-nT-A%nBe}knCLoWbc+C=bQnLYh{L*O|H)D;s89ovIg=$Ei*!h1_ zF?m8x4#hKuKPZm|fon$PkzQa-%TMd_67w4{8&ACYzCNtVlJcsugGfcCVCPXW zWURl>W8=m(iOmiirFWAxpfMvQguC4&@ZRpD;yszS&|_mcJsQ{Kw1}(Cstm@9s|UB1 z@>QDH*3C5y@(IDM8>QW24ZBC$(AKiE9Wk;snryXmW?4n%BU?wbnnhr1@vs91S2waX zt4E~{No;FU2QzG{RN~npt+uZciAhYQI?temuN(5}oD_9;>8G2Qk48%43SqxOecaxV#IW*lL%jhaS_vFVC07hnC`{@K0QBkZby^bx_fy3 zd;Q>HFm~(5!?Bw|5b*f;-;G|g-3iA3?l#K!-?==`I{tSg&qEOKT;gtL9Sn%|$c7%- zxJNeh$TJ;0?ubC~7reB4sF0qyL;oXp2E{9bKV)L&$Wavh*PA}i{$23wzxmh7nJ?YB z;M|Wr{%`J_@r{tGxs6{og+$HdO-o4AOx|>aB+cZ_j*y|bL+TOpGm}?55%Ugv#S<>? zk}C(OU~5NA%}idlx;-&7GkMuAgWD zc{z}G*~``r%R<~^ue|)pZThAa$V!X{!b?irr|;S=mN~gY-*k93V)_P+m6wfphra7| zSQh0jeY4{wd!{ddMf{gE7&oz7e~H7ac7G#ssC_D6s+Ex9CWq2QC#ODcE2lp0Jd)JM zksVKAZ4)nS#A~5Ztx;7pYG=p#Xxxtq7cvq$8rDz~3dr=pq`{Qys!5b7DXhk+)xD~b zxbqjT=x(KxRGz}6jU+JrVHDwK`gr>Pp*tK6fK}=j$A|71anJmreu^XQULDnsm+rl` zB_Kin?|0jcfd1d_wi>1WpU3m8^?wDPPm>NT`lg!Kkj)#iSwl87l;+}Ea&0y1_Vm4d zaAl)^!@%3ehh{Ic{TghpJS<=1upCWZ{otyOc#y1`Lv`;Q72cSfAN+c3_<|cWQS!hV zJb))j-Frr5-XBk*_?>Ra8#y}DC~QAES>qL|HScMoMno2lHz8DB$NL5^Z%x-5ZNCVG zv5Ik%NG>h¬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

XHW1(O9lNHA4+~4SLLNF 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 z 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�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�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

F;q9i4q~S z`Z39Op3gPe053){J1|zV)V#&x3~Da@-F)*g4O@sqDnc9eQS>G6kB`8}%QwR@tw(}A zfw01tmqO!rr7lDO(6T`Lx0^BHB>3$uKT%3*yZBw?dau4xis%{z;R3~QkgI%=#u`2> zU|axq$9O%Wc-8p)u6Y76*(6A1Ldj$LOJ*ZFLoTAJLj@+>SWs_Xe7b1e!IvG%BW|x7 zQQGhZlJype9&!c&jGEpkU%`gZLSxS&AB^p7O*{GaO*0yer&PQT#;pjjQn1;$lGU2m zCwh|93iQ_IHfT^Oz(ZzRYkh5LRDjJj7_&$<1H}`O&Ww@I?!sE!;Ab9S6ME2j+6!944ndD?o zlIO_(+sEfj7wMN^iXhIj*dix~S_f(36?V9fB0?&pbk4)NCr!w8~&Zi+hmQaq- zP7^a%ef4)Dmi1S0q2fXIDBtFS%K;5EpXm4vFoVR-IejqXkm z0lH8#+Tr9*{3V#z@U@UbHXFhFB5KU@jp-5_jiVNruaM_|b~`(v#u9>Vry9%Bo&J0; z#}FLsd?&M!S+1jDm9@Q=Y*f(4w_+H2gM(7_L9_*4H_+b`hSnY!6rpZj12;Z}v7h>c z)i&3QU7eq9^E$aKI6%j40E7!MFM#j%%?E%?;FJEn9_%=jYNrL4IGhm0azflCs09-R zWarOpOOjTSJbAi%a

6K@w#8Bgqv8FzvP}{-OZo=WTM%!8cpxjUd@z3 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�EZ#wJH#SUf83?&mMl;YccE1h(w$kdbV^DhXnEf;^S z?JmXf>(@=Mja^-lal~DE-;l*)$W=%`;C+m(_Jcbp;>IS|w}$I0#LDjZ%6x7GJ<@<+ zi59C@91ebPn|w(>a3EiGvwF}scg>5s!?qf+ZL4QNBaX68J8P$1mq%ek)>oNn|BEh( z>J(EueyH(CKZGPQ%eS1&jZiaprY@f0cPikESMUf7S5K*{bd`{~Q7#IwWYaqMy1m8+ z1Ww!2DA52Q4}>Ndg|n4r^kV5KqaP?8K>bDZj(8Y7lq8WA66B6w?~lTDd~D54W;-zD zhil}Vs$a7B?h@GEB6lgAn~U)mB*79z4N#U*CSaQEsbj3s*_em|QLeQ{)K?5v@UA^9 zAQ^s<4>GEE*k)#fEkzAjG)2CUCvzPXVg%cyN#kSErj1BUwfU$;g+p`5e+LsQcFG90 zVFzCtSJZJluJRjPR5!D42cj#90D$vXks-L22Q8AS?!>!eNQt>HiZ zCZHZ>2HKuaP^SH4hM50c>1noqwto6KS6m%txeizDN(+o;7qK*_?_3UcmTQ}1>ya@$ z6k!mw&m~1yFart74LqtdtfBvX4oOaYJP2m3HkwoXLA4k<`J&(ll(?#LnOf4NbmLz!sNjrVa?c;Kgpm~q zNq#!C{b)+oe(GNYMzJUzB5?D&6xA!Nk17=E!U1+n>9Mu0H_p zZp@yH`4bK6u3uaE2|;%Hyv?w+4XNp*QTKpTcHl^%CD1r*%L9fNV4WbU^@}{fR2St- zwzSxrk*)zl|}c~CKY zlSR2DJ?auQ$4cB)*(K{uh+0@)ku$j!0~crTHj^>RM2oGMSMYYR^~ScIEpbnG{dnKD z%*+Ie*Q>R@*9T{x^{4=v9Kbs8EuZ0-<`uB>={U!z%=T468{Omwe^w7(v)v-A83kC2w4lljv@~BO%A@hAT?uK-XY-Epg&d3bvt<^hsC zuh{55JE#+YJ4X@wLO>#H`PaXc-!Fia)7J!50Ak|7t2l@PD{H)T5#pDS5YsGrJa`OS zx%4AmHlKCEvZlQ$y0#g0ec8|Cg78(nM(T?tg=4(+MuV@v(#M0tb-yQMk{UI57FX2k zDjcdcZ532oB_njD6aG2@$)*9v%49!tM{7-_V-qqhe#?Dfnma{3BB=EhxzVDYn?4V+^#@)Z? zHamc6GD^BtkW_(_#c${*6>|DUHS^T>>tYVT7h?e znJa4Cnqp!OXwQ+`M6Bt)Yhq}fvSOfjX{_ZB5|G!Bvrdfv#=^_j_*>;mBYKx@kgV*d zK4usX6csOFfuf>71W;7msEq=OiUkrtQ88WFL@7Oep}5YhawlfL94IQ*eXDZDC}&@% zzXh(d)QAvE1G~EAY!?AS1c_Hr&+yeezv)4%|H~ZM7jowXg0S6zKSKrpgPUpQE}4Bc zwL6r8$mCAbX7uwl*x$``n_!)Lpi*j|Pxb7mUAw-~5PWm3Qi>8#7z~J%s3qQ9bWAue zmOy|4m5n8LnjLiLOxREde{L-EnwlF9is?C70E!l)S!#reZ`Kb`0_&XxR3 z^UrKg0o7WZtR_~F59gKHi{XHer~7-6<{g@Wt0g}$euFw1gu%f<9!K+?ersK4)0;?T ztW3%$1I4WPp2YlxWj-xO@1*6z-l;U3ry<)!0K-Pon<2SGMPfyqXa|oQtQ@!tH@o+w z+^K9;cj2(_(w`-$ZV+T8zEp^raL~w3QjHd0N2ba)x`5aCot;RKVdO;Bh%tYfBY#?h zwWFV%%Gp zV{f0YZrBJcuKN&(0kLWzSH;N9jY0%?WitpbDcNkFdk+)ua+N|s@m%ftN$6#KXQd7( zN*{~@t)2f9%{2V}Bbsp+9RE)=LxR#ZHkg+OeI|M)x-heZd$)c!PJAESx4)Sjpm`>O zo!<1avD-#EV)JGBK2_wnZGX2ENG~aDgz$dD^}g5kS+lPN5IKzpRDgYeMhTN=6@9I| zYzLx2!4?h>22@`w5Ov~w1D8>Jb4L)K>#3YxTH3e?BLE{X(W#s`(wDHLLOT^uCcD zUJ3Ds)rfhAFD{dAH2%ZG*;47qOQ24*nBMmqloLpfdspVzGWzr!kc@weoYk%E@^X87 z+JDYw>mIUxfQPBLy?c2(y4%2q`_u_uD7g-k3YK2>^m)RdpvIa0a1IG{_HX7|*T#hs z#X}9KAQ4SQY0=yL52LPF5#r|BP>-OH_*G6MK+|a6XvT)ShFc-!vB7a}P~RE8hkWe% z%M8r2@f?Prj%|>aAFkPEXgBMCmtAtdelTV@PY}54B)#C+;Q9UW1)m_w>^kyY{MA@o zudh zF8ohy0nzn^@r8(l*C`J5J6=+XLbL$56{hix2th7boEz2X0*Kkm4p{^2FyNEz)i5bX zejj`2qMI!MB6eSFITxHAPN@kOZfgFUN5)O@`rVxu;NoI|)Eb+)BBDQ1PISnu=F8EI zq!w>)9qerjGR{jseuhbq^bO`S4DOS}p|QkZ5gc}!X_p`o*&(3L&Vbi$DT;am2J7M2 zII!75eU_#d507RUf!^EkZZjWU*v9kk#9wk4$~R$R__L-^gns@nGYD=$tj(_=NSBOM zR3nA=k&Fdhru)uwzRX9VQZf58gam1>b_l=Y@`wz6La>i5xSq_OP>mWPMe^qDA8aDb zJoMgQLn?>vKI5@>f%M|OQKznRTw#~7tj!yJ5w`wa_dbKqW=6|X9&NgU}muNd$HRsQM^Ys8!tAd{L98*aX-so`ArUo`~{yx(MF)@^Hxdp-d{Q{K zCY1l)&#AJ@BU+Ij`Q=-`yWRawRkJb7bnBWc9`un5HFD*>W#tq z2`FNg?I8WZPe1lzU#cJSCq4!U6^%kZ2AU^Ee}UI;;~aGf3-m2Up>c)K5E;WV_M5@+ zw{72bY3*vhya^ffxCnJ<5BB!%9ffrVm5{YS=e2>po+QE%1zqts{@x`-X*Oxs6Vl^# zJ3y(3ayo`O9Gno5@H9?p_Q6aNcrT-hDZ(^NkFEFlQ9NX7#-IJpWRuJ`;4d1p6Lfa| z*llQP`E`z)a+#%Rr81iHR}U)^Er35!rR`H%TbegCU^_Xf?dR1!hX%YK^O1ki#T7Ji zf)GAtzGU^@S|3hKRu@LF-)$5~=(rASZ%s;7ak*GG^R7w{G6v$tVQ}C{C2np7bLZWeTXjv5EvZ5_ghfk%B{XA&!b& zx$1Fs1)HEP*RXX1!4!$3h7H4{Xg81iBz_Kz7vq%`k3W|Hmbgs$o&B^h29G*&@tC?@ zbp81jMQ;!)Y(<=6_}Z!mz_EotCKzxcP>4ytcO(W9Nv+`A!T@}4xr_I}K_eOlQ-Ov$ zdF-Yogor?G(pEVxVNxFNMInIr08!tpe}ugzndO}qEJg&hT>J;0R%X{&lrF+b=GwiVL&+%r+C#IH1&HVo^(Y4-K0pjDU555WR&Bw{2E8Mk`TH$}pr zdi=XM45Mq0g1&m`0Mzo=oeTt=U#o`KVGNDJ}exh_fzJPli7FUV&I z+u=8<28GbpgD=2wl!9U$4$&rqY|_AJcF@~O2hAbr@ijqm$~f6W>K`|NFT?QOpKq*j3wwX4qFdB&`-m@`_FReqhK}?>qRNSCwzh` zg5&Ar8#&iukIJ6l#JFZcDlI6Us0?3QPL`xGa37@pV>mppX19{ zMnqfpW!tl_*e^VuI_Z4SUZiExU$`zu_t-areo-&EdFmtJF-cHOeSdBOYdDOOV1I*g zg#J32@uca`LkU-Sv?z;1`OFOo?Q(U!&zvqav0)5VpNcG&F(x?VFNr4^Gu-@;=+VL1 zp1^#2A5+R4Lq(!$2_aA=A~0NAwhT1QG;$PoV#wb~@ah>MRs;>MqpNJE{;d zTLR6%pJ8&DTD+}i@SymOda}%t{8Q+IAH3zn|E1&4{$w5@(Ja`zSUmTKj$C*_OzZ#$ zd4LzNT3B-dkbv6zB9P4pY@a$rCKM5Tk{pGW&|}N1uk%daCyo~yhfQzDkg>eB*pB!0w|NbXJGV zOAl)ejllD&Bg`@l^YfzM`BtjQur`4K)n_|@I`6a_ZRc+-OikpU#BYnm(La|DXRVnT zUqHl(=g4DpCZoX8O#ezaK}t~x?C;HdAGjHoa{OVW-rwZ{(n?LFrAYDqy4SfzVItG26ct<%9@{fC&CHEO7<8a=A}jGTO7O4Tuj?ym0XRrMqr1%?)t# zx6>|}$dEQo`PvzWc^cb@DHT>`Pc{z6W}H$hgXSto11~+?Mt{T&Qs~)<^38~`KRl$V zuyv;cgtojy=22@n`NkQF&8K2>|0aJVo^#j%;ZOr(TK~yik%LAvyp(E;mUQrKK8#wD zLS8NcQ{X|{zO2Zvt0bKC0`|LpozT}@3&cIH5w0Zq4(^e|JFgy!%EkcbS+@MipXwbu zl&3|hN#vdCcWC|h&ezC*V~Yk?wG|#uIK!bSZ=anp#=C2R)h|fQb>>E)KV^DYLNBz* zRWy#x{+QhqK5|@^1HLCWatOn1h@DT@eQZyWkv#L-im*8jahd9&*u#Rspe0CNF~6jX zF;1#Qec2_fTMlw|-P~}ciQdT89Wy{*Yze{sOsU%8-D7QuypccfZGYr;w>8|x1w&Ho z46)@>7@Ro3V7Q74hneGxi{)IpI-FCUft8wI>gRsalpy=QA4ACuI(6ur(Gy5ZX7hy| zuqShC(u=!Ay>X!D6)vhq?4ggCDWzLHZM1*Uc9w>obr$5#ql8|rk(sf#wrt7J1M_cN2)!sQ`oP5#2B>n|4+3Dce2v?`PZhWZWK$V<4ouy>Hk9KMY0Kz|2xbq!5YkXr4_ zi2V@7VxkFP@g^Mi`dB^ojSl>Z;?Di#e;;`n`_n8GfJ(|cGMdzErLe;|5i`c4fY)0| z+*5ZO+xXhMo$vWfq3@fu$6NQZaC6Gk?RtMJeF3cb4G|C;zB$Y=yAX)eTA$7sKbG=v~cQx~5+g+jT`IlKt<#O-b;~R`_T^4dBTHX(k zcepgaP9CwS2|K*4Q=fszH(}lPR-?VWsjcjzNS9Rxz6KFR5N8-R_Y}Hh>n{h3Vr}f{?cy` zIzF8t@V7vfjPX9^T^R4cqk7HKF<~BBmoyB%>x~4x`rI8e9vq32g?WorYOTH=j@^d2 zmlS$*pv<~E5)0u#uGYKQzaLVP8j}((HohBj*ki0VlqXa_pU<`2By}f{pdoH66d8HH zCG=#kJm%ITddb*4*u{-z;BLX^0}bnNzxGhUqLfFQnzfqC{xSmGFr_o}3$yX-?Yljg zf2@M)xNvtBfl#CLJ!_Qhek zS*g^5ixM^Q^Bg->gNYncux-#^VvoQjDJ3%ws)ntQj}qz8&Apm495jdFa`Owz>#yGD zJb3iF71Fk|#)1uCnE;k=4!T3@>Hntvpk^D7B{Nr5=ts=c_74q18Bp`h}8 z_6%|>>g!YId>n8*vwaDctV8`~*7lx1_P*`EZSao$$*r zQCA-1hXIrw*g`l@f;xcINhRV-;P$Nm*v}xoCne?s%*OpeN3%-`{kJh5;v%j$qtNZCe6h+7yp?{yRB5>v%>C$A_i%ju4 z8aaeW^qY;-FZqsZ;`wFF=by8Y{&F(N5h%TsgDiG^WjiT9IvfIWYw35NP;BJ%S5xAGE!!aF4 zDuZ#&v9J#T{eOnO@E5VYSDCJv8@h)_qG)Zu(YI(NIe--D#!aK4cy(l(6{YHEDe=+0 z9*MP|dYYh4=B9Px?l6Eak4R5p(Flv+&e=NcDze@8jmi96h$_-es~%~ePRzcqy1l1* z^>FsKF*J6dGhHY=gR9NHb=`?@xpB742}=@rcx#5~3J_6Yw)xtPtjhD4$$?UpGZ$tF z0O7zb=7e(G3ak7byN3RVd2|E@lYM&%fk|@}KQ)aP2Wae#RMm&jy&Jo2|xC_lhn)W?1Gq3|WyjUajj*I0z#IOgOtma(m`A+m` zb{n_&l?_HaF)fn^-_TY7#fEzFMj$SH?J9yk`hSRe$KXiAt!+EjBoo`VZQHhunb@{% z+s4FpCf3B6*tYxY+56qkSJhShr~h>I-B+!(u5})VJDC-jJ~%i3AZ3t$(yiF$6pRQm zAE{2nO`xjyTAP4N|0jsT;6c3Ha_z?20GmA^ac(_Ucmb#ZEFx}lSLID;^Z%lQh-PzxMa zf?JB>ak4=gx#7Ht{&X-nfvz$jWB929&uCR*j*SDR3ao)r7<#_oSMWz*G5kc)6 zmXY?+S@z$`dzZ*I5!L&V3Ic~ub4iB4t%wPIEN#GrnpPAQMK%+`z!|cbGD{-ZYi$*~ zo4>;A_K+TK%%I--IwhskC@vzIGo!O-2)hndsJ^zfOC*AJT z(bPT5i3+++Pp8rfW_D%GWcu0ywc!&qjjtVK_7m4|C<#{R0{W?BC?)rK+9Ck{INhij zuA+2-m_?>BUWNBd`wv%ON~>iy#Da=5!>dg$fRSGdK7hkTQo^0*($5{(&w{np7N|t> z_83Jo3G|yoAW@YY1`Z_@sZF=Px%ik9?g?!UfsC+SkrjjKhE}dreWXA0>GXa(Xpd^+Cbr+fd)6%_KYGGH+lPux~Z_KrZh?;h z2nBT|mXWvmG_H-pjNXG_s35wZaRS%x_pP^Ddl_9)#I-Qz3;lQhFVIIo1biTq5ff&> z?O$IoalSN6cbq#r^A(RDN{p;IQ#3Q%Ob4B09lhk;+Y&!l@7@argI^@H=-aTLkv+SUKpc()UW;$ zM{}6Z9#4OZs~3^ql2J+VDHdiJK||KRHmoi)YJs7-X4Q3nApQE}qh2|u+}hCf?xZ22 z(_=iAlqO#2?N*A>fWUtLW=;UuLpi(p92^CiQ+FEtSdzxbgtIxPjlH~7sE(p3A-vYe z?vkw8g*9VTWYbHbvY)XQEBai#-!I0Y_(rDjJqL~hvqi5Ur4iiFU8_=I@`X5yz9QA&7*XMeJsoTMs9BkuDA_CwUT&@ui4h|w>1|1DnHKy(-+nS((xAcDaB=leG>fQ7 z7<^<>NyMI6*u1)Y=8)2!`|cZ)oyrtv} zl6@if=VHfw#A6G~w78ck>=DVev;p_-h64|G1`R`TjvaAP={10UI@$J6%|!NoN?W3gd$p#?%o)rH(GZ(LiIa*!tRvr4p>zITfu3>(@KjHJ z4x1!kr1_&foMTOan0usdv5HlMVBE*`)- zc-DSDJ}rK(a86@N4&BR{nX8S@U{Nl84o_KYBLNZ4lEJ@K!k9BJvL-O_Q>0;8Z_o{* z^|58QqgI~-zP|he-XJY7zL#6+gx?^7>h)R9;D}Z(tKaC*ARDYj8!t~>6^W0 zwjc3K1bkK76Z$p}b#U8l0n-m4Cf0;pU6Miv0RnjxlO_%woKp?iMn#qGdD1I=YYnfn z)AE0(6P)u0t16x^lLh~FS3>4iIEWOS%!aL1CN=PYKflp3Z(i=cN7T*rQHrD&TgaVV zC@RF_Ycm>xzkA&sA^1Snyh}oA&aQ5->Zp5h9}TOLI+scn_8${oc`3wnZp0#5@ntM& zoibo_s=oQ9RGmHwmUXhBppj!i6Rh%c6oNJzxCgl({S1%eN4?O+>HOpFSmtp{T1HI~ z(=Zi?n_uTA*jqPMMdUv75h74w&bdZ6hXNc(T(o>yxAFo)z;V8Qd^XQ-2fF9V8!e}Q3)nSdBTen>nQfB6IH!l(t|iTOs#$`460t^8%Yr@2DAT0)5X$wRDMqI= z4^8xt=S|dhD|{o#J^B8ssCIm%z?RgC(ohK}DxNzvN>jrz;tJI?&@#@m=M}cnB7B_nh6LNYACZElT{!FSP(20%$;b( zy>X_@V0P7`;;fmH3-dIoqYi?x!w>R)>UEE7VgF_0K>hPVZT#v_ak(Rik_G^f(*c~# z40Nw3M12BL9m^+34>g`0?-+~;0jH^w_M=%}fTZ=*vvba0Z%_Fw?0df{9b-d?{`$U8 z^6o+qbC2>5$j9*t4|y)Uz7iP(<6C1sw|raLIEl=AGVyE6F8`3u;|o!`D@hfLMx*n@ zZXBHm-G0yXCY^tM2Gb$+EG;9LWc}80z7P;zwvRzopFGOi}yd<#g`p1*XgA#*dE)wzg>wP0}4?*n}Q;a_nDpXf7wO$p++0Ro;(E zdU?z#5tV*}nOUeg#d5+O&jd#B!dA8nw zBKS`L`PKZ|=BeS5pj%(Ao{sE2pfT$QYYo7j-CgDr!1AAL`iSQPpiotWg*u5y-oqah zcd!}9sEB#nqf>Y2uDMZoVcFj`<|n`~Kwa#Yhl|f%*H6SgXs5YqJUE|mJ2-8y@F0!x ze4(Fl@ehMjw~3y_M;^PnD|m!C@v-fWVwbl~NhHl}E^fn59@I!WPcL8~i)~}|+xX>D z_BkN;C>({T26-Jnm3g=5tVrXb9ws-qzQF!%ig-Av_c@gr29#YX=3cQk$el37UGZyk z2WH&+kJ*G?0`MnUChz}2#RLHAT#EdGTS-`CMw_^Z@msn;a}u&l1(BSPa7P#AgOQ|n zLt}Wu{_$&ha`UHQeFPNgMQJ%uo*@?&Px}5)LF0hI|KZ~2`|-~11c@-C-l7mM!1$f4 zZ1*(Cs4pXFiIZ&+r*JM$@N{Ht%=x_qF(3N=y42JfYD`71?(G!$o^iVK#XT69?a=sO zvUr`goAd|U`tS<pa5=mEdV!9(5~C*@x# z3^`1Lfq?WYgv(6eym|lg z99nX0N)*;hd@VSHHL5r810)d;p>g;>KT7 zqIZhG3tgRYzm?F7KJ$dvUISRo+dkK>FEmza(}|LpMFkn2Z7B$x(W6S{=gO-DFVfvu zKa2#=9+9KT5|jqzs>eef{^$1Vw9B$t}+;JD*VO6iPN=A4<%Ki z$9>87pGqNP&Q*We7*heWD&iz<&^er8 zj!#xo(UQZ?(_3m}Z&Jfzm!u5c&kx*nV!_)5^)HJ8+vO|YoC)p*9$DrZLl9T9K2N3y zM?HR_104CkOJiv~72kyPIY0s5a#XyVUjQ)(1z>0V2XUVjYw|PzH-2Marh)R1rPksZ6zrrWHzZUF6V{~B6Rxt0nxHJHLGLD^f#5yx2$NKQ<-tgtz z`k^J?OJz?(DrIks#0OW zff#|K`nPA@)Bnr}U4#cj0aPnQSTh9B&fX$L ziRr6J1iELrNWCq%vvBGJokP4tbaQd?^h@Ne2a>u|mZ3D7l*i<82l1qe&nFYSE{r5= zc8(k83gzHb+}SSPek?d$m2rQ&&a`?qnM_5VC{=%=tf6W}Ve!biiZgttEgX6XsJ;u8f~ipFs*&B#fY zJ!bb%0V|nuHH9BJM22I>%EMuDFCkz$z)r@100VY}c>_(pR+E7|8l3KoJk&+DMus_Up_$ zb1dUtr`m2wh;_RyqtA$Z9L*UwN9w+PphXkGZAI8}ZWAWkg9%(BIn4fAo{;!atiQ4P z@v#BOxRg($AAZ_u%dxslUwN_vI0sB<9 zR*~_bzTpc=TGMjMJL$V(tw#4&HMHHIK#TuIvsUpsf~oJ8C$i8eQd_4Pt>46?eHmzl|)@hy)+cNLx`=k304 zF6W!E<=@eQupjo5x;ns)7KQB<@B}g_soU0;+t9#RT=c)lm&Ro6@-`}`G+6u_EPri+T7rR_056ml^pzx`C&p*Fl?T8}< z9K897BUs?-BxCf%6w@(u&J`J?j1rQ`H1FWV;V{(Va=i}8?6jb4cfnGSL@F!Qe#9v- z;YwRrss25NEw16K_>KG{p~9{Y1=V5aPh1vEHNyoN|A}WPvSi!z4l?3+*DKdP;tPhS z>D@7}ulem5ukZ36qWhaoy5RaoORW#0qo2_x@*ZN0iW{Ej4GcvBgrX5%sy7JdTDHc? zRQTzwg3p`x3h&juVBzb0qpe<0vvy}YtfKj;-e}$!{?@&RW$cWpU;D#X(WvyM-lz1` z(2qMyrsn}(AJJ;k8rpte=nAv_T^8F4Nz&6)3BeH2cCVt!21Y_R-Lh zWtLy5y|kPQWZ*RC$fQmM*FG8rtY0}B4Nu~EfBk`1oO%9@kBmS%> zl7?nFJ$j&)N@ey>2U1n$#w8n(w5n0kFI&rc?iAaz#|RHUtrHiG?{vgrWqhB(Q&QX; z&Ve{CfF*A7bR^G?oB`6!CkSFLbi1$7f}QcdA8#w=@P6qN9wQ~(AXMM+O?eSC!PX*5 zxHg5M3^%kO?;m`)K*+m=2V;A>@_V?LAemC)GIzR!h2R-09&Jbzi$&2%5$gzkQni?r zNTK+-wawi$)8GGyB*2~{wSLhqWJrqV-KZ?=JE*gG&^C4+3C~S+&6ez53wWCX8rUe# zYP9x?7K?}=YFA8@eEwKZqk1J~!~7bJG~|)@+(Yqd3C)VSndL$7va6quV>@A$8vg9(q#_vyej;RPbsA4gs~r>#IaK^myf9>BER-s&!RebwN88&# z@FANt0egF81kRK~rJQlFI1_VM1=R}(bKGwMDiR3V6U!x@Dk{1r(JHHEF02MP9C})7 zW27`k|5Hyw+-FTY+lQxOnw|QnvXn%>mCM^bz$V`HtOdAH-alE23um6d5e66)1HiNz z2rl2ScKQ9G2wb~$`5?resh7o&g7pbK2ugVv$v~gb9IU769We`6i)Z}ZQ85{<6`X;M zcFzb@12r-M)j%vPDT&mqQWiel_x}FfhKM9aKP&$kceDNpch4@^fX3bbl;V(FgfU<4 zZXW9S@#lSmf?~!T4==$NmBfY4ysMrlmNQnDS@V!bgRel}PBgW#DvF15S;NL$d<=jAcy5e6mN|CVL-Bf zr0LebQ1Q6Cr@zlha_W~9lvUBz0& z%odevROyv@q_BH`Uvg_SY7-TMFn>y=B$HJk-`a)}OLo>5{YJ7@PIMCPH5{Qq;>Oci zj~6kbbtT9e#Z5F*UYuB_qQqfTV7yZy5CjYzsv~z0-bBs=S~hr*KNY*Q*Zu!R1U?lZ zj)T|pTY#4J=17Lqu(Llg*xkmOSj^5p8#P_(gK|?Bv@z0k?HSIw(qVIcka8u6naoxU zMLM_qNFjMw!T&MTLPpeZ-nkNns~u!pTQI4&X%n1HQ(BO>ZOp<)m)dMrQ8TB^(zG0^ zkkm9$(*YXvfJYYEPKH@FU6e~Idea`4Sh%u8t#YGsh(tZ=5y)E7UNASU)C2^MCZNDP z;1S)2Ri)&*;uDf~XSa=|D8!?5Has~sQv!TLl5OVBXO1NGj-F&Kfj`sCE*AD_N3sgV zKjk#9h0<3uPHvp~e?)7E0EW1qbN;?@8{$+jcaVRiNtV_jsmOnq3g%KINrmuSF2}%{ zZU_%DXoz&*@HBBx^xGI@9HMv2C4sgDp>zmMZQAbY-op1WU}1-XiT9~k^vNYPXbpd(}8;$Ovdqh{X^qMXU@qcdDm?&G?N}( z39`<2T@A84Nek*sYK92-Q#l6>x7SU`;EA0pMH0(PeDZgt?OxM!-&^AxVY#MI!0wCg)i0(;&;OC zlmEvpO9O~;)#JaDW>rvWf5hWCpC-w12Mu^6enMhfV28JU$98eVx?Ae7hQgG||5iiZ z3rcbSFP{iv#GN7TnPI!Ju`$a~Txa$6;$s)6=bbTWqVH@2=o+ z61yS00c*urz3V>_Jk|ch`?V6Ll*_@E5=QPnN$?-;*|F0Nx7SYbh$MNBWtYUNuvBVrf9fPe9i^__-rAs zr2|aC15AmU^)98VI3SfB7wcaxBxp9JThuX@O*|x~Sv7WZ?GmrEe~rtzi?^{-&8f-( zU$+W zFaM&`a+`O^c1;Zum~Ew2bJ8fe)o-%FlA>n zrKRTPEy<^o?78Bg;6%TY2CBQojc|Fs!70#8_8rX|uFfCsO*6|m?`VI*zb}t)DgNhK zx#TM}NMtj>W!)GcSiSX+4+2De-Q~yMQ#}%Mhj2d4$NG8=&yUMUQ4;Ks8_d45k52nw zBfgEEubBymKMHdH>`I1RN$>@3Jp_JiW7m5-e{{L)n*M6ou{`!h??7D7nhY1g6sy&V z?5;D>yf*lO#1QQee6#=mSbW4ke(cN}5gO!Qbm~L6jUB zujrr5e_xhYG1;!a-hEhs-w@yqWgQ*un-L;tx}_&jM?C^{|8QTJ)xbo}+1*=s}d&pITiv;qL|*xwyGcwbka%C^Y+y29V)+xC8S{ z!He&9Qy4u2^Hq!csjl<=1mhE#W-bD5SZKT~vDe{cS3&esRq7bKTNEjW?zY`NGxW&G z3;7{mBDN*U?#mY8svHiYn$u&b3px>pg8p?6r2?|LC-*v*MS1Q}NT7^2lj!H&TTR5^ z%rrxxvJqm%<3b~MIwh?1)b!9G3o>TPW`?ZXbO-^JrHsh3g)@rRKV=mm)eDFYZvp8u z2@#QfJf=ujP(96#jP-m*HeY>fHf^=zpZUO`qAf7Va|9^m$|ob(QHc=;w(YsoQuzsZ z1FzgU?z1~vcx8dt8VzyL!{|DCM&!i)>T$&DBhWm|kQ}${W3eQ~D51&$@QWOPM z^>GA$MR-J>m*TOvE4|$rIyT_I)$m--|NcABvBKc{~QWskbM##OKFD zw$5sb!+22j>o93F5x5-a7lJcUZfbgj4Dr`GNA@gXddsLDiK>YioWoA*n%7fC3G>cz ztc3K3_=p|(@qiU1pTu9_KMF9G8TY>LSv=7ZbMc3O3{ed7W;g zpA~J5%<%l?*NiXuAGuRZgmCrc5b^2Uss)nCVkd4Kf3;X1o?}V5LYab=sUlBsnSd6S zOxb0YkE~3EX0R?VN)7U5^^QggZXwUctl|aUKvPsDxBJ^fUdCJT>qK5^dAh_E>WQIY zKbUeuO#k4vSF5h9w)coXNJC}KKngWuBgvk~l>(*|QzYi}H z@_@aS@z`|tpujSdI%`Xz=t}&Nm`2Kr9SKWMylFMJ%7ia8ANB#z3TPYieC*7%uP%iK z?iUP)!ngMmW^o${2@MejgKKc$6%0TBx6i}DyHVgw{bBOxv6t(x)-M+?%RFPynSo(N zEU4#955heDM^Dr&8i(-@>c&EU=C@8*{?Vk}>Fp>z6%&UKN1ns`za{WPBP6E$_ z&V${YMj^(o&4&&{STp1-&SMoP++*_VW4Jx~h9pHI?06*ThkUROb*yo3xDY9AhAW9Ml!^S!+_(R0}2 z2>5%bq_#i*qT*@bXAIFE*Sv3K>Tr(T-*&J9fD7!S#{P=_$XpCxw&jheGk`hkl;{6k zcE9)C0x^cg14)HzQHA{Zs|}f9IucO`JPad>WqkI0A8oL>uf}|k1{4Wwy^w|y`=0za z?3m?c9v+9-2fkKd3Vp&t&NBpri1kbbc1`BeJ7}qPUwMWNYcIE$C|(?`x)gRJc}iku z3pAy>45hr-%ARs46|F&mC9W$Ag3lTZ_diPc8uEjHb}(^6+1Ypcz?CQQ)XChQiGxs=Co3^G#{&|y6x!xcNoE7 z$388>srZ`og`4z|(qvzp0Kc&$K_<^qxDuz4ceo-+gId!bT4>zUYf#4Xg9`K8Qnp@w_}c`SV?(Ss)qUI@TWmR(b+W!w)ez%B?*-@d zq|riX5D)lw(X}I1MaVO>TjR%(G3}fTw)Y{3JMHk54%E4+-T{EcEHEqE|5^ac zq*LGrtY#b4w&`%se^cnMt)^1!OK_$CPc)G2U^PUP55k&m*X?DOK^0<)%guK*u;#L# z6kcX)j+e6;L6?!2fWO8{o4814LxocP%%2=*35D_y!ey}T$Fk~2c0|A&&!82M;)ZLJ z+}6q4kgQ|k*mbh8$F}b}LY_Uw0;#YdF^bs(9DO1YC)r7LqR=4*jzrMoEgX9-3*I?PkBDfw zG*0=P66(l%hy?G{5ILKOYV%8&#M4nzkEp0~$=ncxY?KR=u??{kLTZgP%d8SIOWhPR z8w|WEI3zbu5m;2Oibp8ivy9p`5UjmW9r2u}^_TQYS9T?tmakN>qD;^#V{yd^8r}XQ zmD#_PvjnUOC)azzmUlawE*g@%~l1hllchJsss^vct71R(L3DaRZ`cjaw0v4b+y( z1}mU?(g~y7)#SYbjfNE_wGcA-1RG_4AVjGHq9Q^0`9O6U1((H0)Mf2X1m-QCu+oP+ zt76fV*Ck`UY`Md#O_pvVfZT=tGh+%xKSgJeR3O4hQYIm9w7?ieSuyoDKtfIUB#3moxf?^O`M25Glo6+fZ>XfW_K=7E54Ce|J$C-#xkVo4K8~~9 zaqCqjqs0dd6tHQ$FtNWCvk4c`)tp7u7u=i!P|jCZLSzF}E@nijuxDtw)cHnwN>NtO zBLCGVc<)njpQoyh*Fu;GC2GQ)Sfq9CM`SwClP4r$(Wzq|oce!PsQ-Z!q%iCMt1qy< zQw$JqQEnafDd>g+l#r_sQ~_bhioJ@`y%93?Hd+YIV_eR?SpL`F1;Lg50Ol_*hB;tX zh>Y|&??Z*cXH)PcfJH`y{O&%NH}F-a;0;LSLw8BvC4^na)zUY>)e^JNgFoJs@(8Q$ z=GV6hk|Q{Qb{>|n24o4=u^x;GG}>#&eWWB9UXy=Wf>I5x&{%clFW$_BH$DFOD_$WM9rTchtT`4!J*J6YEUcxD>WSWVJ1AmbH?P|>SQni#2`(hq zX8DCx&SsI#Z@?etI>@<*^I&CE2g_Pl&aM!~*={`jlh`q$L>r(*Rl)w};pR6Z30?uGXW=Xv@Iy8w_+w$E-S z32;~9^B28?5FqaKSi@g%O1lkO*)x$V zijmORHvtTq_+`oflR&FAN!6}n`0yJJi?!^vw9gNeYl6-f9R}a9QXt>5-K_tY881%R zmU5e>UE2HP=e<+DrH);b)Ebp{QZ*^I^YoZGhQIFKAc}n)jM=xZrwC~(@oI|}_WDGa zb=ohQ$o56P?r%jkZWz$ukfv!1iveus`S(1v<1Eqdl3@z8O*MNV7^iGR58ugjTfduMW#@5`A~LQ~WvRY=4H$a^bMwrnao z$UQQo^faBlB;~?;wCqk?Ep^LiV7i_?68B!QQrt&B_)^_NbF5Ns6$azW0ewKyOxXU~ z#X^U3z|c9jX0SI~>#-3;L=RvQ=H1_A$Gj3?2pn5J0$6eow?I01U~JywXU;IwHLJT{ zNkKneH$SDB`!Sv0B{?`@uK-e6H})X<_-H=o$7cmEAV~e(eyfJ=m$Jwc%*-!!HI1DnK zlIm^lC8=o7?qse9oF01##@g;4W&x_9sRy+4I@G=V+1bFr>)r3ueGQUUKi4+T61iW0 zeDknK8b@s?6#>rw!$B{DSnj_I*Yol*pF7CJBQ1{=KQI(JzUAZ7q5(#1*mx}}0own* zs-PEFzM|G@wyEx1I{t+$%@AktMUO@>`~KHQzd-lEl_TUHzb^~iQ(ssY?b;i>9Y3AH z=S|sn51BSau>5?86UP(~ewHdwKLmHpB1wq{t_2~)!0H4FuNuXjHI4EmB)Uaksq5}N z{wN%Xd6(javtNeY;fWl0o)tnQ4}8%gWKHj^ClV^$$0zc+BFaU}0aD;a(mi4Z{1bn4 z6(Y4SHyZmRD~9>IB!PQ?>4RXcMm6#+z`9lDbCxB~ z1PEO3PbYeh^I%YexCKt&Ny*kAE5MSf-G)<>HV@F-0-*3$tZ*oO%+)p={%CJAY;>Qn z$yU-%h8p;Tq8>t|7O36sC3Nq{+#z;2@6LwR#SjNd601enMwGy;)uBcrFyE^<-!qNs ziekH8-+skSBC1L3cQ8BU^e&crSXdlCjTo^$8GIz(+}|m}K^a80D97n*>kUs=afW74 zY7Ui*gkZv1PFUDBtu=}M+3=+4)sYwfv&yIYvVRNcLs?#0e#Vx<@~}5~lNx+PzXsU1 z^2SPiA*u6Ae?VgrRzZA!&fP7xwkq2uR^&X_SYK!&&O`?^{k|Y@Sk}Exln7U-e&+}d+wSWT zi~O6WMq^rts5_3+Kksv}-O$YZ3feFyQ8_SO@VPp>WVqY#?@%ZN!6a}-mfR1VktxjX z*8gutHeQi^vkyH8Qt~>UY1%TEDC$u;55}!=(7-o3!QUKM+xUDbdQHXM@$oSKwNbuU z42Lc58=nJzH78Xg1y5$Vons8ce|HZ=Us`YFsGlYj-hZ=<@(3Kld4P38I{FTR9RmU$ zB-FkW-R!B^J;Cy!?r=;v_AM6FKFz4^vlXFpFw^3Fta|ghk}7etb!kOy+&A|B%6}sH ze!Tj(GdRwN3|zX2@H%%~ahLg01jAcFx-}R3&Jc^A=9t<}!<8O`uXc_!hjaPV3XZB2 z8WYkMzmp6TZD1a3O=6?Uk?!qTr4_$aJkx|dfoWF?ZATIpU6j~NE&nXFS_xOJ6_3?u zHZ7F?iVN#VHm#*_hQYM;q%yIp+7NjNR|7TSM_xNi6lX7{&M}Yq|7#GIgqPe*vtLj_ zQ-4~FC%T7=8jW0AJihO~V367DT>iWIpMur1L!+rN!%eTO8P1RVE%QZP(-f4t*P%%Wx2)5)s-FeZ1<$*iLr#xtR%^wX7IZ8x_X1``oeqNdoO z&r^vp_~l%hQlKIypP?qh{MtcV%nNI0oJ1k?l&B&o-=%dkr!l3!N9s)r8{X*z|E$bM z=&;xf)|rKLX*<8iDzrhX5#=rYVbp9PtoA;TRhyessaHf;6H^3fa%%n7{d=8eyQcbt zJH5JR&^LXdgZ-Cam0bdyX=8~DSelLv{RlyXUvD^S8(Al!vGE6hP^GE6FQBN2BWjp!XYiYt;vqBe}?!n|vNVFeOw6m1+oX z2g@k{@++fI;-WkHmhhiqp2zwBSImQTTm!x-MdKX{)yMv<=gcdj`SIfWu0CUdTvWl; z*~sYMCTOs+(${=}J4=b9*VGtlhuv?!hr7cWKU=R*=#PP}fQDVy+SBt%Rx~88<)32h zA1acuFdufsy=}&NoPuE);h}4rIH>xUhDsO=YMlotP7(VY|5bqOWI)8Ta z>r8*OmQs@NT=n?xx78}Gq}AJrFcK%wk4cZ2jY8BV;zeY7pp0HlL5U9s$}qj5p4-~Z>jUupEb{=+d)jt&4%SdCc(Dv4#FpGpo`+w^ce^}H* z9OkuClfMNfOqs*RlW$^TiCnKU94Ry8OieEbbaZy} zTmU!3EM=O~jx0U^fW3XeORdX@&%ZV)Z~rj2IsnwsSEcQ?os~}SWM2E)_`mVKqud5# zRz81jDT>1|s0NJkPq)N7D5&^2qe6aW{-h1-q`szRxX&~3cmjq3#`JjLpNo*VMa0Dy zL@T65H-c;=1eP#O_e5JVm~MjH&$9jYD&w=}Mh?X|Y$i;iVvm!qe$gFs2d8M1B`9B~ zss_>5idu}cJ(4`=pJ(Nn(H@gYd3*o{PJbato&YsaPiAlh$5bH0H-KpkT06iG?b?5~ zm;J&Iz^=!gFHgIF25zdsas$p$oa2!X^Vc@MAJq2eXZr5Gzav;bfmg%-no2cT`93b+ zyRU^)@GJ!&7QQIt6byja1WKT!@AX;2>lyjgT=ncG^>c7FgAXhpi>RKG zOuOB?c4S5R0V_S*J?49Ri}9EBufB)%TzZ%{&t9S2;4}_IPcHQ(7^gMXqw26eNn8|o z(Q+L!r0LG76LKa-e4OvQ@70tP8-+3+MU61;2|tKUuZ18%4FO(QHo~G!>w0ePR@*yt zxX=yf-+4GKwEl}3Z$!XJ%a_L(`%o<64yC1y_(N%wXdyZ#Q=Yz$dsq9n9#FX7uCHET zwT*s(cRTNJaTPq*eWYej7A+YAEbisc-_lzXRmj?xauT!>YM%=7t2iC$7?exhb=Q3U z_K5rLZ(B^SJ`Ry%U&l%Sdm0$nZJ7K{(-d0wUW2`fG?s z@T~1VX9Dhf0BgLE`g`=)1joA&`k4E^^&!6X9zTcVm(TsEJ_knwoL_yHuV!pM!p@d} z4@jiB?PNteKd$#pC(Zx{RnW5k+s+E$uMn}fQGOmFe!ijR)LBQ<&$O`H9j!3doo3vOSl_TLVav0>JIaxbUA>zac0M?QQ&DxSj+Q_VfOXaT)+cnpVa)sU=b+nW&JU;LmE3_frg|bfZx`^L z{A**}IS1!uBo{q(tVTC>0xznmSspbxfsG4#quqGR%czrEe|@!0kS*NjU8^bO*LT3k zxj!#H?JxkCB>?mt@(E*nbDK!GwH9WOo$-gff#PPOgX_CI#hk+UhL+f04Z+>1c1dJLaD=o zT}oQBy_8ihd=F+IQ4W@9#b#V}CzT%rfZX4@9}D(zNw~lKdiNa#v%31zCF+G;229G^ zwrtwP6u*F_pijKOcUbD>y;BEBDir-ti5o6C@MhiiVRG9R-@dx^WyOU3*D0`O*+@$pCyn;KBtY-djb!QFcg0=%lhTjxRY_x)NDEJ8Fy ze%Z-5@!yL2Lvy+Co+FIy_)P5B*?xUSUD0D18)5g*qj>24^}g_HmKM+6;N9#7i-Wuk zH2S%NfVKu#2O%s@*f_s-HiHjtW7LDx&5k!dbxL0r{QAsOBx}!P5P&D}_T4OO@4fh* z%lQbs_nSzQ9z!%P>6-m!^ySV8h*B#Csfr#C^rB$mf}#2v~$_cCICRfRYXfQLs!sjtrmSSl9_;5|Si zj?7*mIViu+cQw;9}F?K=JB2gZcwmC0^45@rz5^FWzt{&0`r(w07Uee`a6QT zMg)g7k@f|Ta2FlL5ni&x{zdO7mmS-1&nOoiVnt*Qd)pK0qO9_uZV8j_`)L;5=LJ0} zwQ9o{-pDG+P}|6&tnq0vwUF9O*|z)-_YO&;vy`>k(^;R zGgjE~mas;F3!pn@%h|@KUiyIg5b7Sx; z83H7MLxuI|=JcUr^&4RB^Hh1_-E!yCI2E{zk%YUUQ3QD%_k3C3AUbMzDSQKE?a29N z?7TWKt!yF+WfwqRvq)a!EL)L3C=`evY`XF75kGyHsJ!bVi43YXPMbu!l?>`j#)gbJ zfsieb4T?Rcy0|nbfm6$e0o?qrX9!6F1h?!3=q<$zk`GbCPL7IbCZe!_GF)zKOOljn zF%d^m4a_ZVIVOV;YVBbrGM%_Zh{e+sj7ob3kMwVM6!WCJY7#+_&Ab?!#66pc6y`== z!y4fzNCjE{7KngJJy_!DIJw$lB!iY9vSF2SmD1*ru~~qFMqhjPTe}cvSM(L0K7TqY zpn0tY#~ARJqnqJT@ZZwYmt@Gj^uod!ILC-r2O^@HbWI%GnDm=Ay9GoG< zcpS${qkNxPQ1%)Var9x#lIl%gY&5(bNoOi!n5($nY^V`=mUCvKyAlEsfpZb%F?88yj7U z@R}xLnfSVHw}J$^-PT?lt0-t_mvL~0a&he$4USWkQU-fa+4$CSPSQ+5X6+MR91*CA zdl&fVS8UvFZPvB&Sa%Tc^?y8?ixn56#7K^h&bbQ^<<-0`!Y?alDgBKH2gDN#Be`~( z=={D0XHaJisj|``Rxlx!dp=AX7^8c-cdCOI+DYxD)gfq~;qUEX%L3?oz?{mXlq+Hs_SPLQ!Jk&kLsi% z>V#_35w;X(B6g};30O6Ei)0I z5pR69)(0qGQw z7!i;Zq(Ne6kXA}^K)SnOhVJfR;=J?wKhJvCdcK@BGhgPcz0cYE-q(EvQpeez!K7LV zXNs@*Yq`Lt=dVq4?ZD^C$;qm$OSg}FSeew7Y3ba~J$)jk-o7;z^JBccY7v zt^?Z)E3exnsQ__Nh%M+I{G!QU)pzQu%UW6FrM1E0y>-@{jPX0%sX4savg>Hh3xD_G zxU(7IW;FQS_QOr85U6N#8_X~I%q0TeXhr+(cUpeaqBS(mb@VYO>U}{_>hb8~-`RMz zg)Gy*Xo-0R(k${D^a8MJ`A?DF>VN@7Uv%yYg`BvWueO>z-^CNZ%ln=^PpJ5lMyT>yf31^> zOajs^Sow+jH%Vrtn0ImPsFuQ>IWAK|uYEQS2(c-n;=@lTMB9XR&u@2mSz~BCDZ%~0Wat#PMItjY~r>A0lr~gkc z9ZL*-Bp;m}yh$821?K0HEF|6C@tWctAuOQ!GVmAd88iiT{UCRCU^qFTOGx}qPHXnt z&aQ+k+W4@id^eSME1vZHK}A}7g#F<@m-of6UmEY|NUg3-Z`q1W(F-mvD{Xmra(m96 z1x=By9^n9%3Tk4~K4icgb8br9sAR&?bYgS(HUGOW19`08cm|KodB$TrS{BH6kS)JZ zo#(5@lvrQ0Z2N*Nuk#vVJT+h#)fO;iebuN1ncfWlYM$Y+`{dD zPAVg5@(djt_d7=JWkbBrh1B-53e|Hdad^9c@YDNtq;Us**sr|_sq&vxMyBIDT<9RH zy7#}z6l(n;6Yb9q=~*vi`k>YO_cu@BSb7<|he)b-bi%h=42+sey~=z6 zy}gfi(_cRB5~BQNP!P)=Q2^VHd0cw6A64=1=aPkU>nxtpP;%QQTe3g%>u(=3=AR6; zJF1TT^gj7WJfVGiwh6?m%+YVGx!<#)PfNL=si~U7H#Nyc!CjBSPJpAj%nz78YzmDj zCceu*8K|%F&i2(c3Y0OGnfz#eRbQ1JBFkbFLVBOfpA@Gc-tEg4NDeB6Z=H_((jT7t zKk#aqko^_CBSUcbEArejtaMAyXxV`3hk#zfl<_@%SVhR{XYaoQfxkmm4mud;!%8-{ z_@0O_fL>p&g@GC3gQdOackf#ZVj-$ne%9UIdlA+qc&}Jq@(SU+Pa)XyA@o&PE5qus z_#GyGQLFlRtl}3ozo6Fo_J=6;u=woV*h}z(?hk|gVva6;3VZ_wx?Z&6s*Bs1vO9|9 z7x=_B+-s78F+1x11_ZW<_8|Y;*(S#OXPFy^dJ1s^9*U3BwI8tNNX1%<@QjE-9@;pP z_Q@L$WLuxBPBlrnUJ}*OlO2`E3TKP#2^Z5OFpCZTowU6iUU(x;q|2jMo%057D(lm4 znqNd!sWeTSY=vS6`#ENO^shp~J^BY-GqYj1e~0z-sir z))j7+?*^a@s(g+S5)OaJVD0ktcJluZYOU#dkt_6HP^&{0gP9rW*Bh2t!wnatf5dH( zar{<8FP%506|bzt49n;$t_4gfFa+XTM)Qjd-md&4braXXw~-Y}({pTcrMgI5{L) zZ(2WIaM z+2A5ViOqR`$2t}PRe%1RYq1+ehSfs~=X1qr;S{-!jk;z8D5#&1WLrUQnuf(QOhm{vKt zTLyQq_4forqr+9#cgoX?jG?gNDl0c93)JV=1p>YC67x|9jf^rJr4ZN4>^Q3`cS>B4 z`8&zHsWLy)XTc5Y$5$xF3w)k>c*UlSv8cy0*>tB>dcNX!MMYaCa>1w)1$Za*#E9kV z(#DgmbfqV;2|&fQ*3&?sc1Bno;f57Dr2;nYmS#_e6DPE}*kh=MUnSQ5YVq!R$4xTf z@aVUa4b|U|-z_L9UYGoQo*Fi5uAcwSp|gyh)HdTZO;8{?ocNiA89dpgNe+ep`}^YVd0k#3@iK>d_+@-@6jrY8%aSCR1XeC_^%UKBSl#Alt*phZ6Lsh^}Ogxg#^ zWT>5aiKc3L&t|Fk%HX`G_=*4B@Nc)Z12ei?qHUgJsoCr%v0>7ppTEBT>F?bP|n{P-ms&u0=}11?5Scob%f! z>~WW0cS5Q3hQjoekKlvDI!^oS`wm+)PJCw>P3z{3gI#6CNmquUC>dcBXWIYHj}XYw z7&brni!rII-3n4h4@l&i1?b!Hw?KYxdjSh#fECRE$Rsxis6I%psY)gk^x-GZL zfQ+mrB1t@MXuZ1?r90`_Cskoie=&m(Xj3*eKPY|uVbk30nTbmy;9tplIyq=xR`70Q z^N(|G6->-n0Z`LD_$Zfy@)gcW=($hs!y?L(#L@0;N8OQPg9e+j-h`vUnbMX2Nssgw z0bHuQ&-A&@+>KD~1J0=Ha%V!(&KBjgzb|tbLNT7ROt7k{)_H-aes;eP+)2{=y9<$yOgYMBj0>CmsFrTNLw4^wurl^NAe+S}a1_^JotM51#(x{?y5f z25{XM1kHb;fuGvFXdx`@&;ry?9K|;QVqGxsNWBk6e`Lxr3#j;Jq82rDj?otY3&X%= z%(NnD*j$%&JsP2Dr1nHLBdv0<-Z-J~{)yuW^mdB|?|W3`)7V+6_?L;+B4@1o_^Br3 z^S|zoI%I+PN{r2-;)iJi03K~VffEqfx&F_>7g){Eh5dfMG`OGRqyX9755~5dQS?+) zb;&^LDHbIGJsf>d)Os*PBG`U{MN`(SG1iGr{zzX}>3BgE9>3Z4uR#EAta}vKTJc6U zfBuh+OC0t&6wp#wO}YN4iLBE}A6NTR%F14ZyM+K@JvX+`>&R(5_lNELw}U&ml!2)i zjPKCewU>a!IgIF7eO5d+`=llrLegeHXEQI6UttRkSE_kF}seXOD}F zan`wn6~4CC2)`Y5_GEg_nbf86&-`0(i^c~+dWlU+70E#dhKJ>xk6O}0X}o{+NN(fx z>aWu@+B7ZOH8>~{SS;EKMqu@u; zX_o-bV#%|->gm*{_Ka?diK%MU4rK;ln6sJ6zse-?c z9@D+rtehrorf%Fx)YPkpR%;Mb$5$f24|nF_aIEmYouo|~vJo?*dTe2%PT-ut|GujK z6*kt+r_-;#%aCwsSeanP?C7d#}i)qd!@y zP3;wZG=3hW8RNOP^IILFi|D-ywh#;=cQkd|OWM;4!+XY6NtA0#@SsAnlBv3bl3XFL znKFf*hozfQv8al2PKTRUk#>`pc*}GT;VHZomSQTw7MAYFp~z1&q0%oW!>AdSXm27J zzBsv4ZCDaSDJo)Wsa1xya(r^hqKyH)lyPs?w^z&e{9h4$b#PH@UWfA=0}>GR1WH^| z{^wdE0PwlXmEzy}x#P2(bzLSDx)AQ;jP}Z&U-xI=aNsA>>IXN;$xrAmIwy~*g#2)g z73zKPMp%~UlHlA>=Amc*C)`8523q3wTsoLTkxYg{PHa_9yB*s-&r2rR<^EEa$dW;h zKbv3pVUF9;d`?>@Q@js9%pA)_Q}c86yiLCS;Bgss7+2JC%WbET$CWfkwbyRIXi_Aq zKcnw3x;e9XCrZ|Bk{T0_8(5~1H1t%ls2GECrg3`QiW*csFx1<#^-&Y2J*nPWr^e27 z_)=1k3>uEu8kk1-##w?e1+#!j@eJVs@YArQ6==l1I0wMXEQ)<(mFwvK??q{km#oky z4MF2fS7Rl|-(U5futzBq%rRRWTje~-@hV&r=VNny*`eB+bK?|ife~T8{61GZ5Ew1< zGVgk2Ak1yQO8Svh5OUOSC36Gbw)D6>93LbNFYosz?JEcvtbzvApE=sP8zG1oIpE@_ zo4+ZlwXe0ucq{Zq70@d~Zs`1wEsW?Eg{yntYu(B`NIW?laTTYj{ z=<$9(t$BNP|6T4#&~wY$CRWz=DjSGkEUl^CN$A8&(T0XccqgDonoc_cl!>*xOgQiM zml^IUFYX12+r?PM7Y-EnaUEcQF<8r|#)PLI|6R;n@zu%N-~Dy0a7=1mIM{;~y-}TQ zry5x=YO%W;9?(qqk!(Sel&!I7c(MmzaQ$s9apmzul2Vg4kG)Nvt>43aNQj3kzgk&} z{xV_|`wvmvLho96)LX3D{sHi6jSoscw&Ou=_w^nbBp(|x{RWLc9>aJ z^!(GkJss%U_4q?lrEA!?&xxQHjDWaSg22tkZRCGnqV!jh&mPnLaL0Gj#3duakkU9O z>Q&vl2uq=KmaOeC#2b15qqOfNd)4sJ<6@0|(vmCNrzYXmG9dI?vK*Fyld>d*!7%^P z{9Un7+EKea&gINE&1OwrzbLQG3{{2Te7B1%rEW(b)2aE^RNzXR9wm<|whl>cd~kDn zTPfM{At;hxV*0MInHa`1ay9NDt8H(eMu1!ir)nW7wEyEZNp_yhq%OkzuSK0Zq{Nik zjv~1|Kif&?k+$?V+>6ZmvXp|axQFMH9FUQ?`E|vl6yw093rQ;Xm!Z% z+GnrIcv~L#5&0NJJvU(vT8c1`9;yd|kVQA8=Th(!a5RU`Y#)KK_GjF~=4@;%<{(}& zD}*@y(Z{st4)x+FH&@T#c#k6J+0?9mWpJqf$Yb&QWi`!#1nOi#uX6UtW->$j$0}|% zwLpGfPd=~JKG@C}{sJ`;yx-nb<(fQG6SVDB@}eO!TmPwP;N*VYb;Ya~AFXudP3)M1 zr|l8NrNM@(M`uwe%w*5jMP))vA!l(ws{aeEz(-cg{jAhl>Ltju<=*h2}q{er#Cdb^aYCls=#i1>nssP4O+zV-hu7Ep2fH&6tn`8uEDay!Nv zk%iVzSZ{y+HQH(W)k6mt(vuLmrDC2OF7qV?W0fC2kStz)7GYp5yRhl$Yyq)c z+kgfT)t&C%FW>X|9%*Ly(QKSH8_g&@*Tj@;OwF3G0aHssn3BrCPj@K#!i#m*^qLTq z1RqATHUFK(&18hwbxGY|)}$2Db<935Cvvn$obNOH;^~j?<_VqBzbl8|Mb*-KY2bP^ zeCz+{ad7v>*+hkL*}g~1Z=vrgCExqfP(ljR0(dRKev~2SmmacI?!=RgdbQwM`7s@j zEp{Oi0Tvny{OS)hnhFArj*dBdbh(cFK^Ir!Clg)mz2QlV3b&RyQ?O022^=o!);;5l z+WkFa8{R1IjR6KsFqpox0aYg~V{)T*3IkTyvE9LXQNS*$2QS>RbF#DR&EO~a-%s4` zvFh55bB!{m#D!nU3gB`t%#(v+v{GpBk>jTYWI!FHu<82T6WsWtN-4&+NZlm z#Tm_qqpHvkP4yu?L=KsL@kH^trJS_|EcE-o!vsftdMu43j#v#iyIdRF#z=TEGoRc# zZr2D+)_+Gfo{>`J_fL1yhplhz{bJ?41o9Am!QE-qxRLI>O&lEJ%&fM9Ac*V z%6z30RATJ<;&y^7b+Cqbt8OKZFr;1gU&MzZ!_}R(@9>yarj(YN z3WihmUYPO#k=DIWEJrTehyRVDDUPX1xk!z!aC4(f$vq%*VD^Z`$-Enc~*WYCQOb6}dSFL`qW{ULr?}N4!pP@qc~|hD9uTb4F~sy}di?p++wXzT+iFrYGQRzU))br)w4ZE% z83AzrG2%&m`k#pp&~=S-=_7Q_l!`d|>g|IhT2S6qe^H0Qs!VGxU8;mKYVMXLHt)7UA?(bF3G_5fed)N3EVyFFrdE)e?dDtrez-gGTr z5MwE;LwKHQv2zmRn2n7vYR z|M)er!0P+6M6MFG>C86J+X+ma_AmZ{Upd|O=5tP8eOAgPE`nvAC}y{{ktYu&2d$KA zUH@CT^9HZ^3v!^_LkMCeXpgq6USW7b){?fL@^_G^76Mgmb8()tA;~IM8?J?32e#A) zSYJf#hH5u?TB2J~FOQ5Ds1OCAq(IPzhYi{OR#P+48*PqiyMfiC-xN%c31#v_oAC^y z=ZBce&$Y;MMtZjjJ|mGe!Ip-|^$$47L^usF;rFYbBnCI%h;Qk-^c;=5VW)te=!X#1 zuHkg45wZKXsxy`Fq+7UyUprNX@7$1?uc7WbWVfINKwQ_Q1JJ8aEWlE4NzN@iS3;7e z97p)JL*BZ%Lp_=hw*V&&_xz)1Ys8NzT*J2Sd_Qe_MubO!i{pT%YgOAhRF!?!jzw}{ zTFV~dxCnNECsk54l$|+lsnu6$i1hBzybM-?Rx;*%nLcQmB{C>9KBQHDP10)f%hb(< zt~|z2MX8**B678QCQYR1oLexsP$>^T)O_@mT?Ixy{jWH+AtT31CmrqPDjFQ0o!fr4 zrRwlWekDCQ9@$$RbPX9soSgEIc(ez#HP>Y$7Rz_ZORrJB2QM2j(vmKa<2mrs?cp4_ ziF$3En^IlA$(DRlXVm8ljvIMu6l2v=2cLiX)2)*dS#&|?uZfm}02Pqur9SR61ghrM z40MFEvT^hH=Wf1%m33qO>NYnW2kX5$!35Hm4p7wFgPG-HInl~TM1O3TqY2o?yyj;6(R37^ zF)AV@oEw_;wFPyINF~kdq;mjhx8pmuxpF1wnwYPpFXytSeX`?UCmXOYI!4sczw3lM zf;h1~KCwpwpAI%1zM|5(SwTml3?~8*1k-i?(8|WECh5!3*+Q{SeIwW4uTTD!O~c z^7_LHa#tm4H^QJ|O^Y#b5?z|isjBSXM*r@-F@50iML?oI=6e4sAn`+`KK;ZfwV^$S zG1Ui`G`(5cRmItWcMm+xZaAyLqCyoTq5ocwr=)ph?(7~dSbk{m%YJZ@RpfSEhr1Eh z1`n;aWelJUYcTLQP&q12ZX$S=p)qJq`jvFF!HsZ@qj0%Q;cLf|ghLmR+n&zb*iV^} zFW+y`$HeWo8Hc&r|M3XpXK~?tsKzIe?$ArL=$+5j5g?;T&9junE)u$2bBFbSkZ2fZ zG~2Z%*?&yE@c2Zc;~Fx}wE(ni<&=rm8(}J6(grbvRrTC|+&MAsdDH2A1JyD+3dEGu zHmV@eP?x~#9Y93-YozX}z)9$bpY~fn?E^uFyDk3oHBW$T`d+Q>f-e)JW4aiZjskk* z3)cLW_6gcQH(W^W$%d*QY<0Ogd>rO#@==;VEDq!ILi zOaNG)WY8oQ;5qyJKq&R>NVzf*N+eWlv`$F9BGDKHmB`MAo~1|*A4WF6ifHr_ayt_+ z0p8Z^F9muZKtHXap;L`VK^S;t;PnBh=k7$Q>h6fIxH-4L-)m0orn zwBzugg#1=XW6~C*xhq)0UJUQGYY%XC;9eI^*ub|3N{Ez~O8USU%kGvGHLb)sP5h0ghg&>Swn`FRCK*7^Jd z0Rf(~i`78m*}~ox)Nn_MhV?M-te}<{wneo>7S}NdYV4k1)brAJE25~W_5K0MauFAuMpdX>@TB;`dD<^45 zviLOe=6eROxA<&WXtD*Kv2C_nBbh$6)(9v!S()wFoJ5CL8JjXq2n}$#8h(><&$CQ5 zOBn`|&bC?-PCQ!P3m^c)o4ce>7`OVRN)%GNuMdd=n<2t#&E_oR0!F(Ez^9+@HWV_Y ztsh7nUUXU=BHRLxG4W#;B|x?(4(8c*W$0*NFy(j!xlDr%%wC+No#jtPS6`%8BRMBg z<`}RnLHV0X+WcfG(9~SyWZ&ud5Bn z$h{8^M(OXTeTPM#fGMAfRu2;Vy7)StNv)^^#}h6b?$hF!F#`!7952|Hv*s};t7+?m z(H1`L`CiX2kLYTJ?Pm2>BhkSuH7E~=76X+wYrX}q*V@xv7Es4Ph-yPYB&Kt zt9#p{Km$A{=Lilg{jd5o&aSo-HMU~(w|_*0*k0XpojFUFwNY@yIcPRINfmbc#<5>3 zPJ1jtqV7y**W>HAGUUo>RKz|T2FR)nVfZXnI73;@dM2+>tipO_ zN&yx;C43R)aS^ZLA{xN+*{j;jxhdhEqk6Yci1Cq@oG0cJIFE|6MCAxWj%0g&5kAB7R>XDb&b^>A=!8D}xHulc^(M6M z@L7*8B8jHoQ27j8NX_JYpK_3w+XGj0Q5L*POn|B22Y0p1?IBodj)|Gb|^m}7n5IsWQ5vTnp{3%>6lyPn9OZI9)!7N%lkgjtvHI#IWB>PbL4z#-t95dRW0HXMyG#< zse0G$_S`ainl^)W3YmN&9o!zTf|*cqS37Hve?I;-OmuT{Wa0B&+W| zt6B?eLBEWAbE8sY-?XX)s#bon8iJUWMcS-LV)m~*d*`AS$O(rCknVe~kG@NHf%?!t z1n+G7JC`&lEXaifU4>jXn7T^8?N)2<`LTFhXm*$vBi3X1Aq6o@2j2PLyw9A)s^_wh zz9Cf3@8Mc!Ee}7}o$w?DK9+X$aJo>hnlvDNwWA z;l`j>5Bowv=)Kj_`3l^j#)m^$-15kq*wUdIK}^!RoPfUv1+X)9(+UCVXD}H6^yM&4 z=@D>iD=eYXEd6p8+5p1@o?m<Q z>RPq9ANQ?rX`-3xv@UwS<_AW~E?8BTmd@WiP~V z_}Wh^-9vrb`K+U5Bc9!IgC@o~=afXnA`i!k`AO?1Tzt^2`zi_vea+vOQkk|~9QlV` z2XC70=Dl&;jaL;UIQdgwcHbd9`U}7xm^2wt)kY{PkN5f1boZ4`RAg&E&HbGGF72w{ ztspR-l*Z|e)Sl0HuN3H;3S&oeZio^0qxfTX=yknk;kU*4_|i=jX0irld%I!2BwTyF>~GvkM?L`DJ`EoU%n*tn&0$d!b?gP@iIIqMeD{{XR_{nAI}_wLzq*0^;7r{b9OgNZB| zVy@(MZP=S_@B_{WfO4C`aPASIf#KeZluDt`T?QvwMf4d(8{XJL_fc#nv`2PNnP*>7`P7YA2-5Ctl{=hkOS!^^;ii6&D+hm+K zg!Z&TJU?Ps<5I(otQ4DD`_XtnBzQ&yh?IaUlne9`9wJgj)~m#M!*Apt6>%?}oP3s;#2e>XdWcYbr)RDaLN z?tZxe?iyv0V8659wP_o@w8-1Ho+QD$0#~&R@T^%&((U5^Emn^Y9cFheSOPJ{g0AGy z+7FjAmh?GCX{BPiPT>uG^d8#$e#Wv&36s&&OB=sN-ze2C=D)EP2&Tv&NjYR^oj-Jc z+bnDn8Q*-3v{%fTGpjCjUVh!H{RQ{8WH=bSdw9Bx z)Z)am!snWpCruUyp>x1>1Nw>rxQ@SyXLn#*t`7CNv|7u1v&i@Jjx(bghVk9!jShQt zRP(S@FNm#xIA8<2hQN0ufyS|&CAPQW?40*Zgrz+oIRhCpBdn%&g)>CZ>M|Dx|8Fc`231a zsmCW`RF(zpF9~VE#OdBMHCI8KW%H(BJPCOmkAE@q4)RQN1R{94kyFlw!L36aZ~VoV z9sp-5?RAod|~UIc!aQ-B0XPyoe^&McG$x&>(;N{zf%G{#^of@ z56g?(pzT2c9Y<oI6UGLiArH7(T~u=Ifkx{ws-ok;1pa+R(#_C8WzTt8g{^_`)XS5o&z=g> z{~n_?s|u+KPNnE-2}eClSfZ=$5~O9^pfGsMii%RQ>BRYWmU@Iybg_NV9bhRc#Q3`h zZ&goFkxN60hDL^PM@um4`So`S7cS0W!GBxk^pWt=J#)(HE{Bg)UudtNBlNSdmW-qh19tFw`al7Jwv07r;r-32J1e))8c!nG=W?=E?m#tp5!il4>(vgJN*Ndi4Q{J ztZ8n*>EY;8Ne^*ng;&NausMAQY-j|{*ZAa@gdVMyE13hqUmCw(hVkU$vzh;yeXz2|yHTRn!P50Wtq}AJ;%PKU>=&c>_DNvN z>t7^^zADKs|Jua$?4>m!ZgU#6@a0)lj>zwzjgqAgqQv`apXx^(4o!bWVb5`M_M=@J z*)7+1U0tg#9qMz8LHkB$xUHN3_~3Ap8^9pX7S4jvjo-(#s)1xFhz0&RRpW7NRC4rd zakuPm2hiKOiCvWYYSq8h)2sEsqwt~r7ijDGz2L*(I6}1h15MzuiAW7S|(`cFTXqWiM~fx_H2KLth)^JD&N3*w?&Nsw6Cp_gby~xFvW^(D!pIM>aD({8h%J~f(VMf+|43N&;4zPMz}_sWpgLV9!Ob6RSlnUs7ZwP4mahapVmn(*z4(C zzjjUGfMj9M=NnKgZ2TT| z6WnRPW@M0X!ZZ{{xxwcqg2>IJ6~`&2P-F5(@7ztasm&6$YPw^Uw|vC?+=x zk5i{IvlJQgupg~6wg|j*(0}PEv(D7Ytr0Y47HDlUwH4S#1>C$gKI%MahHk*@ck}Vc zTD;qY8YDISUg6lE3u-%R8T1uVjN5vE2snDhDAk>k%1ypQ6^yydg< zjy>W7I(6pb>%MXb1qemGI(Oc6+)TH~CG%X`l1155x0)mR3(I8K;MB3aEj#%5b>8`_ z*hj3c=z27qMV=OEpKr7VR_gorl(YOe{}0xiKqXuU?&bn~LMLSaV<2ToS;Gk1n=G=0 ztOY*tm{Ix1b9tFSeB3z#7>(1qMnbXMz!*?0`*j4TX7WC(3^ehY%p1S_no1-Um@1m& ziwv&r6z1+7?#j^mAb~@#FykLm`@?RlzJUzHJp3BS{kCAiv*UTuN-QO@p{{Mun;8K? zq&%;LHejSf^A;kFzV;-De$~%oa16M~pXL$;C_b;4!J3?ebnK4@D|bF@qp|coz^nv; z0P0p2|JMObn*)9{+uQk@gp}FeXv)^sB+jUt-MyB*H+*OJPv^H9R>a2CT0OPBRUu|XcGDdE%| zfZONCDuFRmw@e*^JXhr9(ZKIJC;5=)JPG4YhPcFy~OhpzjMry49sTpFCbl3#F0a8rfyXI1`8&t!Yi~~l92X}mrf{=H97)CC zL_bfJHD2_<0%A>W-eq<}ML~kHmToAgQhht_TsXOqVql1&zH9PX_+N| zHEv6MxEeU^JTh1%$BQ*?xr7FX0^e=~jwFY8d=&xfry(-AH_8q?ML$?)mwXP4;&h8oPF%Hs>u5i=(tGd#^4T;2fo|E5t|hBU$-KPTOk^Mk>E}t zPo{|d)WL9w=MVvdUCD$0>;STJIhsc)EMz$~RDyF-WUS+n zj8uQu>L4q8sQ23dOtkUWsQ2lRkC1Nf-59`<{bXwl$Ziz())1Os(i^d*4w;!(ZTuAs?l~H_u`C53H-rECYX=-{LICjHmr!K5jJvlj;Sq z5eqFVDUSbpIILK0hLV891iQ-m`DQg_zvTb@qQ@EHVe-m%6Y_x6uv&wIrR;CZy|?%M z+^mIR6P>|R+8KtlRi6SHM#-n(mwvJ)L>rD{JIiIT|8ahp zBy5&7YO9ywcA)$qYAf&X2j3ewE28SZ2KZTHh7}u?P?t<;xe9S0%+u zCsdns`}d3RmL>_MhO+fq5p@_XhZHN6JEkXCdA?Asa`-^4rs~e)U-VwHpfD}*T^;7L z;*baj%a8BrNsWksVPHKse#>*|**9gM2MS^r;Db$m05dkQgho~`A+XB1{|CEA9xc^& zT`$cp+_UOsLiOYTy@wi^rm)bOt7{2 zU*Kle$A%=n533V39D8j zk$>f&rm$NE5=;`PK!K)l9ju0q>byIYsttt%n+gP-XyQt4sDB8l&qDVfT~a*ZgFh{Y zXK_@iKg-40_RK#1V0w~#oJh%f_}$t5uM?P|ZV8?6{Nq-=0ryQKGjcs?1Q2}^wR4vh zQBU7glQNwr3&0)eVSt>=$q{zhY-z;|l?RC5P@LLsA#XDSe=Wzz270K1JuPrJPy_T2 zkw}KBif2>WX9x6|+gw7(M4n(z_pnPj#5YPk6YO5t*9KeL+^+GZ zR%<_ylWmH@)KoC$W?~tAbTF_B_KiLY{N#_>*>}}+t!QnwU&c|&C~FJRUODTTfBZdS z4$Zf(A;i$M#~@86v~9~^zqKtz#OrOLGmEoF_KG0{rI#1`%4w_tU9m<>_h8 zmfX@`nxE`-UvswfmVPWev@0kUU-+P+=`x9o|G8gi#4dKF>Za|8SH~^-u&w>G8K8QsQaNnm)*P%_ z4xWD`&)8a)yBj)Jns*0u1i9_x&luH_fB!Wi zvFnck^Um>82?l*ZeETggm&bpg)eD2r?SGr%aejRAz8K(=+ZVgo$vI)MZouWgvFR%h z=;g{yczeW^WtG`WczUFzeV%#Ot*Euy_H|P+Y%!82_OxGT^Xs_a$LFD6*y7!ONWXb} z&dT}`8~*f6(>e^sX;SguGTkC}4gxlN%g2+cQljI%r&(nhAA;Tzm z#>kUA@9RMCpx_}xK4jkVkoKBN3*ePF2Kasc)CvNi*p*`p5b+ta6w;w_H2kK*Q}fwGwL{Jh6xZnts-R0vq|GozqIN$OZ6T zwslXr+67pTt7`gvlQRg%n-~WAjtWp{p!RwIgWCCDDKdmDMedcxxJb|&ymxECx|tYd z`KWeoS#xu`e7IK*d_%8G!PDOr=t8w?>7}MO_nXff zAdn4G0<8uG;lD|@x_@%SmrIHY+PZAIxrLr_F#?%dh|d+Z=_}2?qswQIf|0>Q5*!y) zbqW}(;wlVkz4@h%1C37hCDuR=yl9$P3eLM$wSp=nv^H9q3E;2nFnuW)b|BHWKS&8NI1xe@YfG;WI$YpPLfG+s*#4w_hF4tEnm zIlW!2N@60Bl2_01CPfWT9E#pYP-sVTz#7eBpVTYgEO~_l$OJ!{P=VE=@ z_4FC!U<{ZQYz2HK7k9we7HrxM*m$KD0WVbI1tUl*_KJ$aBFu<5!b3@-OQ40Z1R3jv z(Dv!~XH>L28Rukp9EE|Qj7o111ow6H+XudBPnFD^Y-4wohMbtbSS%gHZ|6kZuQqCg ze8}?N>p}k&1acV20AU(4j-d=r#lIqJ%_h4Ql39yl9b>W%VIA-6OUIg4 zd>I@jNDL+95hs}Q|cS`)|g<9VEVQ53CQ4bpbE&i$%to2aN4?_nuP(* zERgLTFlHnez!sy~mO#mjYzy{?r8g!3cXF*|{)Yql&^}rxDBJVx2B-FWH7l7D-H-H- zVy{U#^hfg5FN*A92K4h^eNVBI9if|jCXT&q3gRbx*i%(_Z$h9~Q^P;NJx^-FtV{X- zG4@X3nKfOsXpA?uZFOwhw(WH6q+{E*%?>-Z%?>(#W1A=6zt6tkH+5Ujs#R5Uj8S9G zshviPE|z8i4p~?VD=2Jdt)PgUozcoFxZ^R>n{eoF7`ru-vOz6CvqbnM$U6=E;^XJv zp8ZeuyM0Hh{zJd&Q#Tepb(UvCMjP&vRc>?FQl2>N(p;{@=C!u?VC-C1K3RNQjfFFC zprWX{dskLodCk2L*opiy_dRsXg3^lRxfFy(1XI23Ylkg9SHr*!2ceO zUPhXs04M!sNB&L^;xVsW$_f5H0-bj9D&?dxsDWokUyIF~uf1D5+*`n}&Hw%P?oKSU zKs2kWM`Ta=aDw>taI#h%NK(3u3^rSakB-;^7gyCaHUtQce@Q9-y*@O2+_gjPG&Lfu4i@_j&pTDH-KmPgoIRDQ7 zYP(&(`m$sR+SW=A9EJ`^&4kdS!v`4-2GI)I;z0>$BvUF97qjeXU%B61AMySKf06IQ* zzh!!8_DYBPbh8eUEn^i0+-3C0b%N^c6IjBD^Otp0-b;$q(!KlXD}K9&|G(qb^uO;p zd@(G$Tu&Fo2(8MyI`i2Qoe+O+4d1gom?WfyxO#nz?S!}{3@_q3O^gWmeC0?EMZ)Px zP)F!?qNS_4TpIX;ywH@XNfO1^{Tk_UDf{c6@PyiUx&lSR8W6K&nzZXDZ7|H0(EmH1#vqSJTnEqGb8Y6On>q+#^u%dzsC@7)viT zbhet;^D#ncXJ5GR2`IrGhu#NZb=WaaveAl~7 zOL*yjiG`QWc!s4#EOqrugrz9K)nu`4f=EkX)m~u|88O3wxPb^YQM>#_@Za*N=2V(G zx@=%IvKH^>h5mQ%=Az#Uw#+`h5dFu(UU~~IhxhYtNmFM(x`GCo6~{$INX8DHPe@NL)MlL~5hL|6ZzSmI}W2=3M3 zKXZ`4*X8=$Hy*v{D(UDoLJqL*ol`U!`R9vsZSK@F)HQo+KA$Y8D)-6wLMyHuJ;99( z$=7wIWCz&(Nxgu|4`s!6ksIpp^*w+0`0n%S;Kt4F_3CMpAjz%ZZ)c#OuB4^I)05!; z`CiV(kzSoPQ`=`-i=)|JhKiTv|FO^WI~gSJlD|KWcG>8vA5=D-%$ha*`8?k!-!=vw zSbN)^mxdPzP!x1%z?G+XQ%9gg!4ISXSLLMhU8l8c)@TB zaY?D?;qG6TUXBu2!C6M+*FgD5I;k4KnSL&xN}LkGGyG6HZd`hqave1MFtc3q%nau; zt&{DsL@6?gw;D-B-L8(H9&mvO*(^iJ?f06DHGYl*$H{!@6+Hh-s0mk}^z-YWIQ|Rx z&!10#fBV~t_Px^{{3W(nUHo>_PYu2C-6Yqg{7ES8W!E9bT%nkJEc}u391f-;9lzM# z^S*|GWlT~#+yCk_1l`G!4&Ew`JGwJ|Iaz#?eW>+4wJ;_uH#jHTLc#SCCHw^QtD0VD z`Sg}shaQWsx$-=<8~Wb$tR9{pGxu$wZ{{-=Na~Pau6JJ>`|lsK$@`E03tQhB${nez zJ&2iM5R_ldJGxQRJ#R|am)-)_7%OP^R1PDl!u8LzlI*7p-HT#jI=Lb`s?yd%onTj+-MpS*Hr zZXzKluGg&2Bw=B>K8Nta|1CqUW3_6m;KV~N?vmbC;rLn{RqXjzl9{fqy?1@w9aN+t zgjm0b2wHBh1atB8zs-*SE&Gdq@ufz|<@%K3&g{Qs>poIAVUr?K(=OHyl>IcuDOz+w z?{cs^sTCPx- zMoHcnm>V&kWEeJKCpHvn2L3{rlvEfXF?p7EjD+R`hvjhT@lvNVmN$ThSh5fkic5LN@hb_oRfTwm|gkbj{v70GqBvRjm2pSe&2mbS0{YEU3`m+ z|HbsLoK9Uw0JVALHBee9A#Wj`tA*1Zg?eIIARuY=);M7l zfPmb&i~tM@eq%gUX9_y6E0M71{JTSWvdx(U6XZLADyaQ!6sBjhCx687j~ln;Rl$cR z!MMAZ{5YM9k2j+K!JB_AA)S^_zDf0`>p*G!tAeSC-9Cs%zJVi+##t0nT1Pz6 zp=1aCkY2i0yaj|L2j-Ac*A0L%&6b7;lx*j(g#ILZ95Wf|Hdq#RnKmdEt%ZvK_%vTQ zVsJ{NH_N$$!cTZy_Aa9MmXD#23xSTe{9xnqx5mBeUi(i$fu9(c{=eg&&b~#$Z`#aQ z;d6;deSOx}4GqY}Sbz6EY3zO4q!Q5FZWs>!(z4bQ@|r4HQ};D#E00g_-nbU1xVMb9 zRd@X>ratktCow9oR@&a=wKo)5hW(u&^vmEf!kI-J^jUZVr+PW}x_4-GrTk`QgvaJ4llIpz~hpv9ph zhS47WlD0HO;EwXR;(c3_i(4RP^PTxZTQk<+{qVU`b_XoZ&C6UbFpS?{+^6{Jgpt(I z9^Y|cW_?KYLxn3;ht|V*{o!AwNx{2(`7GIVo?UGH ze2sHo>^>Ik>Pl7k{PcKlN{VQr8jrH^`>M_D{aWU+ZBcmq{7)o0|BuJ`pXusUJYw(4 zuCFA!f%*F2|9JgEy)wFUU*+Q2#_4e&`Vs)f!Y&MTEp72sDx~ztBMv0lrw$^JZT$!* ziQsjMa=N><=->MI#;b*GGfOv&!M4e%7vQHyUv1yeOEQ=E^eE!SJ*s56!Eik`FE{zt1JMPjQ1= zWUm$&)Ol5YOz`q8!HkQ)Q=57^##ayS_WAAXS1r*PZN2+%&H()dd3o1+zk2?sJ>a<^ z&7wHFwTZYf=7CA1)bc&as+co5e6Hu!yGRBNLfsG9$}^6-&0(YTrO(~}On`iC0*j@S?DLQRNA0!1>jtaQpJl>*UvG`u{dE((;x}HLv4`q;kdWhG0?M*|u!fv^gbc z=PcPtWpJ9ZY zu0oXaEB{-0k~vML00_^uifa6wn|J($)s@f6p7w z=lx7oFY@eG*NEOj(bQ%*Xww7rxvl*uoq9LC9%B4<+oe8&s(lN!=f~&I)c#+<`+KwA z@9V2P??q6%zu&&^2#9rn&^M8P19KpL>J3d>W2tm%;n#@))l0CD?2T!7-d` z(fiKUehlrxify~bCshqEYUkIbKl>~E>GGg#-`&{)8$Dxf#SK-sa|GG`15R>u^A49WOAvC{FYyKJ$+w zzd=h$8Ol}K;2B|nvyT9e-0OP-<0Z&ehi(1jkxTo8%f{U;)@kR!-x~aU3Jmv)Qho+_ zZUH^Smw@i(tDHU0cPmDVOUt7hr-qn4hlL;L(|>L^A6V3?@nxqBoW#*SU)Od|Ukaqa z*gB4DhTaBAVVk>Jt3@jaVK0Ww_@)pp@Hm$q)h0_)w-h8++rl+D#{O1t3Upn#B0&>< z-6<{5{!nU^*dzO!j>tMDqP$-xAks2PIby4@LoUKdeh6?W`+`blfd-9ryjc=!VqTwpftB#xQkQ}hsV^FmhxeUq_bJRvw(z{J^ z(!Uu}K8X&!3M}%4kJ+p6Nj;N#d}7xWmot}E{`E6R(F)l)^wf`!FaJ*9lsTVMe@y&u ziKyC5MDxb`(?G>_BA55??xB@K?<-0s>;cCJP%0W!zb(^1wRL*z`S4+BHtUC->y=M$ zZab`iAf5pl=kwddsb%;KnUGl2C;Zh-pjTW{!Gr#cRR7oRzZ;uAi}>F5;CNAHD7dYr zm&&>1kCSspHXcFzCY=28x?sD{ySrZa5RE~Xo4&lyk$1xEjalH?x~M@S^rq%<{V*XI z6MZt3m!~F-Al;RcSevA9wL7;*@1`?WCY*-F)M)XK`lHY7%v*scI{_KKxC6O6OgF;z z1=5gK=7?b)-a%nL?Qw#JE}zAl41LEx(BUwb;lM5ofNV1Ln6c->gAzFh{}eLFqVUsv z<}6rS#Z{C#3RNVdHb|+L;q{A_ik{~3@oU$zz=3Q{YHmLMkfP*me%zs8cj}ib06UFN z)qRO)Mpt?+YaW#-rP}YiAA^AnQs49zL$#|BJR}v$+8wC*Fyx4 z0jf<_3h8Fnyr;)PIlFZuxM5&dc8^EY7Knd#>?6IDq_*W(>!#y*Xii1X|AwTe z2!EV%N|x0MVD$tDdk#q?B+7`8K&^6a&Q?+{}7$KfrmzT z>KeLza$X8t9oZDj_&YgxXJk$P{Q&kBTV`JfF^7Sg!PA_!Q8&1ASf3i_b0BOTWKsf*B7s$ zh`qRGn%W+;xrWqBhzUF;s+urd%2eAO&GRitzdRHNcw``+26E^_SX)F|-SRpEE4yE>@jFCvPKoIf?v3)U0gk(6qD6)7pBLuv_f^nkuIVCb%I65y~lN|d@; z>4z7b-TC;1Ob!okZpqAR`M3xe%mpRLV+VJHHQdCYbS!3+KN3dDbnxn;j%Z6}x}aLv z=^zH1^o+z}mg2Y{KEXd`zKhMDEv_Kc>?gS!t|hvh_CYkndz-~ofVaM}!_iRML5XlA zy^mFp*oleBwY0fmvaI|$Xt>fZ4TT`9M#?9ucEHE0=Tok*(-}9!BsMiq4&WmrU*p4i zLGX>yCR^CyCi$KYMG}JEUIi5fpVyOxN7D10Pt|^OqV9=(fFxzKSr}xxjc7A;{#vM{ z|4tZU=Eiv&M~f)fGEoWYM?O(m$}&(O;9U- zb_8IK@Ae1XU|Cuhm_m!&SSI_z`YT&YjbGGH^U?kLB8M=$nV}8=R0k*+${1WVGGLYf zrY&w@=}7LpRkcG*DuMP0t4OztFh+C0%}$kvoH}#LR9P!7Rm;L+=8c%f6}pDWtw@ay zn|Z@_CnnTBiLDUeJhGUI2qkDCooq}TNyDlf!)scD2R>1^z*dVIG7!^bTt|uJhdOkf zEgT9+^2~5Ba!R?Gyw{`nf!YvG;-tH;Q_To6GR4#JHu46f;cv9uXvuLm)6=2C9<=$; zME!`-NyAScQ5(4F9K%%R| zQ(>mO2d`s2(-YaonA(s5hjX}8BW)yQgwp*u_vVC{8Z> zJ{l72K!N|y%p38dl4gmZbSEtQpmLTlilVy^@tMZOmX}U>{GB!l*-aX1T*xdGT)V(% zreVqF=CYTHq7e7u>stg&&SMVC)iAr3JTgQW+yoM=T8S}HTN80%c{&|%+#L}8=1$k{ z`Er4Qm3`TLim0#<9l~0SqDkg#I#w=GWz?XNVlRH;{oP;c^zj)BV(v@{Mw6p;ZZkEp zG~!J{q-3`u15lYV)9`gtMMtJxhN3E@E@r+b`1tOsnmIN(v(lIRu}ek*l)Go-5tefa zOL{>R*z~4k)3IbGlx#uY_9k7Sffh~*VmRok$pC#Z<$v%M>X;9mE`-Ct7r~$eO5a$=AmE?104nfZ<($I)dyG z52QHa{qP!sYQqi>sAd+qIzIW5b0VkqKNE8r9obZ+7fb`~;%zR4-$nedLey~%tc0xp zJQH7O=30o;lb5f^uWU`@x6(uUShed26PyCkDFDPyvc+UgQsC*g=6x#qo7l{x(}}p` zEXxgMGBNDHk!NR_dDF6n;~v(FR@$Y0kgmQ}(w=9+1JQGN`z>{& zp`!OjaE}Dkk^BE%FMFeLds!NY2LtEfGlbgl>Ve9={P_f!MJnXWLjtqv`N&>{@s9gw za12(f#U+ej^Aw2a<1(mYWZEB1Xr*`f3%KP|@J`-+U@-Uxb9mE*EChG)q_4ntj>=V_ zWK_ zDCHTPlOyh&%Kacj50{<1(%h*9NF4^)r%DP9!_Ph1e5{J}?%Q%;s!TYl(jroP4~?XK3p~i}Y&Nctm_q@s zQV>#U)(*9SYHgLaM0YeH%kRrDq7e4Jq#j(`01U!)SwRN8_+#hf^8Os{RW)t9{=^0%&?-n|G6d5(oD3<>fglW|;apa60nX<>I6i zOwjNJUH&)~H|v9dM~&lF6s8-Vn$d}AJWzGv;FHgt`u@rNEC$q{Gz0Gi!4qwc3lzC@ zg(;(LSs*%Ay;ttiKp87^Eiz&7LzAWg%aeZziE4_g*~P+0GmG<3@xsU+OWj3_l=Xi! z2erU75iCXg#)T1W>hC+Z;#XdBva<;92E!dD-IU!D5{K;Nt%d`$>3q1q$;5$PQXtee z1hn~3AP$Nd9Vl87r6$Pn|Ikkzzi8hynHxA)9Vih0s>oSvi3cF+fDX;#><_3r4W#qB@a=1Hs{yHOp3hH zXrd9fA=}}-MCBjPMq$MThro7V=*NMaqF={lUL$zVQ%PVqtroIs(;(y83Q78- zWq}y%$cjJC3WnH4w(yyUZVzKx0{gBhm0Ko8kl9e+q8^8zrue9 z#Zj)#L8Onp<;qsnx&C2XFKg48)%W|wW{D4unkIVPvAO|CQXI_*P37ms4(G9>Dyh+HYS$ zpYtn|`qrzHLC&=%PYhu&u%9DwGJ47?(FhXeUF#MPn^YUxT11i`3ikaWXP?g0uru}aa;59e0Jj}oZE&?PGrX2a}M=E0IT_r(>e?mKu^16M|GZW^#@W;f~;z;)0!-Bc$ z(6aWvRe$8a0jX7(9?8mn1N5W?1KNLJ))di@Pd$!@?)3<5M+iwWqX2HqP(9p zcT5rsl#T%AlUr&dL% zANJ7nys2)wM-KJf7$R5dPOdsR2QMN|sPWY#TDH=P4RG6mfL{|8O_&MC5Q>APqqPPR zLIq!>_Vm{XD>K6EpVSztI~XHsKJQvUj76{1Sn=7N#)kKvYA(U1Eypld707-&SWFv+ zQBLZpmF9e0GB#Oh4FtTF{^YAO1#tygGf#RoXQmzmu+09VerECYWb-C`Gg#QkPE6K# zxdKe6eXxGN-V_-5kn`r#jqg+nn+6SwJxg4Pm)`o7am$*(wZCiR>y#SpQ80eD#Yq_B zz>|RzKofx_0EJ+6%Hz4BwxJ}?tisB!)gj^cyL%n$@^P#EkzP8zz@8})V#|}%J`d&6 zIU3vZ*!T1yScPyF43urvZ`akO3Azryu+CYfMb3oby#T;x?{3%I2#gti zK+I$yeD$~OXFW1R21GeRgD|Zx7p)2qT{5e#X0=4s4qm2itiDNg0A2;=&UQ)4y^>CT zQyi|^f@xWkFg*QNo-ir*WfS3Y*s>{RpNqMWqS0Ihw6B=5FS3ohG!Uj)5z-A|e^A_^ zDoBpXs(DDbnsJ6+icC#Cy4jMY`Z9bc%QKf>*%)$ouq<_FAspK8l?Fj=>$-1A9G?(o zjAamfc`rp~2YtZo^{|zLrNypgoS`^bATf#s3AqpyLs6c{P8=|lrJ8KP(@gt2$G|tY zsnoA{D53$vAI3FRr>F>FZOmmA$IbaAXB;yg{Fvtaei zQcB5Wr6V4E1_CfGp$rF|^=%Gm@!<_QMC^8CKN<~wc)b)zbc zcmL(Ze~ScN(#s9%m=Loz>sjRIikPZLFRjhj?3!KD5N54P6<(MlSjo|etfnrOH@d*x zep95@d>)&f$mATGJQh+%P2l`Sd+ytSJtyn*nU3f4e<5e6;;R0M{ zTP#(54#Rh;HrI$z5}!#(=+^t=T>-HqtdzxX?)*;#!qcPJh8nLq5ZR$iIavew#@}!< znz{pvlC3MPVAMso2o<8&+_N@!Hp(-E(5lo$R+MI#vzFE|2u?432S8!oS+IaYC4k$W zRqq7E_39dpm`h>B=g~1UyPW%t5fL|Hx{AAoM4Ic*_or%o0Bh7GXmpCxFInm(XI=5N z9X=9d76cN5C1#R4d(*1fo+NrfE{9OjV!Q)PLV(r14^Mf4fdkfHV(X~#r{Gr=ewsWP z47gwHH+i&YW5=6IH|eNZgcKf*7y5tUj*K2EYh=iHO;Q!Yla!y4%Bp`+<#73VbV8W% zeAs8PQm4>Mk0M?z!;|j7o}hY1vj0&Vsu^aT$DNYgF$j{B^a)`}d%1VHw z4kQcV+h9Zf4}FJw*gLjF9Ew~)RNuTm)yCyS`c1o~Jkje3PJo-MKwx`bF>i=60A$uS zQ-?TB@V4hnuH4s5G5^JX-G&`mQ43)+wV1Q?5ZOu&Pcs>)(`EaMAkL|ddSEDWGz?{b zDFk`87}h(nrQZ=?Px2E!{#MK_8(Jpeygz<-9|PcarQC1w;65n~$u zC5m5q?9sV@CTNJw93DzNN!yyow|^P*`AVM&bMkZ1iE)TCiPMTs46g1Z@uoyy-cvA5 zE@YMLf2Xy>1HhfkzBy+FGc^}**9HGtImm4d&Vnjf>BUkqd}pBrnl&o?^_RB)|CdS7 z&%IoWQCVk;qEOFS0rhh`&kI#$jekwFbfbl27RuuYbA7(-ylyx41;G$oO2nNUJ(Q@R z)KO%fsvV>5dOVYmU991?Q&{3nuhkGns5v{^wFe_*?B#1NiwVd@;DWkd(RI{tqmbml zG;V`#jv9v%xQSs+K9>GuZpP&0Uv73BB|_P0*KG9|x8o;WMi{+@;+cxO<+Eqr-MJcKtIS z5o)nN3$B6$Zes_Idl~i?o{W(lS(Hh&I0q9PeK!Ak+3&Kt*XeNE;0cd$pFdwHhRBEQ zra>o=z7|chSWO=Z!uShdBMd&be)NE5Xl?{CTwgI_()Qd>H!Ix5p#)C=JibLgnkxu> ze2aJSXu)mr8S#NB&1ORd!y?xUNSwzS%@;uBkQo;vw~+e2O*^UPZS@qVEb~SP2Gd7a z1H$NA_4IUOntq<)#nH)Gb0Rjbo$tzXI)B%EW`$9;5RxwoUb0uAO;ae;DrriGIK-NX?~Um4qBIw@8swPf+0Sf%7-!*z6u?{GN!x6A{6z4*J6 zq={FW_$&P=-7p)$K+I2XeytIN3p#=#zI}_w)>Zkf?N{@kjJ~5DYqa!r7Hcu+vlTc! zNy0q;Ne0Y~42^T`i~>i3p^`2s z`XU7d@B&~pY0>im6QNN>5LmQY3|Is#ShP{7dKE^|dNFmwoE7t-G&0tlP)JtSBd*3d z-;ES2Z>-cP;Pfoae%!N##T*CTb$Qm!mI>1yj(fJR%lAD)TaBTA+y@pQ7~ zA+VV>9#%$XPHJzs+BwN=G-eEs=vKb4xB(!UHQ=pj>~PeT8o=K@8qLjP)5he@Q6c-G zl#HU2PU#7ccB6~D5$8%9?QsZ|B7T}S`V10PB>QfS<{@b!;9~eh4U}3pr?uva7?`c!6T_wFI)Jfw38jMDv<(A zm5B3rV|dPCC8f`$|I$=#5WT0;0xKlOPxfCKi>blWG4!35--5pJzA4)#DOoWPgQ{

>PK47JDS4-@Aj3y}xLbAaukv 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

$h}PF4;zTl#kLY*`fAAp2>w6bvhA)78eEMZE}6( z+;`uKp}fOBXL#l`M28H8oR^PGx`t|zgc9i(mL!I&g|`tMQ4zjkVoX%XSK>2N5#90& zoeDZsZ-S$%Dp6fg*PH(4=U$xJkLbR(_=6BG7?rvgWeYzDT|dI-(7lus8PULDZKXfe zEVBdic}VrR8WFW#Sz3*nSp{w$jL92PoAdsR66eIjouGHuF2}^sY^I0PG9i)j6Xb_) z#D_$rePPg&RqxEcFXr_0ac2%0A&S{pDUxTO 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%0A6O1@P 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 rYdR!q)`EUBXc!6;xXD#^zfeX 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�_vHRs;{~~n00OPiL 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%0A+nZo2O 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�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%0A!7`X%Htgo&>w0(;~6j&JO;JG3TAgthtvWJj@~) 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%0Aa`>n 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 z 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

0V9rTEDcsC3EWardoO$=~ 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%0D%_Z>hh{eK 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∾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

81QL089-4@ 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