MEDIA-GATEWAY-CONTROL-v2 
{itu-t(0) recommendation(0) h(8) h248(248) 
 modules(0) media-gateway-control(0) version2(2)} 
DEFINITIONS AUTOMATIC TAGS ::= 
BEGIN 
       

MegacoMessage ::= SEQUENCE 
 { 
   authHeader     AuthenticationHeader OPTIONAL, 
   mess           Message 
 } 

AuthenticationHeader ::= SEQUENCE 
 { 
   secParmIndex   SecurityParmIndex, 
   seqNum         SequenceNum, 
   ad             AuthData 
 } 

SecurityParmIndex ::= OCTET STRING(SIZE(4)) 

SequenceNum       ::= OCTET STRING(SIZE(4)) 

AuthData          ::= OCTET STRING (SIZE (12..32)) 

Message ::= SEQUENCE 
 { 
   version           INTEGER(0..99), 
   -- The version of the protocol defined here is equal to 2. 
   mId               MId,  -- Name/address of message originator 
   messageBody CHOICE 
    { 
      messageError      ErrorDescriptor, 
      transactions      SEQUENCE OF Transaction 
    }, 
   ... 
 } 

MId ::= CHOICE 
 { 
   ip4Address           IP4Address, 
   ip6Address           IP6Address, 
   domainName           DomainName, 
   deviceName           PathName, 
   mtpAddress           OCTET STRING(SIZE(2..4)), 
   -- Addressing structure of mtpAddress: 
   --     25 - 15              0 
   --     |  PC           | NI | 
   --     24 - 14 bits    2 bits 
   -- Note: 14 bits are defined for international use. 
   -- Two national options exist where the point code is 16 or 24   
   -- bits. 
   -- To octet align the mtpAddress, the MSBs shall be encoded as 0s. 
   ... 
 } 

DomainName ::= SEQUENCE 
 { 
   name        IA5String, 
   -- The name starts with an alphanumeric digit followed by a 
   -- sequence of alphanumeric digits, hyphens and dots.  No two 
   -- dots shall occur consecutively. 
   portNumber     INTEGER(0..65535) OPTIONAL 
 } 

IP4Address ::= SEQUENCE 
 { 
   address        OCTET STRING (SIZE(4)), 
   portNumber     INTEGER(0..65535) OPTIONAL 
 } 

IP6Address ::= SEQUENCE 
 { 
   address        OCTET STRING (SIZE(16)), 
   portNumber     INTEGER(0..65535) OPTIONAL 
 } 

PathName ::= IA5String(SIZE (1..64)) 
-- See A.3 

Transaction ::= CHOICE 
 { 
   transactionRequest      TransactionRequest, 
   transactionPending      TransactionPending, 
   transactionReply        TransactionReply, 
   transactionResponseAck  TransactionResponseAck, 
   -- use of response acks is dependent on underlying transport 
   ... 
 } 

TransactionId ::= INTEGER(0..4294967295)  -- 32-bit unsigned integer 

TransactionRequest ::= SEQUENCE 
 { 
   transactionId        TransactionId, 
   actions              SEQUENCE OF ActionRequest, 
   ... 
 } 

TransactionPending ::= SEQUENCE 
 { 
   transactionId        TransactionId, 
   ... 
 } 

TransactionReply ::= SEQUENCE 
 { 
   transactionId        TransactionId, 
   immAckRequired       NULL OPTIONAL, 
   transactionResult    CHOICE 
    { 
      transactionError   ErrorDescriptor, 
      actionReplies      SEQUENCE OF ActionReply 
    }, 
   ... 
 } 

TransactionResponseAck ::= SEQUENCE OF TransactionAck 
TransactionAck ::= SEQUENCE 
 { 
   firstAck       TransactionId, 
   lastAck        TransactionId OPTIONAL 
 } 

ErrorDescriptor ::= SEQUENCE 
 { 
   errorCode      ErrorCode, 
   errorText      ErrorText OPTIONAL 
 } 

ErrorCode ::= INTEGER(0..65535) 
-- See clause 14 for IANA considerations with respect to error codes 
ErrorText ::= IA5String 

ContextID ::= INTEGER(0..4294967295) 

-- Context NULL Value: 0 
-- Context CHOOSE Value: 4294967294 (0xFFFFFFFE)  
-- Context ALL Value: 4294967295 (0xFFFFFFFF) 


