12. PACKAGE DEFINITION
The primary mechanism for extension is by means of Packages. Packages define additional Properties, Events, Signals and Statistics that may occur on Terminations. Packages defined by IETF will appear in separate RFCs. Packages defined by ITU-T may appear in the relevant recommendations (e.g. as annexes). 1. A public document or a standard forum document, which can be referenced as the document that describes the package following the guideline above, should be specified. 2. The document shall specify the version of the Package that it describes. 3. The document should be available on a public web server and should have a stable URL. The site should provide a mechanism to provide comments and appropriate responses should be returned.12.1 Guidelines for defining packages
Packages define Properties, Events, Signals, and Statistics. Packages may also define new error codes according to the guidelines given in section 13.2. This is a matter of documentary convenience: the package documentation is submitted to IANA in support of the error code registration. If a package is modified, it is unnecessary to provide IANA with a new document reference in support of the error code unless the description of the error code itself is modified. Names of all such defined constructs shall consist of the PackageID (which uniquely identifies the package) and the ID of the item (which uniquely identifies the item in that package). In the text encoding the two shall be separated by a forward slash ("/") character. Example: togen/playtone is the text encoding to refer to the play tone signal in the tone generation package. A Package will contain the following sections:
12.1.1 Package
Overall description of the package, specifying: * Package Name: only descriptive, * PackageID: Is an identifier * Description: * Version: A new version of a package can only add additional Properties, Events, Signals, Statistics and new possible values for an existing parameter described in the original package. No deletions or modifications shall be allowed. A version is an integer in the range from 1 to 99. * Extends (Optional): A package may extend an existing package. The version of the original package must be specified. When a package extends another package it shall only add additional Properties, Events, Signals, Statistics and new possible values for an existing parameter described in the original package. An extended package shall not redefine or overload a name defined in the original package. Hence, if package B version 1 extends package A version 1, version 2 of B will not be able to extend the A version 2 if A version 2 defines a name already in B version 1.12.1.2 Properties
Properties defined by the package, specifying: * Property Name: only descriptive. * PropertyID: Is an identifier * Description: * Type: One of: String: UTF-8 string Integer: 4 byte signed integer Double: 8 byte signed integer Character: Unicode UTF-8 encoding of a single letter. Could be more than one octet. Enumeration: One of a list of possible unique values (See 12.3) Sub-list: A list of several values from a list Boolean * Possible Values: * Defined in: Which Megaco descriptor the property is defined in. LocalControl is for stream dependent properties. TerminationState is for stream independent properties. These are expected to be the most common cases, but it is possible for properties to be defined in other descriptors.
* Characteristics: Read / Write or both, and (optionally), global:
Indicates whether a property is read-only, or read-write, and if
it is global. If Global is omitted, the property is not global.
If a property is declared as global, the value of the property is
shared by all terminations realizing the package.
12.1.3 Events
Events defined by the package, specifying:
* Event name: only descriptive.
* EventID: Is an identifier
* Description:
* EventsDescriptor Parameters: Parameters used by the MGC to
configure the event, and found in the EventsDescriptor. See
section 12.2.
* ObservedEventsDescriptor Parameters: Parameters returned to the
MGC in Notify requests and in replies to command requests from
the MGC that audit ObservedEventsDescriptor, and found in the
ObservedEventsDescriptor. See section 12.2.
12.1.4 Signals
* Signals defined by the package, specifying:
* Signal Name: only descriptive.
* SignalID: Is an identifier. SignalID is used in a
SignalsDescriptor
* Description
* SignalType: One of:
- OO (On/Off)
- TO (TimeOut)
- BR (Brief)
Note - SignalType may be defined such that it is dependent on
the value of one or more parameters. Signals that would be
played with SignalType BR or TO should have a default duration.
The package has to define the default duration and signalType.
* Duration: in hundredths of seconds
* Additional Parameters: See section 12.2
12.1.5 Statistics
Statistics defined by the package, specifying:
* Statistic name: only descriptive.
* StatisticID: Is an identifier. StatisticID is used in a
StatisticsDescriptor.
* Description
* Units: unit of measure, e.g. milliseconds, packets.
12.1.6 Procedures
Additional guidance on the use of the package.
12.2 Guidelines to defining Properties, Statistics and Parameters to
Events and Signals.
* Parameter Name: only descriptive
* ParameterID: Is an identifier
* Type: One of:
String: UTF-8 octet string
Integer: 4 octet signed integer
Double: 8 octet signed integer
Character: Unicode UTF-8 encoding of a single letter. Could be
more than one octet.
Enumeration: One of a list of possible unique values (See 12.3)
Sub-list: A list of several values from a list (not supported
for statistics)
Boolean
* Possible values:
* Description:
12.3 Lists
Possible values for parameters include enumerations. Enumerations
may be defined in a list. It is recommended that the list be IANA
registered so that packages that extend the list can be defined
without concern for conflicting names.
12.4 Identifiers
Identifiers in text encoding shall be strings of up to 64 characters,
containing no spaces, starting with an alphanumeric character and
consisting of alphanumeric characters and / or digits, and possibly
including the special character underscore ("_").
Identifiers in binary encoding are 2 octets long.
Both text and binary values shall be specified for each identifier,
including identifiers used as values in enumerated types.
12.5 Package Registration
A package can be registered with IANA for interoperability reasons. See section 13 for IANA considerations.13. IANA CONSIDERATIONS
13.1 Packages
The following considerations SHALL be met to register a package with IANA: 1. A unique string name, unique serial number and version number is registered for each package. The string name is used with text encoding. The serial number shall be used with binary encoding. Serial Numbers 60000-64565 are reserved for private use. Serial number 0 is reserved. 2. A contact name, email and postal addresses for that contact shall be specified. The contact information shall be updated by the defining organization as necessary. 3. A reference to a document that describes the package, which should be public: The document shall specify the version of the Package that it describes. If the document is public, it should be located on a public web server and should have a stable URL. The site should provide a mechanism to provide comments and appropriate responses should be returned. 4. Packages registered by other than recognized standards bodies shall have a minimum package name length of 8 characters. 5. All other package names are first come-first served if all other conditions are met13.2 Error Codes
The following considerations SHALL be met to register an error code with IANA: 1. An error number and a one line (80 character maximum) string is registered for each error.
2. A complete description of the conditions under which the error is
detected shall be included in a publicly available document. The
description shall be sufficiently clear to differentiate the error
from all other existing error codes.
3. The document should be available on a public web server and should
have a stable URL.
4. Error numbers registered by recognized standards bodies shall have
3 or 4 character error numbers.
5. Error numbers registered by all other organizations or individuals
shall have 4 character error numbers.
6. An error number shall not be redefined, nor modified except by the
organization or individual that originally defined it, or their
successors or assigns.
13.3 ServiceChange Reasons
The following considerations SHALL be met to register service change
reason with IANA:
1. A one phrase, 80-character maximum, unique reason code is
registered for each reason.
2. A complete description of the conditions under which the reason is
used is detected shall be included in a publicly available
document. The description shall be sufficiently clear to
differentiate the reason from all other existing reasons.
3. The document should be available on a public web server and should
have a stable URL.
ANNEX A: BINARY ENCODING OF THE PROTOCOL (NORMATIVE)
This Annex specifies the syntax of messages using the notation
defined in ASN.1 [ITU-T Recommendation X.680 (1997): Information
Technology - Abstract Syntax Notation One (ASN.1) - Specification of
basic notation.]. Messages shall be encoded for transmission by
applying the basic encoding rules specified in [ITU-T Recommendation
X.690(1994) Information Technology - ASN.1 Encoding Rules:
Specification of Basic Encoding Rules (BER)].
A.1 Coding of wildcars
The use of wildcards ALL and CHOOSE is allowed in the protocol. This allows a MGC to partially specify Termination IDs and let the MG choose from the values that conform to the partial specification. Termination IDs may encode a hierarchy of names. This hierarchy is provisioned. For instance, a TerminationID may consist of a trunk group, a trunk within the group and a circuit. Wildcarding must be possible at all levels. The following paragraphs explain how this is achieved. The ASN.1 description uses octet strings of up to 8 octets in length for Termination IDs. This means that Termination IDs consist of at most 64 bits. A fully specified Termination ID may be preceded by a sequence of wildcarding fields. A wildcarding field is one octet in length. Bit 7 (the most significant bit) of this octet specifies what type of wildcarding is invoked: if the bit value equals 1, then the ALL wildcard is used; if the bit value if 0, then the CHOOSE wildcard is used. Bit 6 of the wildcarding field specifies whether the wildcarding pertains to one level in the hierarchical naming scheme (bit value 0) or to the level of the hierarchy specified in the wildcarding field plus all lower levels (bit value 1). Bits 0 through 5 of the wildcarding field specify the bit position in the Termination ID at which the starts. We illustrate this scheme with some examples. In these examples, the most significant bit in a string of bits appears on the left hand side. Assume that Termination IDs are three octets long and that each octet represents a level in a hierarchical naming scheme. A valid Termination ID is 00000001 00011110 01010101. Addressing ALL names with prefix 00000001 00011110 is done as follows: wildcarding field: 10000111 Termination ID: 00000001 00011110 xxxxxxxx. The values of the bits labeled "x" is irrelevant and shall be ignored by the receiver. Indicating to the receiver that is must choose a name with 00011110 as the second octet is done as follows:
wildcarding fields: 00010111 followed by 00000111
Termination ID: xxxxxxxx 00011110 xxxxxxxx.
The first wildcard field indicates a CHOOSE wildcard for the level in
the naming hierarchy starting at bit 23, the highest level in our
assumed naming scheme. The second wildcard field indicates a CHOOSE
wildcard for the level in the naming hierarchy starting at bit 7, the
lowest level in our assumed naming scheme.
Finally, a CHOOSE-wildcarded name with the highest level of the name
equal to 00000001 is specified as follows:
wildcard field: 01001111
Termination ID: 0000001 xxxxxxxx xxxxxxxx .
Bit value 1 at bit position 6 of the first octet of the wildcard
field indicates that the wildcarding pertains to the specified level
in the naming hierarchy and all lower levels.
Context IDs may also be wildcarded. In the case of Context IDs,
however, specifying partial names is not allowed. Context ID 0x0
SHALL be used to indicate the NULL Context, Context ID 0xFFFFFFFE
SHALL be used to indicate a CHOOSE wildcard, and Context ID
0xFFFFFFFF SHALL be used to indicate an ALL wildcard.
TerminationID 0xFFFFFFFFFFFFFFFF SHALL be used to indicate the ROOT
Termination.
A.2 ASN.1 syntax specification
This section contains the ASN.1 specification of the H.248 protocol
syntax.
NOTE - In case a transport mechanism is used that employs application
level framing, the definition of Transaction below changes. Refer to
the annex defining the transport mechanism for the definition that
applies in that case.
NOTE - The ASN.1 specification below contains a clause defining
TerminationIDList as a sequence of TerminationIDs. The length of
this sequence SHALL be one, except possibly when used in
contextAuditResult.
MEDIA-GATEWAY-CONTROL 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 1.
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)),
-- Addressing structure of mtpAddress:
-- 15 0
-- | PC | NI |
-- 14 bits 2 bits
...
}
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
}
{
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 section 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
{
firstAck TransactionId,
lastAck TransactionId OPTIONAL
}
ErrorDescriptor ::= SEQUENCE
{
errorCode ErrorCode,
errorText ErrorText OPTIONAL
}
ErrorCode ::= INTEGER(0..65535)
-- See section 13 for IANA considerations w.r.t. error codes
ErrorText ::= IA5String
ContextID ::= INTEGER(0..4294967295)
-- Context NULL Value: 0
-- Context CHOOSE Value: 429467294 (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)
}
}
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 ::= SEQUENCE
{
terminationID TerminationID,
auditResult AuditResult,
...
}
AuditResult ::= CHOICE
{
contextAuditResult TerminationIDList,
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,
...
}
NotifyRequest ::= SEQUENCE
{
terminationID TerminationIDList,
observedEventsDescriptor ObservedEventsDescriptor,
errorDescriptor ErrorDescriptor OPTIONAL,
...
}
NotifyReply ::= SEQUENCE
{
terminationID TerminationIDList OPTIONAL,
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
}
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 Section 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
},
...
}
StreamDescriptor ::= SEQUENCE
{
streamID StreamID,
streamParms StreamParms
}
StreamParms ::= SEQUENCE
{
localControlDescriptor LocalControlDescriptor OPTIONAL,
localDescriptor LocalRemoteDescriptor OPTIONAL,
remoteDescriptor LocalRemoteDescriptor OPTIONAL,
...
}
LocalControlDescriptor ::= SEQUENCE
{
streamMode StreamMode OPTIONAL,
reserveValue BOOLEAN,
reserveGroup BOOLEAN,
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 Name (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.
-- Wildcarding of Package Name is permitted only if Property Name is
-- 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),
...
}
StreamID ::= INTEGER(0..65535) -- 16 bit unsigned integer
EventsDescriptor ::= SEQUENCE
{
requestID RequestID,
eventList SEQUENCE OF RequestedEvent,
...
}
RequestedEvent ::= SEQUENCE
{
pkgdName PkgdName,
streamID StreamID OPTIONAL,
eventAction RequestedActions OPTIONAL,
evParList SEQUENCE OF EventParameter,
...
}
RequestedActions ::= SEQUENCE
{
keepActive BOOLEAN,
eventDM EventDM OPTIONAL,
secondEvent SecondEventsDescriptor OPTIONAL,
signalsDescriptor SignalsDescriptor OPTIONAL,
...
}
EventDM ::= CHOICE
{ digitMapName DigitMapName,
digitMapValue DigitMapValue
}
SecondEventsDescriptor ::= SEQUENCE
{
requestID RequestID,
eventList SEQUENCE OF SecondRequestedEvent,
...
}
SecondRequestedEvent ::= SEQUENCE
{
pkgdName PkgdName,
streamID StreamID OPTIONAL,
eventAction SecondRequestedActions OPTIONAL,
evParList SEQUENCE OF EventParameter,
...
}
SecondRequestedActions ::= SEQUENCE
{
keepActive BOOLEAN,
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
}
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,
-- See Section A.3 for explanation of digit map syntax
...
}
ServiceChangeParm ::= SEQUENCE
{
serviceChangeMethod ServiceChangeMethod,
serviceChangeAddress ServiceChangeAddress OPTIONAL,
serviceChangeVersion INTEGER(0..99) OPTIONAL,
serviceChangeProfile ServiceChangeProfile OPTIONAL,
serviceChangeReason Value,
serviceChangeDelay INTEGER(0..4294967295) OPTIONAL,
-- 32 bit unsigned integer
serviceChangeMgcId MId OPTIONAL,
timeStamp TimeNotation OPTIONAL,
nonStandardData NonStandardData OPTIONAL,
}
ServiceChangeAddress ::= CHOICE
{
portNumber INTEGER(0..65535), -- TCP/UDP port number
ip4Address IP4Address,
ip6Address IP6Address,
domainName DomainName,
deviceName PathName,
mtpAddress OCTET STRING(SIZE(2)),
...
}
ServiceChangeResParm ::= SEQUENCE
{
serviceChangeMgcId MId OPTIONAL,
serviceChangeAddress ServiceChangeAddress OPTIONAL,
serviceChangeVersion INTEGER(0..99) OPTIONAL,
serviceChangeProfile ServiceChangeProfile OPTIONAL,
...
}
ServiceChangeMethod ::= ENUMERATED
{
failover(0),
forced(1),
graceful(2),
restart(3),
disconnected(4),
handOff(5),
...
}
ServiceChangeProfile ::= SEQUENCE
{
profileName Name,
version INTEGER(0..99)
}
PackagesDescriptor ::= SEQUENCE OF PackagesItem
PackagesItem ::= SEQUENCE
{
packageName Name,
packageVersion INTEGER(0..99),
...
}
StatisticsDescriptor ::= SEQUENCE OF StatisticsParameter
StatisticsParameter ::= SEQUENCE
{
statName PkgdName,
statValue Value
}
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
}
Value ::= OCTET STRING
END
A.3 Digit maps and path names
From a syntactic viewpoint, digit maps are strings with syntactic
restrictions imposed upon them. The syntax of valid digit maps is
specified in ABNF [RFC 2234]. The syntax for digit maps presented in
this section is for illustrative purposes only. The definition of
digitMap in Annex B takes precedence in the case of differences
between the two.
digitMap = (digitString / LWSP "(" LWSP digitStringList LWSP ")"
LWSP)
digitStringList = digitString *( LWSP "/" LWSP digitString )
digitString = 1*(digitStringElement)
digitStringElement = digitPosition [DOT]
digitPosition = digitMapLetter / digitMapRange
digitMapRange = ("x" / LWSP "[" LWSP digitLetter LWSP "]" LWSP)
digitLetter = *((DIGIT "-" DIGIT) /digitMapLetter)
digitMapLetter = DIGIT ;digits 0-9
/ %x41-4B / %x61-6B ;a-k and A-K
/ "L" / "S" ;Inter-event timers
;(long, short)
/ "Z" ;Long duration event
DOT = %x2E ; "."
LWSP = *(WSP / COMMENT / EOL)
WSP = SP / HTAB
COMMENT = ";" *(SafeChar / RestChar / WSP) EOL
EOL = (CR [LF]) / LF
SP = %x20
HTAB = %x09
CR = %x0D
LF = %x0A
SafeChar = DIGIT / ALPHA / "+" / "-" / "&" / "!" / "_" / "/" /
"'" / "?" / "@" / "^" / "`" / "~" / "*" / "$" / "\" /
"(" / ")" / "%" / "."
RestChar = ";" / "[" / "]" / "{" / "}" / ":" / "," / "#" /
"<" / ">" / "=" / %x22
DIGIT = %x30-39 ; digits 0 through 9 ALPHA = %x41-5A / %x61-7A ; A-Z, a-z A path name is also a string with syntactic restrictions imposed upon it. The ABNF production defining it is copied from Annex B. PathName = NAME *(["/"] ["*"] ["@"] (ALPHA / DIGIT)) ["*"] NAME = ALPHA *63(ALPHA / DIGIT / "_" )ANNEX B TEXT ENCODING OF THE PROTOCOL (NORMATIVE)
B.1 Coding of wildcards
In a text encoding of the protocol, while TerminationIDs are arbitrary, by judicious choice of names, the wildcard character, "*" may be made more useful. When the wildcard character is encountered, it will "match" all TerminationIDs having the same previous and following characters (if appropriate). For example, if there were TerminationIDs of R13/3/1, R13/3/2 and R13/3/3, the TerminationID R13/3/* would match all of them. There are some circumstances where ALL Terminations must be referred to. The TerminationID "*" suffices, and is referred to as ALL. The CHOOSE TerminationID "$" may be used to signal to the MG that it has to create an ephemeral Termination or select an idle physical Termination.B.2 ABNF specification
The protocol syntax is presented in ABNF according to RFC2234. ; Boolean values, indicated in the text as True and False, are ; encoded as "On" and "Off", respectively, in the ABNF. megacoMessage = LWSP [authenticationHeader SEP ] message authenticationHeader = AuthToken EQUAL SecurityParmIndex COLON SequenceNum COLON AuthData SecurityParmIndex = "0x" 8(HEXDIG) SequenceNum = "0x" 8(HEXDIG) AuthData = "0x" 24*64(HEXDIG) message = MegacopToken SLASH Version SEP mId SEP messageBody ; The version of the protocol defined here is equal to 1. messageBody = ( errorDescriptor / transactionList ) transactionList = 1*( transactionRequest / transactionReply / transactionPending / transactionResponseAck ) ;Use of response acks is dependent on underlying transport
transactionPending = PendingToken EQUAL TransactionID LBRKT RBRKT
transactionResponseAck = ResponseAckToken LBRKT transactionAck
*(COMMA transactionAck) RBRKT
transactionAck = transactionID / (transactionID "-" transactionID)
transactionRequest = TransToken EQUAL TransactionID LBRKT
actionRequest *(COMMA actionRequest) RBRKT
actionRequest = CtxToken EQUAL ContextID LBRKT ((
contextRequest [COMMA commandRequestList])
/ commandRequestList) RBRKT
contextRequest = ((contextProperties [COMMA contextAudit])
/ contextAudit)
contextProperties = contextProperty *(COMMA contextProperty)
; at-most-once
contextProperty = (topologyDescriptor / priority / EmergencyToken)
contextAudit = ContextAuditToken LBRKT
contextAuditProperties *(COMMA
contextAuditProperties) RBRKT
; at-most-once
contextAuditProperties = ( TopologyToken / EmergencyToken /
PriorityToken )
commandRequestList= ["O-"] commandRequest *(COMMA ["O-"]
commandRequest)
commandRequest = ( ammRequest / subtractRequest / auditRequest
/ notifyRequest / serviceChangeRequest)
transactionReply = ReplyToken EQUAL TransactionID LBRKT
[ ImmAckRequiredToken COMMA]
( errorDescriptor / actionReplyList ) RBRKT
actionReplyList = actionReply *(COMMA actionReply )
actionReply = CtxToken EQUAL ContextID LBRKT
( errorDescriptor / commandReply ) RBRKT
commandReply = (( contextProperties [COMMA commandReplyList] )
/ commandReplyList )
commandReplyList = commandReplys *(COMMA commandReplys )
commandReplys = (serviceChangeReply / auditReply / ammsReply
/ notifyReply )
;Add Move and Modify have the same request parameters
ammRequest = (AddToken / MoveToken / ModifyToken ) EQUAL
TerminationID [LBRKT ammParameter *(COMMA
ammParameter) RBRKT]
;at-most-once
ammParameter = (mediaDescriptor / modemDescriptor /
muxDescriptor / eventsDescriptor /
signalsDescriptor / digitMapDescriptor /
eventBufferDescriptor / auditDescriptor)
ammsReply = (AddToken / MoveToken / ModifyToken /
SubtractToken ) EQUAL TerminationID [ LBRKT
terminationAudit RBRKT ]
subtractRequest = ["W-"] SubtractToken EQUAL TerminationID
[ LBRKT auditDescriptor RBRKT]
auditRequest = ["W-"] (AuditValueToken / AuditCapToken )
EQUAL TerminationID LBRKT auditDescriptor RBRKT
auditReply = (AuditValueToken / AuditCapToken )
( contextTerminationAudit / auditOther)
auditOther = EQUAL TerminationID LBRKT
terminationAudit RBRKT
terminationAudit = auditReturnParameter *(COMMA
auditReturnParameter)
contextTerminationAudit = EQUAL CtxToken ( terminationIDList /
LBRKT errorDescriptor RBRKT )
auditReturnParameter = (mediaDescriptor / modemDescriptor /
muxDescriptor / eventsDescriptor /
signalsDescriptor / digitMapDescriptor /
observedEventsDescriptor / eventBufferDescriptor /
statisticsDescriptor / packagesDescriptor /
errorDescriptor / auditItem )
auditDescriptor = AuditToken LBRKT [ auditItem
*(COMMA auditItem) ] RBRKT
notifyRequest = NotifyToken EQUAL TerminationID
LBRKT ( observedEventsDescriptor
[ COMMA errorDescriptor ] ) RBRKT
notifyReply = NotifyToken EQUAL TerminationID
[ LBRKT errorDescriptor RBRKT ]
serviceChangeRequest = ServiceChangeToken EQUAL TerminationID
LBRKT serviceChangeDescriptor RBRKT
serviceChangeReply = ServiceChangeToken EQUAL TerminationID
[LBRKT (errorDescriptor /
serviceChangeReplyDescriptor) RBRKT]
errorDescriptor = ErrorToken EQUAL ErrorCode
LBRKT [quotedString] RBRKT
ErrorCode = 1*4(DIGIT) ; could be extended
TransactionID = UINT32
mId = (( domainAddress / domainName )
[":" portNumber]) / mtpAddress / deviceName
; ABNF allows two or more consecutive "." although it is meaningless
; in a domain name.
domainName = "<" (ALPHA / DIGIT) *63(ALPHA / DIGIT / "-" /
".") ">"
deviceName = pathNAME
;The values 0x0, 0xFFFFFFFE and 0xFFFFFFFF are reserved.
ContextID = (UINT32 / "*" / "-" / "$")
domainAddress = "[" (IPv4address / IPv6address) "]"
;RFC2373 contains the definition of IP6Addresses.
IPv6address = hexpart [ ":" IPv4address ]
IPv4address = V4hex DOT V4hex DOT V4hex DOT V4hex
V4hex = 1*3(DIGIT) ; "0".."225"
; this production, while occurring in RFC2373, is not referenced
; IPv6prefix = hexpart SLASH 1*2DIGIT
hexpart = hexseq "::" [ hexseq ] / "::" [ hexseq ] / hexseq
hexseq = hex4 *( ":" hex4)
hex4 = 1*4HEXDIG
portNumber = UINT16
; An mtp address is two octets long
mtpAddress = MTPToken LBRKT octetString RBRKT
terminationIDList = LBRKT TerminationID *(COMMA TerminationID)
RBRKT
; Total length of pathNAME must not exceed 64 chars.
pathNAME = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" )
["@" pathDomainName ]
; ABNF allows two or more consecutive "." although it is meaningless
; in a path domain name.
pathDomainName = (ALPHA / DIGIT / "*" )
*63(ALPHA / DIGIT / "-" / "*" / ".")
TerminationID = "ROOT" / pathNAME / "$" / "*"
mediaDescriptor = MediaToken LBRKT mediaParm *(COMMA mediaParm)
RBRKT
; at-most-once per item
; and either streamParm or streamDescriptor but not both
mediaParm = (streamParm / streamDescriptor /
terminationStateDescriptor)
; at-most-once
streamParm = ( localDescriptor / remoteDescriptor /
localControlDescriptor )
streamDescriptor = StreamToken EQUAL StreamID LBRKT streamParm
*(COMMA streamParm) RBRKT
localControlDescriptor = LocalControlToken LBRKT localParm
*(COMMA localParm) RBRKT
; at-most-once per item
localParm = ( streamMode / propertyParm /
reservedValueMode
/ reservedGroupMode )
reservedValueMode = ReservedValueToken EQUAL ( "ON" / "OFF" )
reservedGroupMode = ReservedGroupToken EQUAL ( "ON" / "OFF" )
streamMode = ModeToken EQUAL streamModes
streamModes = (SendonlyToken / RecvonlyToken /
SendrecvToken /
InactiveToken / LoopbackToken )
propertyParm = pkgdName parmValue
parmValue = (EQUAL alternativeValue/ INEQUAL VALUE)
alternativeValue = ( VALUE
/ LSBRKT VALUE *(COMMA VALUE) RSBRKT
; sublist (i.e. A AND B AND ...)
/ LBRKT VALUE *(COMMA VALUE) RBRKT
; alternatives (i.e. A OR B OR ...)
/ LSBRKT VALUE COLON VALUE RSBRKT )
; range
INEQUAL = LWSP (">" / "<" / "#" ) LWSP
LSBRKT = LWSP "[" LWSP
RSBRKT = LWSP "]" LWSP
localDescriptor = LocalToken LBRKT octetString RBRKT
remoteDescriptor = RemoteToken LBRKT octetString RBRKT
eventBufferDescriptor= EventBufferToken LBRKT eventSpec
*( COMMA eventSpec ) RBRKT
eventSpec = pkgdName [ LBRKT eventSpecParameter
*(COMMA eventSpecParameter) RBRKT ]
eventSpecParameter = (eventStream / eventOther)
eventBufferControl = BufferToken EQUAL ( "OFF" / LockStepToken )
terminationStateDescriptor = TerminationStateToken LBRKT
terminationStateParm *( COMMA terminationStateParm )
RBRKT
; at-most-once per item
terminationStateParm =(propertyParm / serviceStates /
eventBufferControl )
serviceStates = ServiceStatesToken EQUAL ( TestToken /
OutOfSvcToken / InSvcToken )
muxDescriptor = MuxToken EQUAL MuxType terminationIDList
MuxType = ( H221Token / H223Token / H226Token /
V76Token / extensionParameter )
StreamID = UINT16
pkgdName = (PackageName SLASH ItemID) ;specific item
/ (PackageName SLASH "*") ;all events in package
/ ("*" SLASH "*") ; all events supported by the MG
PackageName = NAME
ItemID = NAME
eventsDescriptor = EventsToken EQUAL RequestID LBRKT
requestedEvent *( COMMA requestedEvent ) RBRKT
requestedEvent = pkgdName [ LBRKT eventParameter
*( COMMA eventParameter ) RBRKT ]
; at-most-once each of KeepActiveToken , eventDM and eventStream
;at most one of either embedWithSig or embedNoSig but not both
;KeepActiveToken and embedWithSig must not both be present
eventParameter = ( embedWithSig / embedNoSig / KeepActiveToken
/eventDM / eventStream / eventOther )
embedWithSig = EmbedToken LBRKT signalsDescriptor
[COMMA embedFirst ] RBRKT
embedNoSig = EmbedToken LBRKT embedFirst RBRKT
; at-most-once of each
embedFirst = EventsToken EQUAL RequestID LBRKT
secondRequestedEvent *(COMMA secondRequestedEvent) RBRKT
secondRequestedEvent = pkgdName [ LBRKT secondEventParameter
*( COMMA secondEventParameter ) RBRKT ]
; at-most-once each of embedSig , KeepActiveToken, eventDM or
; eventStream
; KeepActiveToken and embedSig must not both be present
secondEventParameter = ( EmbedSig / KeepActiveToken / eventDM /
eventStream / eventOther )
embedSig = EmbedToken LBRKT signalsDescriptor RBRKT
eventStream = StreamToken EQUAL StreamID
eventOther = eventParameterName parmValue
eventParameterName = NAME
eventDM = DigitMapToken ((EQUAL digitMapName ) /
(LBRKT digitMapValue RBRKT ))
signalsDescriptor = SignalsToken LBRKT [ signalParm
*(COMMA signalParm)] RBRKT
signalParm = signalList / signalRequest
signalRequest = signalName [ LBRKT sigParameter
*(COMMA sigParameter) RBRKT ]
signalList = SignalListToken EQUAL signalListId LBRKT
signalListParm *(COMMA signalListParm) RBRKT
signalListId = UINT16
;exactly once signalType, at most once duration and every signal
;parameter
signalListParm = signalRequest
signalName = pkgdName
;at-most-once sigStream, at-most-once sigSignalType,
;at-most-once sigDuration, every signalParameterName at most once
sigParameter = sigStream / sigSignalType / sigDuration / sigOther
/ notifyCompletion / KeepActiveToken
sigStream = StreamToken EQUAL StreamID
sigOther = sigParameterName parmValue
sigParameterName = NAME
sigSignalType = SignalTypeToken EQUAL signalType
signalType = (OnOffToken / TimeOutToken / BriefToken)
sigDuration = DurationToken EQUAL UINT16
notifyCompletion = NotifyCompletionToken EQUAL (LBRKT
notificationReason *(COMMA notificationReason) RBRKT
notificationReason = ( TimeOutToken / InterruptByEventToken
/ InterruptByNewSignalsDescrToken
/ OtherReasonToken )
observedEventsDescriptor = ObservedEventsToken EQUAL RequestID
LBRKT observedEvent *(COMMA observedEvent) RBRKT
;time per event, because it might be buffered
observedEvent = [ TimeStamp LWSP COLON] LWSP
pkgdName [ LBRKT observedEventParameter
*(COMMA observedEventParameter) RBRKT ]
;at-most-once eventStream, every eventParameterName at most once
observedEventParameter = eventStream / eventOther
RequestID = UINT32
modemDescriptor = ModemToken (( EQUAL modemType) /
(LSBRKT modemType *(COMMA modemType) RSBRKT))
[ LBRKT NAME parmValue
*(COMMA NAME parmValue) RBRKT ]
; at-most-once
modemType = (V32bisToken / V22bisToken / V18Token /
V22Token / V32Token / V34Token / V90Token /
V91Token / SynchISDNToken / extensionParameter)
digitMapDescriptor = DigitMapToken EQUAL
( ( LBRKT digitMapValue RBRKT )
/ (digitMapName [ LBRKT digitMapValue RBRKT ]) )
digitMapName = NAME
digitMapValue = ["T" COLON Timer COMMA] ["S" COLON Timer COMMA]
["L" COLON Timer COMMA] digitMap
Timer = 1*2DIGIT
digitMap =
digitString / LWSP "(" LWSP digitStringList LWSP ")" LWSP
digitStringList = digitString *( LWSP "|" LWSP digitString )
digitString = 1*(digitStringElement)
digitStringElement = digitPosition [DOT]
digitPosition = digitMapLetter / digitMapRange
digitMapRange = ("x" / LWSP "[" LWSP digitLetter LWSP "]" LWSP)
digitLetter = *((DIGIT "-" DIGIT ) / digitMapLetter)
digitMapLetter = DIGIT ;Basic event symbols
/ %x41-4B / %x61-6B ; a-k, A-K
/ "L" / "S" ;Inter-event timers (long, short)
/ "Z" ;Long duration modifier
;at-most-once, and DigitMapToken and PackagesToken are not allowed
;in AuditCapabilities command
auditItem = ( MuxToken / ModemToken / MediaToken /
SignalsToken / EventBufferToken /
DigitMapToken / StatsToken / EventsToken /
ObservedEventsToken / PackagesToken )
serviceChangeDescriptor = ServicesToken LBRKT serviceChangeParm
*(COMMA serviceChangeParm) RBRKT
serviceChangeParm = (serviceChangeMethod / serviceChangeReason /
serviceChangeDelay / serviceChangeAddress /
serviceChangeProfile / extension / TimeStamp /
serviceChangeMgcId / serviceChangeVersion )
serviceChangeReplyDescriptor = ServicesToken LBRKT
servChgReplyParm *(COMMA servChgReplyParm) RBRKT
;at-most-once. Version is REQUIRED on first ServiceChange response
servChgReplyParm = (serviceChangeAddress / serviceChangeMgcId /
serviceChangeProfile / serviceChangeVersion )
serviceChangeMethod = MethodToken EQUAL (FailoverToken /
ForcedToken / GracefulToken / RestartToken /
DisconnectedToken / HandOffToken /
extensionParameter)
serviceChangeReason = ReasonToken EQUAL VALUE
serviceChangeDelay = DelayToken EQUAL UINT32
serviceChangeAddress = ServiceChangeAddressToken EQUAL VALUE
serviceChangeMgcId = MgcIdToken EQUAL mId
serviceChangeProfile = ProfileToken EQUAL NAME SLASH Version
serviceChangeVersion = VersionToken EQUAL Version
extension = extensionParameter parmValue
packagesDescriptor = PackagesToken LBRKT packagesItem
*(COMMA packagesItem) RBRKT
Version = 1*2(DIGIT)
packagesItem = NAME "-" UINT16
TimeStamp = Date "T" Time ; per ISO 8601:1988
; Date = yyyymmdd
Date = 8(DIGIT)
; Time = hhmmssss
Time = 8(DIGIT)
statisticsDescriptor = StatsToken LBRKT statisticsParameter
*(COMMA statisticsParameter ) RBRKT
;at-most-once per item
statisticsParameter = pkgdName EQUAL VALUE
topologyDescriptor = TopologyToken LBRKT terminationA COMMA
terminationB COMMA topologyDirection RBRKT
terminationA = TerminationID
terminationB = TerminationID
topologyDirection = BothwayToken / IsolateToken / OnewayToken
priority = PriorityToken EQUAL UINT16
extensionParameter = "X" ("-" / "+") 1*6(ALPHA / DIGIT)
; octetString is used to describe SDP defined in RFC2327.
; Caution should be taken if CRLF in RFC2327 is used.
; To be safe, use EOL in this ABNF.
; Whenever "}" appears in SDP, it is escaped by "\", e.g., "\}"
octetString = *(nonEscapeChar)
nonEscapeChar = ( "\}" / %x01-7C / %x7E-FF )
quotedString = DQUOTE 1*(SafeChar / RestChar/ WSP) DQUOTE
UINT16 = 1*5(DIGIT) ; %x0-FFFF
UINT32 = 1*10(DIGIT) ; %x0-FFFFFFFF
NAME = ALPHA *63(ALPHA / DIGIT / "_" )
VALUE = quotedString / 1*(SafeChar)
SafeChar = DIGIT / ALPHA / "+" / "-" / "&" /
"!" / "_" / "/" / "'" / "?" / "@" /
"^" / "`" / "~" / "*" / "$" / "\" /
"(" / ")" / "%" / "|" / "."
EQUAL = LWSP %x3D LWSP ; "="
COLON = %x3A ; ":"
LBRKT = LWSP %x7B LWSP ; "{"
RBRKT = LWSP %x7D LWSP ; "}"
COMMA = LWSP %x2C LWSP ; ","
DOT = %x2E ; "."
SLASH = %x2F ; "/"
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
DIGIT = %x30-39 ; 0-9
DQUOTE = %x22 ; " (Double Quote)
HEXDIG = ( DIGIT / "A" / "B" / "C" / "D" / "E" / "F" )
SP = %x20 ; space
HTAB = %x09 ; horizontal tab
CR = %x0D ; Carriage return
LF = %x0A ; linefeed
LWSP = *( WSP / COMMENT / EOL )
EOL = (CR [LF] / LF )
WSP = SP / HTAB ; white space
SEP = ( WSP / EOL / COMMENT) LWSP
COMMENT = ";" *(SafeChar/ RestChar / WSP / %x22) EOL
RestChar = ";" / "[" / "]" / "{" / "}" / ":" / "," / "#"
/
"<" / ">" / "="
AddToken = ("Add" / "A")
AuditToken = ("Audit" / "AT")
AuditCapToken = ("AuditCapability" / "AC")
AuditValueToken = ("AuditValue" / "AV")
AuthToken = ("Authentication" / "AU")
BothwayToken = ("Bothway" / "BW")
BriefToken = ("Brief" / "BR")
BufferToken = ("Buffer" / "BF")
CtxToken = ("Context" / "C")
ContextAuditToken = ("ContextAudit" / "CA")
DigitMapToken = ("DigitMap" / "DM")
DisconnectedToken = ("Disconnected" / "DC")
DelayToken = ("Delay" / "DL")
DurationToken = ("Duration" / "DR")
EmbedToken = ("Embed" / "EB")
EmergencyToken = ("Emergency" / "EM")
ErrorToken = ("Error" / "ER")
EventBufferToken = ("EventBuffer" / "EB")
EventsToken = ("Events" / "E")
FailoverToken = ("Failover" / "FL")
ForcedToken = ("Forced" / "FO")
GracefulToken = ("Graceful" / "GR")
H221Token = ("H221" )
H223Token = ("H223" )
H226Token = ("H226" )
HandOffToken = ("HandOff" / "HO")
ImmAckRequiredToken = ("ImmAckRequired" / "IA")
InactiveToken = ("Inactive" / "IN")
IsolateToken = ("Isolate" / "IS")
InSvcToken = ("InService" / "IV")
InterruptByEventToken = ("IntByEvent" / "IBE")
InterruptByNewSignalsDescrToken
= ("IntBySigDescr" / "IBS")
KeepActiveToken = ("KeepActive" / "KA")
LocalToken = ("Local" / "L")
LocalControlToken = ("LocalControl" / "O")
LockStepToken = ("LockStep" / "SP")
LoopbackToken = ("Loopback" / "LB")
MediaToken = ("Media" / "M")
MegacopToken = ("MEGACO" / "!")
MethodToken = ("Method" / "MT")
MgcIdToken = ("MgcIdToTry" / "MG")
ModeToken = ("Mode" / "MO")
ModifyToken = ("Modify" / "MF")
ModemToken = ("Modem" / "MD")
MoveToken = ("Move" / "MV")
MTPToken = ("MTP")
MuxToken = ("Mux" / "MX")
NotifyToken = ("Notify" / "N")
NotifyCompletionToken = ("NotifyCompletion" / "NC")
ObservedEventsToken = ("ObservedEvents" / "OE")
OnewayToken = ("Oneway" / "OW")
OnOffToken = ("OnOff" / "OO")
OtherReasonToken = ("OtherReason" / "OR")
OutOfSvcToken = ("OutOfService" / "OS")
PackagesToken = ("Packages" / "PG")
PendingToken = ("Pending" / "PN")
PriorityToken = ("Priority" / "PR")
ProfileToken = ("Profile" / "PF")
ReasonToken = ("Reason" / "RE")
RecvonlyToken = ("ReceiveOnly" / "RC")
ReplyToken = ("Reply" / "P")
RestartToken = ("Restart" / "RS")
RemoteToken = ("Remote" / "R")
ReservedGroupToken = ("ReservedGroup" / "RG")
ReservedValueToken = ("ReservedValue" / "RV")
SendonlyToken = ("SendOnly" / "SO")
SendrecvToken = ("SendReceive" / "SR")
ServicesToken = ("Services" / "SV")
ServiceStatesToken = ("ServiceStates" / "SI")
ServiceChangeToken = ("ServiceChange" / "SC")
ServiceChangeAddressToken = ("ServiceChangeAddress" / "AD")
SignalListToken = ("SignalList" / "SL")
SignalsToken = ("Signals" / "SG")
SignalTypeToken = ("SignalType" / "SY")
StatsToken = ("Statistics" / "SA")
StreamToken = ("Stream" / "ST")
SubtractToken = ("Subtract" / "S")
SynchISDNToken = ("SynchISDN" / "SN")
TerminationStateToken = ("TerminationState" / "TS")
TestToken = ("Test" / "TE")
TimeOutToken = ("TimeOut" / "TO")
TopologyToken = ("Topology" / "TP")
TransToken = ("Transaction" / "T")
ResponseAckToken = ("TransactionResponseAck"/ "K")
V18Token = ("V18")
V22Token = ("V22")
V22bisToken = ("V22b")
V32Token = ("V32")
V32bisToken = ("V32b")
V34Token = ("V34")
V76Token = ("V76")
V90Token = ("V90")
V91Token = ("V91")
VersionToken = ("Version" / "V")