HTTP/1.1 200 OK Date: Mon, 08 Apr 2002 22:32:50 GMT Server: Apache/1.3.20 (Unix) Last-Modified: Wed, 23 Jun 1999 18:35:18 GMT ETag: "2e6ecd-92dc-377128e6" Accept-Ranges: bytes Content-Length: 37596 Connection: close Content-Type: text/plain MEGACO LP. Anquetil A. Conte Internet Draft Alcatel Document: June 1999 Category: Informational MEGACO protocol ASN1/OMG-IDL syntax and API Status of this Memo This document is an Internet-Draft and is in full conformance with all provisions of Section 10 of RFC2026 [1]. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that other groups may also distribute working documents as Internet- Drafts. Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet- Drafts as reference material or to cite them other than as "work in progress." The list of current Internet-Drafts can be accessed at http://www.ietf.org/ietf/1id-abstracts.txt The list of Internet-Draft Shadow Directories can be accessed at http://www.ietf.org/shadow.html. 1. Abstract This draft provides the ASN.1 and the corresponding OMG-IDL generic command syntax for the MEGACO protocol. It stresses on the use of OMG-IDL both for syntax and API specifications. As such, a simple Transactions API is provided using OMG-IDL. 2. Conventions used in this document The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC-2119 [2]. 3. Draft Objective As part of the MEGACO working group planned output, an informational RFC is scheduled for application programming interface for the MC to MG protocol. This draft tries to contribute to this goal, by Anquetil, Conte Informational - December 1999 1 MEGACO Protocol ASN1/IDL Syntax and API June 1999 choosing OMG-IDL [3] as specification language, proposing a very minimal interface to send and receive MEGACOP messages. 4. ASN1 vs. OMG-IDL specifications This section shortly describes some of the benefits to use OMG-IDL rather than ASN.1 [4] for specifications. One of the benefits of OMG-IDL over ASN.1 is that programming language mapping (say C++ for example) is well defined in OMG-IDL but is not in ASN.1. Then, if one feeds an ASN.1 compiler with an ASN.1 specification, the ASN.1 compiler shall produce proprietary C++ source code, as the mapping from ASN.1 to C++ is not defined. Actually ASN.1 focuses on interoperability at the binary encoding level but is not concerned with source code portability. On the contrary, feeding an OMG-IDL compiler with an OMG-IDL specification shall produce well-defined C++ source code, presenting the equivalent OMG-IDL data structures in C++. Furthermore, OMG-IDL provides language neutral specifications which are not limited to data structures specifications, but can also be used as direct API specifications. Those points are especially relevant from an MG or MGC developper point of view, as it limits proprietary API specifications, at the benefit of source code portability between MEGACOP stack providers, adopting OMG-IDL both for syntax and API specifications. Actually the use of OMG-IDL for such purposes does not preclude a text encoding option. In that sense, OMG-IDL is used as a generic language for API and syntax, the skeleton and proxy stub code produced by an OMG-IDL compiler being eventually bypassed : send data directly over some transport protocol (e.g. TCP) with some proprietary encoding scheme (e.g. text based). 5. Formal Syntax In the MEGACO protocol draft [5], the syntax specification uses the augmented Backus-Naur Form (BNF) as described in RFC-2234 [6]. However, such syntax may also be expressed using ASN1 or using OMG- IDL, according to the automatic translation rules [7] between the two languages. Following is expressed the generic command syntax, to differentiate with the command parameter syntax which is left for further work. Some of the fields are left as PrintableString or OCTET STRING, meaning the ABNF parsing shall still be valid, or special binary values might be defined. Anquetil, Conte Informational - December 1999 2 MEGACO Protocol ASN1/IDL Syntax and API June 1999 The ASN.1 source code has been compiled using the GNU Snacc compiler [8], and the OMG-IDL source code using the ORBACUS [9] compiler. 5.1 ASN.1 Syntax -- -- ASN1 specification of -- MEGACOP { version(1) } DEFINITIONS IMPLICIT TAGS ::= BEGIN Message ::= SEQUENCE { systemId SystemId, transactions SEQUENCE OF Transaction } Transaction ::= CHOICE { transactionRequest [0] TransactionRequest, transactionAccept [1] TransactionAccept, transactionReject [2] TransactionReject } TransactionRequest ::= SEQUENCE { transactionId TransactionId, actions SEQUENCE OF Action } TransactionAccept ::= SEQUENCE { transactionId TransactionId, actionAccepts SEQUENCE OF ActionAccept } TransactionReject ::= SEQUENCE { transactionId TransactionId, actionRejects SEQUENCE OF ActionReject } ActionAccept ::= SEQUENCE { contextId ContextId, commandAccepts SEQUENCE OF CommandAccept } CommandAccept ::= SEQUENCE Anquetil, Conte Informational - December 1999 3 MEGACO Protocol ASN1/IDL Syntax and API June 1999 { commandName CommandName, terminationId TerminationId OPTIONAL, parameters SEQUENCE OF Parameters OPTIONAL } ActionReject ::= SEQUENCE { contextId ContextId, commandRejects SEQUENCE OF CommandReject } CommandReject ::= SEQUENCE { commandName [0] CommandName, terminationId [1] TerminationId OPTIONAL, errorMessage [2] ErrorMessage } ErrorMessage ::= SEQUENCE { errorCode ErrorCode, errorText ErrorText } ErrorCode ::= OCTET STRING(SIZE(3)) ErrorText ::= PrintableString TransactionId ::= INTEGER -- yields INTEGER32 in IDL -- SystemId ::= SEQUENCE { domainName DomainName, portNumber PortNumber } DomainName ::= PrintableString -- parse as RFC821 -- PortNumber ::= OCTET STRING(SIZE(2)) -- room for more than 5 digits -- Action ::= SEQUENCE { contextId ContextId, commands SEQUENCE OF Command } ContextId ::= INTEGER -- with special values definitions -- nullContext ContextId ::= 0 unspecifiedContext ContextId ::= 1 Command ::= SEQUENCE { Anquetil, Conte Informational - December 1999 4 MEGACO Protocol ASN1/IDL Syntax and API June 1999 commandName CommandName, terminationId TerminationId, parameters Parameters } CommandName ::= ENUMERATED { add(0), subtract(1), modify(2), move(3), audit(4), notify(5), serviceChange(6) } TerminationId ::= PrintableString -- parse naming hierachy as defined in ABNF -- Parameters ::= SEQUENCE { terminationState [0] TerminationState OPTIONAL, localTerminationDescriptor [1] LocalTerminationDescriptor OPTIONAL, remoteTerminationDescriptor [2] RemoteTerminationDescriptor OPTIONAL, eventsDescriptor [3] EventsDescriptor OPTIONAL, signalDescriptor [4] SignalDescriptor OPTIONAL, digitMapDescriptor [5] DigitMapDescriptor OPTIONAL, requestedInfo [6] RequestedInfo OPTIONAL, serviceChangeMethod [7] ServiceChangeMethod OPTIONAL, serviceChangeReason [8] ServiceChangeReason OPTIONAL, serviceChangeDelay [9] ServiceChangeDelay OPTIONAL, observedEvents [10] ObservedEvents OPTIONAL, statistics [11] Statistics OPTIONAL, capabilities [12] Capabilities OPTIONAL, mgcIdentity [13] MGCIdentity OPTIONAL, parameterValues [14] SEQUENCE OF ParameterValue OPTIONAL } TerminationState ::= SEQUENCE { terminationMode [0] TerminationMode OPTIONAL, bufferedEventHandling [1] BufferedEventHandling OPTIONAL } TerminationMode ::= ENUMERATED { sendonly(0), Anquetil, Conte Informational - December 1999 5 MEGACO Protocol ASN1/IDL Syntax and API June 1999 recvonly(1), sendrecv(2), inactive(3), loopback(4), conttest(5), outOfService(6) } BufferedEventHandling ::= CHOICE { loopControl [0] LoopControl, processControl [2] ProcessControl, loopProcessControl [3] LoopProcessControl } LoopProcessControl ::= SEQUENCE { loopControl LoopControl, processControl ProcessControl } LoopControl ::= ENUMERATED { step(0), loop(1) } ProcessControl ::= ENUMERATED { process(0), discard(1) } LocalTerminationDescriptor ::= TerminationDescriptor RemoteTerminationDescriptor ::= TerminationDescriptor EventsDescriptor ::= SEQUENCE OF RequestedEvent RequestedEvent ::= SEQUENCE { eventName [0] EventName, eventParameters [1] SEQUENCE OF EventParameter OPTIONAL, requestedActions [2] RequestedActions OPTIONAL } EventParameter ::= SEQUENCE { parameterName ParameterName, parameterValue ParameterValue } Anquetil, Conte Informational - December 1999 6 MEGACO Protocol ASN1/IDL Syntax and API June 1999 ParameterName ::= PrintableString ParameterValue ::= PrintableString RequestId ::= INTEGER RequestedActions ::= SEQUENCE { requestedAction [0] RequestedAction, embeddedSignalEvent [1] EmbeddedSignalEvent OPTIONAL, mediaAction [2] MediaAction OPTIONAL } RequestedAction ::= CHOICE { tokenAction [0] TokenAction, digitMapName [1] DigitMapName, scriptName [2] ScriptName } TokenAction ::= OCTET STRING(SIZE(1)) notifyAction TokenAction ::= '01'H accumulateAction TokenAction ::= '02'H DigitMapName ::= PrintableString ScriptName ::= PrintableString EmbeddedSignalEvent ::= SEQUENCE { -- Differentiate EmbbededEventsDescriptor with EventsDescriptor -- to avoid cycles which are forbidden in IDL (-> maximum is one -- level of embedding) eventsDescriptor [0] EmbeddedEventsDescriptor OPTIONAL, signalDescriptor [1] SignalDescriptor OPTIONAL } EmbeddedEventsDescriptor ::= SEQUENCE OF EmbeddedRequestedEvent EmbeddedRequestedEvent ::= SEQUENCE { eventName [0] EventName, eventParameters [1] SEQUENCE OF EventParameter OPTIONAL -- no further requestedActions defined (-> maximum is one level -- of embedding) } MediaAction ::= OCTET STRING(SIZE(1)) Anquetil, Conte Informational - December 1999 7 MEGACO Protocol ASN1/IDL Syntax and API June 1999 SignalDescriptor ::= SEQUENCE OF SignalRequest SignalRequest ::= SEQUENCE { eventName EventName, eventParameters SEQUENCE OF EventParameter OPTIONAL } EventName ::= PrintableString -- parse as defined in ABNF -- DigitMapDescriptor ::= SEQUENCE { digitMapName DigitMapName, digitMapValue DigitMapValue } DigitMapValue ::= SEQUENCE { longTimer [0] LongTimer OPTIONAL, shortTimer [1] ShortTimer OPTIONAL, digitMap [2] DigitMap } LongTimer ::= INTEGER(1..99) ShortTimer ::= INTEGER(1..99) DigitMap ::= PrintableString -- parse as defined in ABNF -- RequestedInfo ::= SEQUENCE OF InfoCode InfoCode ::= ENUMERATED { terminationState(0), localTermDesc(1), remoteTermDesc(2), eventDesc(3), signalDesc(4), digitMap(5), stats(6), obsrvdEvnts(7) } ServiceChangeMethod ::= ENUMERATED { graceful(0), forced(1), restart(2), failover(3) } Anquetil, Conte Informational - December 1999 8 MEGACO Protocol ASN1/IDL Syntax and API June 1999 ServiceChangeReason ::= PrintableString -- added to ABNF -- ServiceChangeDelay ::= INTEGER ObservedEvents ::= SEQUENCE { requestId RequestId, observedEvents SEQUENCE OF ObservedEvent } ObservedEvent ::= SEQUENCE { timeNotation [0] TimeNotation OPTIONAL, signalRequest [1] SignalRequest } TimeNotation ::= INTEGER -- Meant INTEGER64 but CORBA::Long is 32 bits -- Alternative is OCTET STRING(SIZE(8)) Statistics ::= SEQUENCE OF StatisticsParameter StatisticsParameter ::= CHOICE { packetsSent [0] PacketsSent, octetsSent [1] OctetsSent, packetsReceived [2] PacketsReceived, octetsReceived [3] OctetsReceived, packetsLost [4] PacketsLost, jitter [5] Jitter, averageLatency [6] AverageLatency } -- INTEGER yields CORBA::Long which is 32 bits -- Alternative is OCTET STRING(SIZE(8)) PacketsSent ::= INTEGER -- INTEGER64 see warning above -- OctetsSent ::= INTEGER -- INTEGER64 see warning above -- PacketsReceived ::= INTEGER -- INTEGER64 see warning above -- OctetsReceived ::= INTEGER -- INTEGER64 see warning above -- PacketsLost ::= INTEGER -- INTEGER32 -- Jitter ::= INTEGER -- INTEGER32 -- AverageLatency ::= INTEGER -- INTEGER32 -- Capabilities ::= PrintableString -- TBD -- MGCIdentity ::= SystemId TerminationDescriptor ::= PrintableString -- TBD SDP vs. H245 -- END -- end of module -- -- end of file Anquetil, Conte Informational - December 1999 9 MEGACO Protocol ASN1/IDL Syntax and API June 1999 5.2 OMG-IDL Syntax #ifndef _MEGaCO_IDL_ #define _MEGaCO_IDL_ #include "ASN1Types.idl" module MEGACOP { //--------------------------------------------------------------- // value definitions: const ASN1_Integer nullContext = 0; const ASN1_Integer unspecifiedContext = 1; const ASN1_Integer version = 1; interface ConstValues { ASN1_OctetString notifyAction(); //"'01'H" ASN1_OctetString accumulateAction(); //"'02'H" }; //--------------------------------------------------------------- // type definitions: /* OCTET STRING (SIZE (3)) */ typedef sequence ErrorCodeType; /* INTEGER */ typedef ASN1_Integer TransactionId; /* OCTET STRING (SIZE (2)) */ typedef sequence PortNumberType; /* INTEGER */ typedef ASN1_Integer ContextId; /* ENUMERATED */ enum CommandNameType { add, // (original value = 0) subtract, // (original value = 1) modify, // (original value = 2) move, // (original value = 3) audit, // (original value = 4) Anquetil, Conte Informational - December 1999 10 MEGACO Protocol ASN1/IDL Syntax and API June 1999 notify, // (original value = 5) serviceChange // (original value = 6) }; /* ENUMERATED */ enum TerminationModeType { sendonly, // (original value = 0) recvonly, // (original value = 1) sendrecv, // (original value = 2) inactive, // (original value = 3) loopback, // (original value = 4) conttest, // (original value = 5) outOfService // (original value = 6) }; /* ENUMERATED */ enum LoopControlType { step, // (original value = 0) loop // (original value = 1) }; /* ENUMERATED */ enum ProcessControlType { process, // (original value = 0) discard // (original value = 1) }; /* INTEGER */ typedef ASN1_Integer RequestId; /* OCTET STRING (SIZE (1)) */ typedef sequence TokenActionType; /* OCTET STRING (SIZE (1)) */ typedef sequence MediaActionType; /* INTEGER (1..99) */ typedef ASN1_Unsigned16 LongTimer; /* INTEGER (1..99) */ typedef ASN1_Unsigned16 ShortTimer; /* ENUMERATED */ enum InfoCodeType { Anquetil, Conte Informational - December 1999 11 MEGACO Protocol ASN1/IDL Syntax and API June 1999 terminationState, // (original value = 0) localTermDesc, // (original value = 1) remoteTermDesc, // (original value = 2) eventDesc, // (original value = 3) signalDesc, // (original value = 4) digitMap, // (original value = 5) stats, // (original value = 6) obsrvdEvnts // (original value = 7) }; /* ENUMERATED */ enum ServiceChangeMethodType { graceful, // (original value = 0) forced, // (original value = 1) restart, // (original value = 2) failover // (original value = 3) }; /* INTEGER */ typedef ASN1_Integer ServiceChangeDelay; /* INTEGER */ typedef ASN1_Integer TimeNotation; /* INTEGER */ typedef ASN1_Integer PacketsSent; /* INTEGER */ typedef ASN1_Integer OctetsSent; /* INTEGER */ typedef ASN1_Integer PacketsReceived; /* INTEGER */ typedef ASN1_Integer OctetsReceived; /* INTEGER */ typedef ASN1_Integer PacketsLost; /* INTEGER */ typedef ASN1_Integer Jitter; /* INTEGER */ typedef ASN1_Integer AverageLatency; Anquetil, Conte Informational - December 1999 12 MEGACO Protocol ASN1/IDL Syntax and API June 1999 /* PrintableString */ typedef PrintableStringType ErrorTextType; /* PrintableString */ typedef PrintableStringType DomainNameType; /* PrintableString */ typedef PrintableStringType TerminationIdType; /* PrintableString */ typedef PrintableStringType ParameterNameType; /* PrintableString */ typedef PrintableStringType ParameterValueType; /* PrintableString */ typedef PrintableStringType DigitMapNameType; /* PrintableString */ typedef PrintableStringType ScriptNameType; /* PrintableString */ typedef PrintableStringType EventNameType; /* PrintableString */ typedef PrintableStringType DigitMapType; /* PrintableString */ typedef PrintableStringType ServiceChangeReasonType; /* PrintableString */ typedef PrintableStringType CapabilitiesType; /* PrintableString */ typedef PrintableStringType TerminationDescriptorType; typedef sequence ParametersParameterValuesType; Anquetil, Conte Informational - December 1999 13 MEGACO Protocol ASN1/IDL Syntax and API June 1999 struct ErrorMessageType { ErrorCodeType errorCode; ErrorTextType errorText; }; struct SystemIdType { DomainNameType domainName; PortNumberType portNumber; }; struct LoopProcessControlType { LoopControlType loopControl; ProcessControlType processControl; }; /* TerminationDescriptor */ typedef TerminationDescriptorType LocalTerminationDescriptorType; /* TerminationDescriptor */ typedef TerminationDescriptorType RemoteTerminationDescriptorType; struct EventParameterType { ParameterNameType parameterName; ParameterValueType parameterValue; }; enum RequestedActionTypeChoice { tokenActionChoice, digitMapNameChoice, scriptNameChoice }; union RequestedActionType switch (RequestedActionTypeChoice) { case tokenActionChoice: TokenActionType tokenAction; case digitMapNameChoice: DigitMapNameType digitMapName; case scriptNameChoice: ScriptNameType scriptName; }; Anquetil, Conte Informational - December 1999 14 MEGACO Protocol ASN1/IDL Syntax and API June 1999 union LongTimerOpt switch (boolean) { case TRUE: LongTimer value; }; union ShortTimerOpt switch (boolean) { case TRUE: ShortTimer value; }; struct DigitMapValueType { LongTimerOpt longTimer; ShortTimerOpt shortTimer; DigitMapType digitMap; }; typedef sequence RequestedInfoType; enum StatisticsParameterTypeChoice { packetsSentChoice, octetsSentChoice, packetsReceivedChoice, octetsReceivedChoice, packetsLostChoice, jitterChoice, averageLatencyChoice }; union StatisticsParameterType switch (StatisticsParameterTypeChoice) { case packetsSentChoice: PacketsSent packetsSent; case octetsSentChoice: OctetsSent octetsSent; case packetsReceivedChoice: PacketsReceived packetsReceived; case octetsReceivedChoice: OctetsReceived octetsReceived; case packetsLostChoice: PacketsLost packetsLost; case jitterChoice: Jitter jitter; case averageLatencyChoice: AverageLatency averageLatency; }; /* SystemId */ typedef SystemIdType MGCIdentityType; typedef sequence SignalRequestEventParametersType; Anquetil, Conte Informational - December 1999 15 MEGACO Protocol ASN1/IDL Syntax and API June 1999 typedef sequence EmbeddedRequestedEventEventParametersType; typedef sequence RequestedEventEventParametersType; union TerminationIdTypeOpt switch (boolean) { case TRUE: TerminationIdType value; }; struct CommandRejectType { CommandNameType commandName; TerminationIdTypeOpt terminationId; ErrorMessageType errorMessage; }; enum BufferedEventHandlingTypeChoice { loopControlChoice, processControlChoice, loopProcessControlChoice }; union BufferedEventHandlingType switch (BufferedEventHandlingTypeChoice) { case loopControlChoice: LoopControlType loopControl; case processControlChoice: ProcessControlType processControl; case loopProcessControlChoice: LoopProcessControlType loopProcessControl; }; union EmbeddedRequestedEventEventParametersTypeOpt switch (boolean) { case TRUE: EmbeddedRequestedEventEventParametersType value; }; struct EmbeddedRequestedEventType { EventNameType eventName; EmbeddedRequestedEventEventParametersTypeOpt eventParameters; }; union SignalRequestEventParametersTypeOpt switch (boolean) { case TRUE: SignalRequestEventParametersType value; }; Anquetil, Conte Informational - December 1999 16 MEGACO Protocol ASN1/IDL Syntax and API June 1999 struct SignalRequestType { EventNameType eventName; SignalRequestEventParametersTypeOpt eventParameters; }; struct DigitMapDescriptorType { DigitMapNameType digitMapName; DigitMapValueType digitMapValue; }; union TimeNotationOpt switch (boolean) { case TRUE: TimeNotation value; }; struct ObservedEventType { TimeNotationOpt timeNotation; SignalRequestType signalRequest; }; typedef sequence StatisticsType; typedef sequence ObservedEventsObservedEventsType; typedef sequence ActionRejectCommandRejectsType; struct ActionRejectType { ContextId contextId; ActionRejectCommandRejectsType commandRejects; }; union TerminationModeTypeOpt switch (boolean) { case TRUE: TerminationModeType value; }; union BufferedEventHandlingTypeOpt switch (boolean) { case TRUE: BufferedEventHandlingType value; }; Anquetil, Conte Informational - December 1999 17 MEGACO Protocol ASN1/IDL Syntax and API June 1999 struct TerminationStateType { TerminationModeTypeOpt terminationMode; BufferedEventHandlingTypeOpt bufferedEventHandling; }; typedef sequence EmbeddedEventsDescriptorType; typedef sequence SignalDescriptorType; struct ObservedEventsType { RequestId requestId; ObservedEventsObservedEventsType observedEvents; }; typedef sequence TransactionRejectActionRejectsType; struct TransactionRejectType { TransactionId transactionId; TransactionRejectActionRejectsType actionRejects; }; union EmbeddedEventsDescriptorTypeOpt switch (boolean) { case TRUE: EmbeddedEventsDescriptorType value; }; union SignalDescriptorTypeOpt switch (boolean) { case TRUE: SignalDescriptorType value; }; struct EmbeddedSignalEventType { EmbeddedEventsDescriptorTypeOpt eventsDescriptor; SignalDescriptorTypeOpt signalDescriptor; }; union EmbeddedSignalEventTypeOpt switch (boolean) { case TRUE: EmbeddedSignalEventType value; }; union MediaActionTypeOpt Anquetil, Conte Informational - December 1999 18 MEGACO Protocol ASN1/IDL Syntax and API June 1999 switch (boolean) { case TRUE: MediaActionType value; }; struct RequestedActionsType { RequestedActionType requestedAction; EmbeddedSignalEventTypeOpt embeddedSignalEvent; MediaActionTypeOpt mediaAction; }; union RequestedEventEventParametersTypeOpt switch (boolean) { case TRUE: RequestedEventEventParametersType value; }; union RequestedActionsTypeOpt switch (boolean) { case TRUE: RequestedActionsType value; }; struct RequestedEventType { EventNameType eventName; RequestedEventEventParametersTypeOpt eventParameters; RequestedActionsTypeOpt requestedActions; }; typedef sequence EventsDescriptorType; union TerminationStateTypeOpt switch (boolean) { case TRUE: TerminationStateType value; }; union LocalTerminationDescriptorTypeOpt switch (boolean) { case TRUE: LocalTerminationDescriptorType value; }; union RemoteTerminationDescriptorTypeOpt switch (boolean) { case TRUE: RemoteTerminationDescriptorType value; }; union EventsDescriptorTypeOpt switch (boolean) { case TRUE: EventsDescriptorType value; }; union DigitMapDescriptorTypeOpt switch (boolean) { case TRUE: DigitMapDescriptorType value; }; union RequestedInfoTypeOpt switch (boolean) { Anquetil, Conte Informational - December 1999 19 MEGACO Protocol ASN1/IDL Syntax and API June 1999 case TRUE: RequestedInfoType value; }; union ServiceChangeMethodTypeOpt switch (boolean) { case TRUE: ServiceChangeMethodType value; }; union ServiceChangeReasonTypeOpt switch (boolean) { case TRUE: ServiceChangeReasonType value; }; union ServiceChangeDelayOpt switch (boolean) { case TRUE: ServiceChangeDelay value; }; union ObservedEventsTypeOpt switch (boolean) { case TRUE: ObservedEventsType value; }; union StatisticsTypeOpt switch (boolean) { case TRUE: StatisticsType value; }; union CapabilitiesTypeOpt switch (boolean) { case TRUE: CapabilitiesType value; }; union MGCIdentityTypeOpt switch (boolean) { case TRUE: MGCIdentityType value; }; union ParametersParameterValuesTypeOpt switch (boolean) { case TRUE: ParametersParameterValuesType value; }; struct ParametersType { TerminationStateTypeOpt terminationState; LocalTerminationDescriptorTypeOpt localTerminationDescriptor; RemoteTerminationDescriptorTypeOpt remoteTerminationDescriptor; EventsDescriptorTypeOpt eventsDescriptor; SignalDescriptorTypeOpt signalDescriptor; DigitMapDescriptorTypeOpt digitMapDescriptor; RequestedInfoTypeOpt requestedInfo; ServiceChangeMethodTypeOpt serviceChangeMethod; ServiceChangeReasonTypeOpt serviceChangeReason; ServiceChangeDelayOpt serviceChangeDelay; ObservedEventsTypeOpt observedEvents; StatisticsTypeOpt statistics; CapabilitiesTypeOpt capabilities; MGCIdentityTypeOpt mgcIdentity; ParametersParameterValuesTypeOpt parameterValues; Anquetil, Conte Informational - December 1999 20 MEGACO Protocol ASN1/IDL Syntax and API June 1999 }; typedef sequence CommandAcceptParametersType; union CommandAcceptParametersTypeOpt switch (boolean) { case TRUE: CommandAcceptParametersType value; }; struct CommandAcceptType { CommandNameType commandName; TerminationIdTypeOpt terminationId; CommandAcceptParametersTypeOpt parameters; }; struct CommandType { CommandNameType commandName; TerminationIdType terminationId; ParametersType parameters; }; typedef sequence ActionCommandsType; typedef sequence ActionAcceptCommandAcceptsType; struct ActionAcceptType { ContextId contextId; ActionAcceptCommandAcceptsType commandAccepts; }; struct ActionType { ContextId contextId; ActionCommandsType commands; }; typedef sequence TransactionAcceptActionAcceptsType; typedef sequence TransactionRequestActionsType; Anquetil, Conte Informational - December 1999 21 MEGACO Protocol ASN1/IDL Syntax and API June 1999 struct TransactionRequestType { TransactionId transactionId; TransactionRequestActionsType actions; }; struct TransactionAcceptType { TransactionId transactionId; TransactionAcceptActionAcceptsType actionAccepts; }; enum TransactionTypeChoice { transactionRequestChoice, transactionAcceptChoice, transactionRejectChoice }; union TransactionType switch (TransactionTypeChoice) { case transactionRequestChoice: TransactionRequestType transactionRequest; case transactionAcceptChoice: TransactionAcceptType transactionAccept; case transactionRejectChoice: TransactionRejectType transactionReject; }; typedef sequence MessageTransactionSeqType; struct MessageType { SystemIdType systemId; MessageTransactionSeqType transactionSeq; }; }; // end of module MEGACOP #endif /* conditional include of megaco.idl */ 6. Transactions API Anquetil, Conte Informational - December 1999 22 MEGACO Protocol ASN1/IDL Syntax and API June 1999 This very simple transactions API allows to send and receive MEGACOP messages, as defined in the megaco.idl file (see previous section). A client entity wishing to send transactions simply needs to fullfils the corresponding data structures (say in C++ as expressed by the OMG-IDL to C++ mapping rules). Conversely a server entity wishing to received transactions, simply needs to provide an implementation for the i_TransactionsReceiver interface. It shall get notified through the receive function with the received transactions as input parameter. #ifndef _TRANSACTIONS_IDL_ #define _TRANSACTIONS_IDL_ #include "megaco.idl" // see section 5.2 typedef sequence Transactions; interface i_TransactionsSender { oneway void send(in Transactions transactions); }; interface i_TransactionsReceiver { oneway void receive(in Transactions transactions); }; #endif 8. Security Considerations Security considerations are believed to be irrelevant to this draft. 9. References 1 Bradner, S., "The Internet Standards Process -- Revision 3", BCP 9, RFC 2026, October 1996. 2 Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997 3 "The Common Object Request Broker: Architecture and Specification", Revision 2.2 February 1998, Chapter 3 "OMG IDL Syntax and Semantics", http://www.omg.org 4 Recommandation X.208, "Open systems interconnection: specification of Abstract Syntax Notation (ASN.1)", CCITT Blue Book, Fascicle VIII.4, ITU, Geneva 1989, pp 57-130 Anquetil, Conte Informational - December 1999 23 MEGACO Protocol ASN1/IDL Syntax and API June 1999 5 Cuervo, F., Huitema, C., Kelly, K., Rosen, B., Sijben, P., Zimmerer, E., "MEGACO Protocol", , April 16, 1999 6 Crocker, D. and Overell, P.(Editors), "Augmented BNF for Syntax Specifications: ABNF", RFC 2234, Internet Mail Consortium and Demon Internet Ltd., November 1997 7 "X/Open, Preliminary Specification, Inter-Domain Management: Specification Translation, Feb 1997" http://www.opengroup.org/onlinepubs/8349099/toc.htm 8 GNU Snacc can be downloaded from http://www.fokus.gmd.de/ovma/freeware/snacc/entry.html. 9 ORBACUS source code can be downloaded from http://www.ooc.com/. It is free for non-commercial use. 10. Acknowledgments The authors are grateful to the authors of the MEGACO protocol draft, as well as to the authors of former proposals, who have contributed to the idea of a distributed call model, which goes actually far beyond the problem of distributed gateways. 11. Author's Addresses LP Anquetil, A Conte Alcatel CRC Route de Nozay, F-91461 Marcoussis Cedex France Email: laurent.anquetil@alcatel.fr, alberto.conte@alcatel.fr Anquetil, Conte Informational - December 1999 24 MEGACO Protocol ASN1/IDL Syntax and API June 1999 Full Copyright Statement "Copyright (C) The Internet Society (date). All Rights Reserved. This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implmentation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into Anquetil, Conte Informational - December 1999 25