InfObj DEFINITIONS ::= BEGIN RANAP-ELEMENTARY-PROCEDURE ::= CLASS { &InitiatingMessage , &SuccessfulOutcome OPTIONAL, &Outcome DEFAULT NULL, &vartypvalue &Outcome OPTIONAL, &FixTypeValSet PrintableString OPTIONAL, &VarTypeValSet &InitiatingMessage OPTIONAL, &infoObject RANAP-ELEMENTARY-PROCEDURE OPTIONAL, &InfObjectSet CLASS2 OPTIONAL, &UnsuccessfulOutcome OPTIONAL, &procedureCode ProcedureCode UNIQUE, &criticality Criticality DEFAULT ignore } WITH SYNTAX { INITIATING MESSAGE &InitiatingMessage [SUCCESSFUL OUTCOME &SuccessfulOutcome] [UNSUCCESSFUL OUTCOME &UnsuccessfulOutcome] [OUTCOME &Outcome] PROCEDURE CODE &procedureCode [CRITICALITY &criticality] [VARTYPEVALUE &vartypvalue] [FIXT &FixTypeValSet] [VART &VarTypeValSet] [INFOOBJECT &infoObject] [INFOOBJECTSET &InfObjectSet] } RANAP-PDU ::= CHOICE { initiatingMessage InitiatingMessage, -- successfulOutcome SuccessfulOutcome, -- unsuccessfulOutcome UnsuccessfulOutcome, -- outcome Outcome, ... } CLASS2 ::= RANAP-ELEMENTARY-PROCEDURE InitiatingMessage ::= SEQUENCE { procedureCode RANAP-ELEMENTARY-PROCEDURE.&procedureCode ({RANAP-ELEMENTARY-PROCEDURES}), criticality RANAP-ELEMENTARY-PROCEDURE.&criticality ({RANAP-ELEMENTARY-PROCEDURES}{@procedureCode}), value RANAP-ELEMENTARY-PROCEDURE.&InitiatingMessage ({RANAP-ELEMENTARY-PROCEDURES}{@procedureCode}) } iu-Release RANAP-ELEMENTARY-PROCEDURE ::= { INITIATING MESSAGE Iu-ReleaseCommand SUCCESSFUL OUTCOME Iu-ReleaseComplete PROCEDURE CODE id-Iu-Release1 CRITICALITY ignore } relocationPreparation RANAP-ELEMENTARY-PROCEDURE ::= { INITIATING MESSAGE INTEGER --Iu-ReleaseCommand SUCCESSFUL OUTCOME Iu-ReleaseComplete PROCEDURE CODE id-Iu-Release2 CRITICALITY notify } object3 RANAP-ELEMENTARY-PROCEDURE ::= { &InitiatingMessage Iu-ReleaseCommand, &SuccessfulOutcome Iu-ReleaseComplete, &procedureCode id-Iu-Release3, &criticality reject } object4 RANAP-ELEMENTARY-PROCEDURE ::= { &InitiatingMessage INTEGER, &SuccessfulOutcome PrintableString, &procedureCode id-Iu-Release4, &criticality reject } object5 RANAP-ELEMENTARY-PROCEDURE ::= { &InitiatingMessage INTEGER, &SuccessfulOutcome PrintableString, &Outcome ProcedureCode, &vartypvalue 12, &infoObject object4, &InfObjectSet MyObjectSet, &procedureCode id-Iu-Release5, &criticality reject } RANAP-ELEMENTARY-PROCEDURES RANAP-ELEMENTARY-PROCEDURE ::= { iu-Release | relocationPreparation , ... } RANAP-ELEMENTARY-PROCEDURES2 RANAP-ELEMENTARY-PROCEDURE ::= { iu-Release | relocationPreparation } OBJECTSET1 RANAP-ELEMENTARY-PROCEDURE ::= { {INITIATING MESSAGE Iu-ReleaseCommand SUCCESSFUL OUTCOME Iu-ReleaseComplete PROCEDURE CODE id-Iu-Release1 CRITICALITY ignore} | {INITIATING MESSAGE Iu-ReleaseCommand PROCEDURE CODE id-Iu-Release2} } OBJECTSET2 RANAP-ELEMENTARY-PROCEDURE ::= { iu-Release | {INITIATING MESSAGE Iu-ReleaseCommand SUCCESSFUL OUTCOME Iu-ReleaseComplete PROCEDURE CODE id-Iu-Release4 CRITICALITY ignore} | relocationPreparation | {INITIATING MESSAGE Iu-ReleaseCommand PROCEDURE CODE id-Iu-Release5} , ... } OBJECTSET3 RANAP-ELEMENTARY-PROCEDURE ::= { iu-Release, ... } OBJECTSET4 RANAP-ELEMENTARY-PROCEDURE ::= { iu-Release } Iu-ReleaseCommand ::= SEQUENCE { first INTEGER, second BOOLEAN } Iu-ReleaseComplete ::= INTEGER (1..510) ProcedureCode ::= INTEGER (0..255) Criticality ::= ENUMERATED { reject, ignore, notify } id-Iu-Release1 INTEGER ::= 1 id-Iu-Release2 INTEGER ::= 2 id-Iu-Release3 INTEGER ::= 3 id-Iu-Release4 INTEGER ::= 4 id-Iu-Release5 INTEGER ::= 5 -- -- MY-CLASS -- Seq ::= SEQUENCE { int INTEGER, str OCTET STRING } MY-CLASS ::= CLASS { &Count DEFAULT INTEGER, &integerValue INTEGER UNIQUE, &booleanValue BOOLEAN, &stringValue PrintableString } myobject MY-CLASS ::= { &integerValue 12, &booleanValue TRUE, &stringValue "hejsan" } myotherobject MY-CLASS ::= { &Count Seq, &integerValue 42, &booleanValue FALSE, &stringValue "hoppsan" } MyObjectSet MY-CLASS ::= { myobject | myotherobject | { -- Each character will be encoded in 3 bits in UPER, 4 bits in PER. &Count NumericString (FROM("01234567") ^ SIZE(8)), &integerValue 43, &booleanValue TRUE, &stringValue "tjosan" } } MyPdu ::= SEQUENCE { count MY-CLASS.&Count ({MyObjectSet}{@int}), int MY-CLASS.&integerValue ({MyObjectSet}), bool MY-CLASS.&booleanValue ({MyObjectSet}{@int}), str MY-CLASS.&stringValue ({MyObjectSet}{@int}) } Seq2 ::= SEQUENCE { int MY-CLASS.&integerValue ({MyObjectSet}), seqof SEQUENCE (1..10) OF MY-CLASS.&booleanValue ({MyObjectSet}{@int}), setof SET (1..10) OF MY-CLASS.&booleanValue ({MyObjectSet}{@int}) } -- -- Class with constructed default -- CONSTRUCTED-DEFAULT ::= CLASS { &id INTEGER UNIQUE, &Type DEFAULT SEQUENCE { a INTEGER, b BOOLEAN }, &ok BOOLEAN DEFAULT TRUE } constructed1 CONSTRUCTED-DEFAULT ::= { &id 1 } constructed2 CONSTRUCTED-DEFAULT ::= { &id 2, &ok false } ConstructedDefaultSet CONSTRUCTED-DEFAULT ::= { constructed1 | constructed2 | { &id 3, &Type BOOLEAN } | { &id 4, &Type SET { a INTEGER, b BIT STRING } } | { &id 5, &Type CHOICE { i INTEGER, b BIT STRING } } | { &id 6, &Type SEQUENCE OF INTEGER (1..16) } | { &id 7, &Type SET OF INTEGER (1..64) } | { &id 8, &Type SEQUENCE OF SEQUENCE { x INTEGER, y INTEGER } } | { &id 9, &Type SET OF SEQUENCE { x INTEGER, y INTEGER } } } ConstructedPdu ::= SEQUENCE { id CONSTRUCTED-DEFAULT.&id ({ConstructedDefaultSet}), content CONSTRUCTED-DEFAULT.&Type ({ConstructedDefaultSet}{@id}) } ConstructedSet ::= SET { id [0] CONSTRUCTED-DEFAULT.&id ({ConstructedDefaultSet}), content [1] CONSTRUCTED-DEFAULT.&Type ({ConstructedDefaultSet}{@id}) } -- Test OPTIONAL and DEFAULT OptionalInSeq ::= SEQUENCE { id CONSTRUCTED-DEFAULT.&id ({ConstructedDefaultSet}), content CONSTRUCTED-DEFAULT.&Type ({ConstructedDefaultSet}{@id}) OPTIONAL } DefaultInSeq ::= SEQUENCE { id CONSTRUCTED-DEFAULT.&id ({ConstructedDefaultSet}), content CONSTRUCTED-DEFAULT.&Type ({ConstructedDefaultSet}{@id}) DEFAULT BOOLEAN:TRUE } -- Test more than one optional typefield table constraint in a SEQUENCE. MULTIPLE-OPTIONALS ::= CLASS { &id INTEGER UNIQUE, &T1, &T2, &T3 } multiple-optionals-1 MULTIPLE-OPTIONALS ::= {&id 1, &T1 INTEGER, &T2 BOOLEAN, &T3 OCTET STRING} Multiple-Optionals-Set MULTIPLE-OPTIONALS ::= { multiple-optionals-1 } Multiple-Optionals ::= SEQUENCE { id MULTIPLE-OPTIONALS.&id ({Multiple-Optionals-Set}), t1 [0] MULTIPLE-OPTIONALS.&T1 ({Multiple-Optionals-Set}{@id}) OPTIONAL, t2 [1] MULTIPLE-OPTIONALS.&T2 ({Multiple-Optionals-Set}{@id}) OPTIONAL, t3 [2] MULTIPLE-OPTIONALS.&T3 ({Multiple-Optionals-Set}{@id}) OPTIONAL } -- Test different ways of constructing object sets. OBJECT-SET-TEST ::= CLASS { &id INTEGER UNIQUE, &Type } WITH SYNTAX { &id IS &Type } ObjectSetTest{OBJECT-SET-TEST:ObjectSet} ::= SEQUENCE { id OBJECT-SET-TEST.&id ({ObjectSet}), type OBJECT-SET-TEST.&Type ({ObjectSet}{@id}) } ost1 OBJECT-SET-TEST ::= { 1 IS BIT STRING } ost2 OBJECT-SET-TEST ::= { 2 IS OCTET STRING } ost3 OBJECT-SET-TEST ::= { 3 IS ENUMERATED {donald,scrooge} } ost4 OBJECT-SET-TEST ::= { 4 IS BOOLEAN } ost5 OBJECT-SET-TEST ::= { 5 IS INTEGER (0..15) } Ost12 OBJECT-SET-TEST ::= { ost1 | ost2 } Ost123 OBJECT-SET-TEST ::= { ost3 | Ost12 } Ost1234 OBJECT-SET-TEST ::= { Ost123 | ost4 } Ost45 OBJECT-SET-TEST ::= { ost4 | ost5 } Ost12345 OBJECT-SET-TEST ::= { Ost123 | Ost45 } OstSeq12 ::= ObjectSetTest{ {Ost12} } OstSeq123 ::= ObjectSetTest{ {Ost123} } OstSeq1234 ::= ObjectSetTest{ {Ost1234} } OstSeq45 ::= ObjectSetTest{ {Ost45} } OstSeq12345 ::= ObjectSetTest{ {Ost12345} } OstSeq12Except ::= ObjectSetTest{ {Ost123 EXCEPT ost3} } OstSeq123Except ::= ObjectSetTest{ {Ost12345 EXCEPT Ost45} } ExOst1 OBJECT-SET-TEST ::= { ost1, ... } ExOst12 OBJECT-SET-TEST ::= { ost1, ..., ost2 } ExOst123 OBJECT-SET-TEST ::= { ost3, ..., ExOst12 } ExOst1234 OBJECT-SET-TEST ::= { ExOst123, ..., ost4 } ExOst45 OBJECT-SET-TEST ::= { ost4, ..., ost5 } ExOst12345 OBJECT-SET-TEST ::= { ExOst123, ..., ExOst45 } ExOstSeq1 ::= ObjectSetTest{ {ExOst1} } ExOstSeq12 ::= ObjectSetTest{ {ExOst12} } ExOstSeq123 ::= ObjectSetTest{ {ExOst123} } ExOstSeq1234 ::= ObjectSetTest{ {ExOst1234} } ExOstSeq45 ::= ObjectSetTest{ {ExOst45} } ExOstSeq12345 ::= ObjectSetTest{ {ExOst12345} } ExOstSeq12Except ::= ObjectSetTest{ {ExOst123 EXCEPT ost3} } ExOstSeq123Except ::= ObjectSetTest{ {ExOst12345 EXCEPT ExOst45} } ExInlOst1 OBJECT-SET-TEST ::= { { 1 IS BIT STRING }, ... } ExInlOst12 OBJECT-SET-TEST ::= { { 1 IS BIT STRING }, ..., { 2 IS OCTET STRING } } ExInlOstSeq1 ::= ObjectSetTest{ {ExInlOst1} } ExInlOstSeq12 ::= ObjectSetTest{ {ExInlOst12} } -- -- Test that extensions in a simple class works. -- ExtClassSeq ::= SEQUENCE { arg EXT-CLASS.&id({Extend}) } EXT-CLASS ::= CLASS { &id INTEGER UNIQUE } WITH SYNTAX { ID &id } Extend EXT-CLASS ::= { { ID alt1 } | { ID alt2 }, ... } alt1 INTEGER ::= 4 alt2 INTEGER ::= 5 -- -- Test a BIT STRING which is optional in the simplified syntax. -- PUBLIC-KEY ::= CLASS { &id INTEGER UNIQUE, &keyUsage KeyUsage OPTIONAL } WITH SYNTAX { IDENTIFIER &id [OPTIONAL-BIT-STRING &keyUsage] } KeyUsage ::= BIT STRING { digitalSignature (0), nonRepudiation (1), keyEncipherment (2) } object-with-optional-bit-string PUBLIC-KEY ::= { IDENTIFIER 42 OPTIONAL-BIT-STRING {digitalSignature, nonRepudiation, keyEncipherment} } -- Test object identifiers from objects. CONTAINER ::= CLASS { &id OBJECT IDENTIFIER UNIQUE, &rid RELATIVE-OID OPTIONAL, &Type OPTIONAL } WITH SYNTAX { IDENTIFIED BY &id [REL-OID &rid] [TYPE &Type] } id1 OBJECT IDENTIFIER ::= {1 2 42} obj1 CONTAINER ::= { IDENTIFIED BY id1 REL-OID {100 101} } value-2 OBJECT IDENTIFIER ::= { value-1 25 } value-1 OBJECT IDENTIFIER ::= obj1.&id value-3 RELATIVE-OID ::= obj1.&rid value-4 OBJECT IDENTIFIER ::= { 1 2 value-3 } -- Test an obscure issue when ATTRIBUTE.&id was not -- properly evaluated. Rdn ::= SingleAttribute { {SupportedAttributes} } ATTRIBUTE ::= CLASS { &id OBJECT IDENTIFIER UNIQUE, &Type OPTIONAL } SingleAttribute{ATTRIBUTE:AttrSet} ::= SEQUENCE { type ATTRIBUTE.&id({AttrSet}), value ATTRIBUTE.&Type({AttrSet}{@type}) } AttributeType ::= ATTRIBUTE.&id SupportedAttributes ATTRIBUTE ::= { at-name } id-at OBJECT IDENTIFIER ::= { 2 5 4 41 } id-at-name AttributeType ::= id-at at-name ATTRIBUTE ::= { &Type PrintableString, &id id-at-name } -- -- Test using an alias for TYPE-IDENTIFIER. -- TiAliasParameterized { TI-ALIAS:InfoObjectSet } ::= SEQUENCE { algorithm TI-ALIAS.&id({InfoObjectSet}), parameters TI-ALIAS.&Type({InfoObjectSet} {@algorithm}) OPTIONAL } TI-ALIAS ::= TYPE-IDENTIFIER TiAliasSeq ::= SEQUENCE { prf TiAliasParameterized {{TiAliasSet}} } TiAliasSet TI-ALIAS ::= { {NULL IDENTIFIED BY {2 1 2}}, ... } -- -- Test using an alias for a class. -- ALIAS-CONTAINER ::= CLASS { &id INTEGER UNIQUE, &obj INDIRECT-CLASS } INDIRECTED-CLASS ::= CLASS { &id INTEGER UNIQUE, &Type } INDIRECT-CLASS ::= INDIRECTED-CLASS -- -- Indirect ObjectClassFieldType in a SEQUENCE. -- ContentInfo ::= SEQUENCE { contentType ContentType, -- Indirect ObjectClassFieldType content TYPE-IDENTIFIER.&Type({Contents}{@contentType}) OPTIONAL } Contents TYPE-IDENTIFIER ::= { {IA5String IDENTIFIED BY id-content-type} } ContentType ::= TYPE-IDENTIFIER.&id({Contents}) id-content-type ContentType ::= { 2 7 8 9 } -- -- Tricky parsing of simplified syntax. -- TrickyType-1 ::= BIT STRING TrickyType-2 ::= OCTET STRING TRICKY ::= CLASS { &Type1, &Type2 } WITH SYNTAX { TYPE &Type1 &Type2 } tricky-object TRICKY ::= {TYPE TrickyType-1 TrickyType-2} tricky-bit-string tricky-object.&Type1 ::= '1011'B tricky-octet-string tricky-object.&Type1 ::= 'CAFE'H END