ActionRequest ::= SEQUENCE 
 { 
   contextId            ContextID, 
   contextRequest       ContextRequest OPTIONAL, 
   contextAttrAuditReq  ContextAttrAuditRequest OPTIONAL, 
   commandRequests      SEQUENCE OF CommandRequest 
 } 

ActionReply ::= SEQUENCE 
 { 
   contextId         ContextID, 
   errorDescriptor   ErrorDescriptor OPTIONAL, 
   contextReply      ContextRequest OPTIONAL, 
   commandReply      SEQUENCE OF CommandReply 
 } 

ContextRequest ::= SEQUENCE 
 { 
   priority       INTEGER(0..15) OPTIONAL, 
   emergency      BOOLEAN OPTIONAL, 
   topologyReq    SEQUENCE OF TopologyRequest OPTIONAL, 
   ... 
 } 

ContextAttrAuditRequest ::= SEQUENCE 
 { 
   topology    NULL OPTIONAL, 
   emergency   NULL OPTIONAL, 
   priority    NULL OPTIONAL, 
   ... 
 } 

CommandRequest ::= SEQUENCE 
 { 
   command           Command, 
   optional          NULL OPTIONAL, 
   wildcardReturn    NULL OPTIONAL, 
   ... 
 } 

Command ::= CHOICE 
 { 
   addReq               AmmRequest, 
   moveReq              AmmRequest, 
   modReq               AmmRequest, 
   -- Add, Move, Modify requests have the same parameters 
   subtractReq          SubtractRequest, 
   auditCapRequest      AuditRequest, 
   auditValueRequest    AuditRequest, 
   notifyReq            NotifyRequest, 
   serviceChangeReq     ServiceChangeRequest, 
   ... 
 } 

CommandReply ::= CHOICE 
 { 
   addReply                AmmsReply, 
   moveReply               AmmsReply, 
   modReply                AmmsReply, 
   subtractReply           AmmsReply, 
   -- Add, Move, Modify, Subtract replies have the same parameters 
   auditCapReply           AuditReply, 
   auditValueReply         AuditReply, 
   notifyReply             NotifyReply, 
   serviceChangeReply      ServiceChangeReply, 
   ... 
 } 

TopologyRequest ::= SEQUENCE 
 { 
   terminationFrom         TerminationID, 
   terminationTo           TerminationID, 
   topologyDirection       ENUMERATED 
    { 
      bothway(0), 
      isolate(1), 
      oneway(2) 
    }, 
   ..., 
   streamID             StreamID OPTIONAL 
 } 

AmmRequest ::= SEQUENCE 
 { 
   terminationID        TerminationIDList, 
   descriptors          SEQUENCE OF AmmDescriptor, 
   -- At most one descriptor of each type (see AmmDescriptor) 
   -- allowed in the sequence. 
   ... 
 } 

AmmDescriptor ::= CHOICE 
 { 
   mediaDescriptor         MediaDescriptor, 
   modemDescriptor         ModemDescriptor, 
   muxDescriptor           MuxDescriptor, 
   eventsDescriptor        EventsDescriptor, 
   eventBufferDescriptor   EventBufferDescriptor, 
   signalsDescriptor       SignalsDescriptor, 
   digitMapDescriptor      DigitMapDescriptor, 
   auditDescriptor         AuditDescriptor, 
   ... 
 } 


AmmsReply ::= SEQUENCE 
 { 
   terminationID        TerminationIDList, 
   terminationAudit     TerminationAudit OPTIONAL, 
   ... 
 } 

SubtractRequest ::= SEQUENCE 
 { 
   terminationID        TerminationIDList, 
   auditDescriptor      AuditDescriptor OPTIONAL, 
   ... 
 } 

AuditRequest ::= SEQUENCE 
 { 
   terminationID        TerminationID, 
   auditDescriptor      AuditDescriptor, 
   ... 
 } 

AuditReply ::= CHOICE 
 { 
   contextAuditResult   TerminationIDList, 
   error                ErrorDescriptor, 
   auditResult          AuditResult, 
   ... 
 } 

AuditResult ::= SEQUENCE 
 { 
   
   terminationID           TerminationID, 
   terminationAuditResult  TerminationAudit 
 } 



TerminationAudit ::= SEQUENCE OF AuditReturnParameter 

AuditReturnParameter ::= CHOICE 
 { 
   errorDescriptor            ErrorDescriptor, 
   mediaDescriptor            MediaDescriptor, 
   modemDescriptor            ModemDescriptor, 
   muxDescriptor              MuxDescriptor, 
   eventsDescriptor           EventsDescriptor, 
   eventBufferDescriptor      EventBufferDescriptor, 
   signalsDescriptor          SignalsDescriptor, 
   digitMapDescriptor         DigitMapDescriptor, 
   observedEventsDescriptor   ObservedEventsDescriptor, 
   statisticsDescriptor       StatisticsDescriptor, 
   packagesDescriptor         PackagesDescriptor, 
   emptyDescriptors           AuditDescriptor, 
   ... 
 } 

AuditDescriptor ::= SEQUENCE 
 { 
   auditToken  BIT STRING 
    { 
      muxToken(0), modemToken(1), mediaToken(2), 
      eventsToken(3), signalsToken(4), 
      digitMapToken(5), statsToken(6), 
      observedEventsToken(7), 
      packagesToken(8), eventBufferToken(9) 
    } OPTIONAL, 
   ..., 
   auditPropertyToken SEQUENCE OF IndAuditParameter OPTIONAL 
 } 


IndAuditParameter ::= CHOICE 
 { 
   -- Note that the lower/upper case letters of the tags have 
   -- been changed. The same changes has been made in text...
   indAudMediaDescriptor         IndAudMediaDescriptor, 
   indAudEventsDescriptor        IndAudEventsDescriptor, 
   indAudEventBufferDescriptor   IndAudEventBufferDescriptor, 
   indAudSignalsDescriptor       IndAudSignalsDescriptor, 
   indAudDigitMapDescriptor      IndAudDigitMapDescriptor, 
   indAudStatisticsDescriptor    IndAudStatisticsDescriptor, 
   indAudPackagesDescriptor      IndAudPackagesDescriptor, 
   ... 
 } 

IndAudMediaDescriptor ::= SEQUENCE 
 { 
   
   termStateDescr    IndAudTerminationStateDescriptor OPTIONAL, 
   streams  CHOICE 
    { 
      oneStream      IndAudStreamParms, 
      multiStream    SEQUENCE OF IndAudStreamDescriptor 
    } OPTIONAL, 
   ... 
 } 

IndAudStreamDescriptor ::= SEQUENCE 
 { 
   streamID                StreamID, 
   streamParms             IndAudStreamParms 
 } 

IndAudStreamParms ::= SEQUENCE 
 { 
   localControlDescriptor  IndAudLocalControlDescriptor OPTIONAL, 
   localDescriptor         IndAudLocalRemoteDescriptor OPTIONAL, 
   remoteDescriptor        IndAudLocalRemoteDescriptor OPTIONAL, 
   ... 
 } 

IndAudLocalControlDescriptor ::= SEQUENCE 
 { 
   streamMode              NULL OPTIONAL, 
   reserveValue            NULL OPTIONAL, 
   reserveGroup            NULL OPTIONAL, 
   propertyParms           SEQUENCE OF IndAudPropertyParm OPTIONAL, 
   ... 
 } 

IndAudPropertyParm ::= SEQUENCE 
 { 
   name     PkgdName, 
   ... 
 } 

IndAudLocalRemoteDescriptor ::= SEQUENCE 
 { 
   propGroupID    INTEGER(0..65535) OPTIONAL, 
   propGrps       IndAudPropertyGroup, 
   ... 
 } 

IndAudPropertyGroup ::= SEQUENCE OF IndAudPropertyParm 

IndAudTerminationStateDescriptor ::= SEQUENCE  
 { 
   propertyParms        SEQUENCE OF IndAudPropertyParm, 
   eventBufferControl   NULL OPTIONAL, 
   serviceState         NULL OPTIONAL, 
   ... 
 } 

IndAudEventsDescriptor ::= SEQUENCE 
 { 
   requestID      RequestID OPTIONAL, 
   pkgdName       PkgdName, 
   streamID       StreamID OPTIONAL, 
   ... 
 } 

IndAudEventBufferDescriptor ::= SEQUENCE 
 { 
   eventName   PkgdName, 
   streamID    StreamID OPTIONAL, 
   ... 
 } 

IndAudSignalsDescriptor ::=CHOICE 
 { 
   signal         IndAudSignal, 
   seqSigList     IndAudSeqSigList, 
   ... 
 } 

IndAudSeqSigList ::= SEQUENCE 
 { 
   id             INTEGER(0..65535), 
   signalList     IndAudSignal OPTIONAL 
 } 

IndAudSignal ::= SEQUENCE 
 { 
   signalName     PkgdName, 
   streamID       StreamID OPTIONAL, 
   ... 
 } 

IndAudDigitMapDescriptor ::= SEQUENCE 
 { 
   digitMapName   DigitMapName OPTIONAL 
 } 

IndAudStatisticsDescriptor ::= SEQUENCE  
 { 
   statName       PkgdName 
 } 

IndAudPackagesDescriptor ::= SEQUENCE 
 { 
   packageName       Name, 
   packageVersion    INTEGER(0..99), 
   ... 
 } 

NotifyRequest ::= SEQUENCE 
 { 
   terminationID              TerminationIDList, 
   observedEventsDescriptor   ObservedEventsDescriptor, 
   errorDescriptor            ErrorDescriptor OPTIONAL, 
   ... 
 } 

NotifyReply ::= SEQUENCE 
 { 
   terminationID           TerminationIDList, 
   errorDescriptor         ErrorDescriptor OPTIONAL, 
   ... 
 } 

ObservedEventsDescriptor ::= SEQUENCE 
 { 
   requestId               RequestID, 
   observedEventLst        SEQUENCE OF ObservedEvent 
 } 

ObservedEvent ::= SEQUENCE 
 { 
   eventName               EventName, 
   streamID                StreamID OPTIONAL, 
   eventParList            SEQUENCE OF EventParameter, 
   timeNotation            TimeNotation OPTIONAL, 
   ... 
 } 

EventName ::= PkgdName 

EventParameter ::= SEQUENCE 
 { 
   eventParameterName      Name, 
   value                   Value, 
   -- For use of extraInfo see the comment related to PropertyParm 
   extraInfo CHOICE 
    { 
      relation Relation, 
      range    BOOLEAN, 
      sublist  BOOLEAN 
    } OPTIONAL, 
   ... 
   
 } 

ServiceChangeRequest ::= SEQUENCE 
 { 
   terminationID           TerminationIDList, 
   serviceChangeParms      ServiceChangeParm, 
   ... 
 } 

ServiceChangeReply ::= SEQUENCE 
 { 
   terminationID           TerminationIDList, 
   serviceChangeResult     ServiceChangeResult, 
   ... 
 } 

-- For ServiceChangeResult, no parameters are mandatory.  Hence the 
-- distinction between ServiceChangeParm and ServiceChangeResParm. 

ServiceChangeResult ::= CHOICE 
 { 
   errorDescriptor            ErrorDescriptor, 
   serviceChangeResParms      ServiceChangeResParm 
 } 

WildcardField ::= OCTET STRING(SIZE(1)) 

TerminationID ::= SEQUENCE 
 { 
   wildcard       SEQUENCE OF WildcardField,  
   id             OCTET STRING(SIZE(1..8)), 
   ... 
 } 
-- See A.1 for explanation of wildcarding mechanism. 
-- Termination ID 0xFFFFFFFFFFFFFFFF indicates the ROOT Termination. 

TerminationIDList ::= SEQUENCE OF TerminationID 

MediaDescriptor ::= SEQUENCE 
 { 
   termStateDescr    TerminationStateDescriptor OPTIONAL, 
   streams           CHOICE 
    { 
      oneStream      StreamParms, 
      multiStream    SEQUENCE OF StreamDescriptor 
    } OPTIONAL, 
   ... 
 } 

StreamDescriptor ::= SEQUENCE 
 { 
   streamID                StreamID, 
   streamParms             StreamParms 
 } 

StreamParms ::= SEQUENCE 
 { 
   localControlDescriptor     LocalControlDescriptor OPTIONAL, 
   localDescriptor            LocalRemoteDescriptor OPTIONAL, 
   remoteDescriptor           LocalRemoteDescriptor OPTIONAL, 
   ... 
 } 

LocalControlDescriptor ::= SEQUENCE 
 { 
   streamMode        StreamMode OPTIONAL, 
   reserveValue      BOOLEAN OPTIONAL, 
   reserveGroup      BOOLEAN OPTIONAL, 
   propertyParms     SEQUENCE OF PropertyParm, 
   ... 
 } 

StreamMode ::= ENUMERATED  
 { 
   sendOnly(0), 
   recvOnly(1), 
   sendRecv(2), 
   inactive(3), 
   loopBack(4), 
   ... 
 } 

-- In PropertyParm, value is a SEQUENCE OF octet string.  When sent 
-- by an MGC the interpretation is as follows: 
-- empty sequence means CHOOSE 
-- one element sequence specifies value 
-- If the sublist field is not selected, a longer sequence means 
-- "choose one of the values" (i.e. value1 OR value2 OR ...) 
-- If the sublist field is selected, 
-- a sequence with more than one element encodes the value of a 
-- list-valued property (i.e. value1 AND value2 AND ...). 
-- The relation field may only be selected if the value sequence 
-- has length 1.  It indicates that the MG has to choose a value 
-- for the property. E.g. x > 3 (using the greaterThan 
-- value for relation) instructs the MG to choose any value larger 
-- than 3 for property x. 
-- The range field may only be selected if the value sequence 
-- has length 2.  It indicates that the MG has to choose a value 
-- in the range between the first octet in the value sequence and 
-- the trailing octet in the value sequence, including the 
-- boundary values. 
-- When sent by the MG, only responses to an AuditCapability request 
-- may contain multiple values, a range, or a relation field. 

PropertyParm ::= SEQUENCE 
 { 
   name        PkgdName, 
   value       SEQUENCE OF OCTET STRING, 
   extraInfo   CHOICE 
    { 
      relation    Relation, 
      range       BOOLEAN, 
      sublist     BOOLEAN 
    } OPTIONAL, 
   ... 
 } 

Name ::= OCTET STRING(SIZE(2)) 

PkgdName ::= OCTET STRING(SIZE(4)) 
-- represents Package Name (2 octets) plus Property, Event, 
-- Signal Names or Statistics ID. (2 octets) 
-- To wildcard a package use 0xFFFF for first two octets, choose 
-- is not allowed. To reference native property tag specified in 
-- Annex C, use 0x0000 as first two octets. 
-- To wildcard a Property, Event, Signal, or Statistics ID, use 
-- 0xFFFF for last two octets, choose is not allowed. 
-- Wildcarding of Package Name is permitted only if Property, 
-- Event, Signal, or Statistics ID are 
-- also wildcarded. 

Relation ::= ENUMERATED 
 { 
   greaterThan(0), 
   smallerThan(1), 
   unequalTo(2), 
   ... 
 } 

LocalRemoteDescriptor ::= SEQUENCE 
 { 
   propGrps SEQUENCE OF PropertyGroup, 
   ... 
 } 

PropertyGroup ::= SEQUENCE OF PropertyParm 

TerminationStateDescriptor ::= SEQUENCE  
 { 
   propertyParms        SEQUENCE OF PropertyParm, 
   eventBufferControl   EventBufferControl OPTIONAL, 
   serviceState         ServiceState OPTIONAL, 
   ... 
 } 

EventBufferControl ::= ENUMERATED 
 { 
   off(0), 
   lockStep(1), 
   ... 
 } 

ServiceState ::= ENUMERATED 
 { 
   test(0), 
   outOfSvc(1), 
   inSvc(2), 
   ... 
 } 

MuxDescriptor   ::= SEQUENCE 
 { 
   muxType           MuxType, 
   termList          SEQUENCE OF TerminationID, 
   nonStandardData   NonStandardData OPTIONAL, 
   ... 
 } 

MuxType ::= ENUMERATED 
 { 
   h221(0), 
   h223(1), 
   h226(2), 
   v76(3), 
   ..., 
   nx64k(4) 
 } 

StreamID ::= INTEGER(0..65535)   -- 16-bit unsigned integer 

EventsDescriptor ::= SEQUENCE 
 { 
   requestID      RequestID OPTIONAL, 
   -- RequestID must be present if eventList 
   -- is non empty 
   eventList      SEQUENCE OF RequestedEvent, 
   ... 
 } 

RequestedEvent ::= SEQUENCE 
 { 
   pkgdName       PkgdName, 
   streamID       StreamID OPTIONAL, 
   eventAction    RequestedActions OPTIONAL, 
   evParList      SEQUENCE OF EventParameter, 
   ... 
 } 

RequestedActions ::= SEQUENCE 
 { 
   keepActive           BOOLEAN OPTIONAL, 
   eventDM              EventDM OPTIONAL, 
   secondEvent          SecondEventsDescriptor OPTIONAL, 
   signalsDescriptor    SignalsDescriptor OPTIONAL, 
   ... 
 } 

EventDM ::= CHOICE 
 { 
   digitMapName   DigitMapName, 
   digitMapValue  DigitMapValue 
 } 

SecondEventsDescriptor ::= SEQUENCE 
 { 
   requestID         RequestID OPTIONAL, 
   eventList         SEQUENCE OF SecondRequestedEvent, 
   ... 
 } 

SecondRequestedEvent ::= SEQUENCE 
 { 
   pkgdName          PkgdName, 
   streamID          StreamID OPTIONAL, 
   eventAction       SecondRequestedActions OPTIONAL, 
   evParList         SEQUENCE OF EventParameter, 
   ... 
 } 

SecondRequestedActions ::= SEQUENCE 
 { 
   keepActive           BOOLEAN OPTIONAL, 
   eventDM              EventDM OPTIONAL, 
   signalsDescriptor    SignalsDescriptor OPTIONAL, 
   ... 
 } 

EventBufferDescriptor ::= SEQUENCE OF EventSpec 

EventSpec ::= SEQUENCE 
 { 
   eventName      EventName, 
   streamID       StreamID OPTIONAL, 
   eventParList   SEQUENCE OF EventParameter, 
   ... 
 } 


SignalsDescriptor ::= SEQUENCE OF SignalRequest 

SignalRequest ::= CHOICE 
 { 
   signal         Signal, 
   seqSigList     SeqSigList, 
   ... 
 } 

SeqSigList ::= SEQUENCE 
 { 
   id          INTEGER(0..65535), 
   signalList  SEQUENCE OF Signal 
 } 

Signal ::= SEQUENCE 
 { 
   signalName        SignalName, 
   streamID          StreamID OPTIONAL, 
   sigType           SignalType OPTIONAL, 
   duration          INTEGER (0..65535) OPTIONAL, 
   notifyCompletion  NotifyCompletion OPTIONAL, 
   keepActive        BOOLEAN OPTIONAL, 
   sigParList        SEQUENCE OF SigParameter, 
   ... 
 } 

SignalType ::= ENUMERATED 
 { 
   brief(0), 
   onOff(1), 
   timeOut(2), 
   ... 
 } 

SignalName ::= PkgdName 

NotifyCompletion ::= BIT STRING 
 { 
   onTimeOut(0), onInterruptByEvent(1), 
   onInterruptByNewSignalDescr(2), otherReason(3) 
 } 

SigParameter ::= SEQUENCE 
 { 
   sigParameterName     Name, 
   value                Value, 
   -- For use of extraInfo see the comment related to PropertyParm 
   extraInfo CHOICE 
    { 
      relation Relation, 
      range    BOOLEAN, 
      sublist  BOOLEAN 
    } OPTIONAL, 
   ... 
 } 

-- For an AuditCapReply with all events, the RequestID SHALL be ALL. 
-- ALL is represented by 0xffffffff. 

RequestID ::= INTEGER(0..4294967295)   -- 32-bit unsigned integer 

ModemDescriptor ::= SEQUENCE 
 { 
   mtl               SEQUENCE OF ModemType,  
   mpl               SEQUENCE OF PropertyParm, 
   nonStandardData   NonStandardData OPTIONAL 
 } 

ModemType ::= ENUMERATED 
 { 
   v18(0), 
   v22(1), 
   v22bis(2), 
   v32(3), 
   v32bis(4), 
   v34(5), 
   v90(6), 
   v91(7), 
   synchISDN(8), 
   ... 
 } 

DigitMapDescriptor ::= SEQUENCE 
 { 
   digitMapName   DigitMapName OPTIONAL, 
   digitMapValue  DigitMapValue OPTIONAL 
 } 

DigitMapName ::= Name 

DigitMapValue ::= SEQUENCE 
 { 
   startTimer        INTEGER(0..99) OPTIONAL, 
   shortTimer        INTEGER(0..99) OPTIONAL, 
   longTimer         INTEGER(0..99) OPTIONAL, 
   digitMapBody      IA5String, 
   -- Units are seconds for start, short and long timers, and 
   -- hundreds of milliseconds for duration timer. Thus start, 
   -- short, and long range from 1 to 99 seconds and duration 
   -- from 100 ms to 9.9 s 
   -- See A.3 for explanation of digit map syntax 
   ..., 
   durationTimer     INTEGER (0..99) OPTIONAL 
 } 

ServiceChangeParm ::= SEQUENCE 
 { 
   serviceChangeMethod     ServiceChangeMethod, 
   serviceChangeAddress    ServiceChangeAddress OPTIONAL, 
   serviceChangeVersion    INTEGER(0..99) OPTIONAL, 
   serviceChangeProfile    ServiceChangeProfile OPTIONAL, 
   serviceChangeReason     Value, 
   -- A serviceChangeReason consists of a numeric reason code 
   -- and an optional text description. 
   -- The serviceChangeReason SHALL be a string consisting of  
   -- a decimal reason code, optionally followed by a single  
   -- space character and a textual description string. 
   -- This string is first BER-encoded as an IA5String. 
   -- The result of this BER-encoding is then encoded as 
   -- an ASN.1 OCTET STRING type, "double wrapping" the  
   -- value 
   -- as was done for package elements. 
   serviceChangeDelay      INTEGER(0..4294967295) OPTIONAL, 
   -- 32-bit unsigned integer 
   serviceChangeMgcId      MId OPTIONAL, 
   timeStamp               TimeNotation OPTIONAL, 
   nonStandardData         NonStandardData OPTIONAL, 
   ..., 
   serviceChangeInfo       AuditDescriptor OPTIONAL 
 } 

ServiceChangeAddress ::= CHOICE 
 { 
   portNumber        INTEGER(0..65535),    -- TCP/UDP port number 
   ip4Address        IP4Address, 
   ip6Address        IP6Address, 
   domainName        DomainName, 
   deviceName        PathName, 
   mtpAddress        OCTET STRING(SIZE(2..4)), 
   ... 
 } 

ServiceChangeResParm ::= SEQUENCE 
 { 
   serviceChangeMgcId      MId OPTIONAL, 
   serviceChangeAddress    ServiceChangeAddress OPTIONAL, 
   serviceChangeVersion    INTEGER(0..99) OPTIONAL, 
   serviceChangeProfile    ServiceChangeProfile OPTIONAL, 
   timestamp               TimeNotation OPTIONAL, 
   ... 
 } 

ServiceChangeMethod ::= ENUMERATED 
 { 
   failover(0), 
   forced(1), 
   graceful(2), 
   restart(3), 
   disconnected(4), 
   handOff(5), 
   ... 
 } 
       
ServiceChangeProfile ::= SEQUENCE 
 { 
   profileName    IA5String(SIZE (1..67)) 
   
   -- 64 characters for name, 1 for "/", 2 for version to match ABNF 
 } 

PackagesDescriptor ::= SEQUENCE OF PackagesItem 
PackagesItem ::= SEQUENCE 
 { 
   packageName       Name, 
   packageVersion    INTEGER(0..99), 
   ... 
 } 

StatisticsDescriptor ::= SEQUENCE OF StatisticsParameter 

StatisticsParameter ::= SEQUENCE 
 { 
   statName       PkgdName, 
   statValue      Value OPTIONAL 
 } 

NonStandardData ::= SEQUENCE 
 { 
   nonStandardIdentifier   NonStandardIdentifier, 
   data                    OCTET STRING 
 } 

NonStandardIdentifier ::= CHOICE 
 { 
   object            OBJECT IDENTIFIER, 
   h221NonStandard   H221NonStandard, 
   experimental      IA5String(SIZE(8)),  
   -- first two characters SHOULD be "X-" or "X+" 
   ... 
 } 

H221NonStandard ::= SEQUENCE 
 {  t35CountryCode1      INTEGER(0..255), 
    t35CountryCode2      INTEGER(0..255),      -- country, as per T.35 
    t35Extension         INTEGER(0..255),      -- assigned nationally 
    manufacturerCode     INTEGER(0..65535), -- assigned nationally 
    ... 
 } 

TimeNotation ::= SEQUENCE 
 { 
   date     IA5String(SIZE(8)),  -- yyyymmdd format 
   time     IA5String(SIZE(8))   -- hhmmssss format 
   -- per ISO 8601:1988 
 } 

Value ::= SEQUENCE OF OCTET STRING 

END