-- Module MCS-PROTOCOL (T.125:02/1998)
-- See also ITU-T T.125 (02/1998)
-- See also the index of all ASN.1 assignments needed in this document

MCS-PROTOCOL DEFINITIONS ::=
BEGIN

--  Part 1: Fundamental MCS types
ChannelId ::= INTEGER(0..65535) --  range is 16 bits
                     

StaticChannelId ::= ChannelId(1..1000) --  those known permanently
                             

DynamicChannelId ::= ChannelId(1001..65535) --  those created and deleted
                              

UserId ::= DynamicChannelId --  created by Attach-User

--  deleted by Detach-User
PrivateChannelId ::=
  DynamicChannelId --  created by Channel-Convene

--  deleted by Channel-Disband
AssignedChannelId ::=
  DynamicChannelId --  created by Channel-Join zero

--  deleted by last Channel-Leave
TokenId ::= INTEGER(1..65535) --  all are known permanently
                   

TokenStatus ::= ENUMERATED {
  notInUse(0), selfGrabbed(1), otherGrabbed(2), selfInhibited(3),
  otherInhibited(4), selfRecipient(5), selfGiving(6), otherGiving(7)}

DataPriority ::= ENUMERATED {top(0), high(1), medium(2), low(3)}

Segmentation ::= BIT STRING {begin(0), end(1)}(SIZE (2))

DomainParameters ::= SEQUENCE {
  maxChannelIds    INTEGER(0..MAX),
  --  a limit on channel ids in use,
  --  static + user id + private + assigned
  maxUserIds       INTEGER(0..MAX),
  --  a sublimit on user id channels alone
  maxTokenIds      INTEGER(0..MAX),
  --  a limit on token ids in use
  --  grabbed + inhibited + giving + ungivable + given
  numPriorities    INTEGER(0..MAX),
  --  the number of TCs in an MCS connection
  minThroughput    INTEGER(0..MAX),
  --  the enforced number of octets per second
  maxHeight        INTEGER(0..MAX),
  --  a limit on the height of a provider
  maxMCSPDUsize    INTEGER(0..MAX),
  --  an octet limit on domain MCSPDUs
  protocolVersion  INTEGER(0..MAX)
}

--  Part 2: Connect provider
Connect-Initial ::= [APPLICATION 101] IMPLICIT SEQUENCE {
  callingDomainSelector  OCTET STRING,
  calledDomainSelector   OCTET STRING,
  upwardFlag             BOOLEAN,
  --  TRUE if called provider is higher
  targetParameters       DomainParameters,
  minimumParameters      DomainParameters,
  maximumParameters      DomainParameters,
  userData               OCTET STRING
}

Connect-Response ::= [APPLICATION 102] IMPLICIT SEQUENCE {
  result            Result,
  calledConnectId   INTEGER(0..MAX),
  --  assigned by the called provider
  --  to identify additional TCs of 
  --  the same MCS connection
  domainParameters  DomainParameters,
  userData          OCTET STRING
}

Connect-Additional ::= [APPLICATION 103] IMPLICIT SEQUENCE {
  calledConnectId  INTEGER(0..MAX),
  dataPriority     DataPriority
}

Connect-Result ::= [APPLICATION 104] IMPLICIT SEQUENCE {result  Result
}

--  Part 3: Merge domain
PlumbDomainIndication ::= [APPLICATION 0] IMPLICIT SEQUENCE {
  heightLimit  INTEGER(0..MAX)
} --  a restriction on the MCSPDU receiver

ErectDomainRequest ::= [APPLICATION 1] IMPLICIT SEQUENCE {
  subHeight    INTEGER(0..MAX),
  --  height in domain of the MCSPDU transmitter
  subInterval  INTEGER(0..MAX)
} --  its throughput enforcement interval in milliseconds

ChannelAttributes ::= CHOICE {
  static    [0] IMPLICIT SEQUENCE {channelId  StaticChannelId}, --  joined is implicitly TRUE
  userId
    [1] IMPLICIT SEQUENCE {joined  BOOLEAN,
                           --  TRUE if user is joined to its user id
                           userId  UserId},
  private
    [2] IMPLICIT SEQUENCE {joined     BOOLEAN,
                           --  TRUE if channel id is joined below
                           channelId  PrivateChannelId,
                           manager    UserId,
                           admitted   SET OF UserId}, --  may span multiple MergeChannelsRequest
  assigned  [3] IMPLICIT SEQUENCE {channelId  AssignedChannelId} --  joined is implicitly TRUE
}

MergeChannelsRequest ::= [APPLICATION 2] IMPLICIT SEQUENCE {
  mergeChannels    SET OF ChannelAttributes,
  purgeChannelIds  SET OF ChannelId
}

MergeChannelsConfirm ::= [APPLICATION 3] IMPLICIT SEQUENCE {
  mergeChannels    SET OF ChannelAttributes,
  purgeChannelIds  SET OF ChannelId
}

PurgeChannelsIndication ::= [APPLICATION 4] IMPLICIT SEQUENCE {
  detachUserIds    SET OF UserId,
  --  purge user id channels
  purgeChannelIds  SET OF ChannelId
} --  purge other channels

TokenAttributes ::= CHOICE {
  grabbed    [0] IMPLICIT SEQUENCE {tokenId  TokenId,
                                    grabber  UserId},
  inhibited
    [1] IMPLICIT SEQUENCE {tokenId     TokenId,
                           inhibitors  SET OF UserId}, --  may span multiple MergeTokensRequest
  giving
    [2] IMPLICIT SEQUENCE {tokenId    TokenId,
                           grabber    UserId,
                           recipient  UserId},
  ungivable  [3] IMPLICIT SEQUENCE {tokenId  TokenId,
                                    grabber  UserId}, --  recipient has since detached
  given      [4] IMPLICIT SEQUENCE {tokenId    TokenId,
                                    recipient  UserId} --  grabber released or detached
}

MergeTokensRequest ::= [APPLICATION 5] IMPLICIT SEQUENCE {
  mergeTokens    SET OF TokenAttributes,
  purgeTokenIds  SET OF TokenId
}

MergeTokensConfirm ::= [APPLICATION 6] IMPLICIT SEQUENCE {
  mergeTokens    SET OF TokenAttributes,
  purgeTokenIds  SET OF TokenId
}

PurgeTokensIndication ::= [APPLICATION 7] IMPLICIT SEQUENCE {
  purgeTokenIds  SET OF TokenId
}

--  Part 4: Disconnect provider
DisconnectProviderUltimatum ::= [APPLICATION 8] IMPLICIT SEQUENCE {
  reason  Reason
}

RejectMCSPDUUltimatum ::= [APPLICATION 9] IMPLICIT SEQUENCE {
  diagnostic     Diagnostic,
  initialOctets  OCTET STRING
}

--  Part 5: Attach/Detach user
AttachUserRequest ::= [APPLICATION 10] IMPLICIT SEQUENCE {
}

AttachUserConfirm ::= [APPLICATION 11] IMPLICIT SEQUENCE {
  result     Result,
  initiator  UserId OPTIONAL
}

DetachUserRequest ::= [APPLICATION 12] IMPLICIT SEQUENCE {
  reason   Reason,
  userIds  SET OF UserId
}

DetachUserIndication ::= [APPLICATION 13] IMPLICIT SEQUENCE {
  reason   Reason,
  userIds  SET OF UserId
}

--  Part 6: Channel management
ChannelJoinRequest ::= [APPLICATION 14] IMPLICIT SEQUENCE {
  initiator  UserId,
  channelId  ChannelId
} --  may be zero

ChannelJoinConfirm ::= [APPLICATION 15] IMPLICIT SEQUENCE {
  result     Result,
  initiator  UserId,
  requested  ChannelId,
  --  may be zero
  channelId  ChannelId OPTIONAL
}

ChannelLeaveRequest ::= [APPLICATION 16] IMPLICIT SEQUENCE {
  channelIds  SET OF ChannelId
}

ChannelConveneRequest ::= [APPLICATION 17] IMPLICIT SEQUENCE {initiator  UserId
}

ChannelConveneConfirm ::= [APPLICATION 18] IMPLICIT SEQUENCE {
  result     Result,
  initiator  UserId,
  channelId  PrivateChannelId OPTIONAL
}

ChannelDisbandRequest ::= [APPLICATION 19] IMPLICIT SEQUENCE {
  initiator  UserId,
  channelId  PrivateChannelId
}

ChannelDisbandIndication ::= [APPLICATION 20] IMPLICIT SEQUENCE {
  channelId  PrivateChannelId
}

ChannelAdmitRequest ::= [APPLICATION 21] IMPLICIT SEQUENCE {
  initiator  UserId,
  channelId  PrivateChannelId,
  userIds    SET OF UserId
}

ChannelAdmitIndication ::= [APPLICATION 22] IMPLICIT SEQUENCE {
  initiator  UserId,
  channelId  PrivateChannelId,
  userIds    SET OF UserId
}

ChannelExpelRequest ::= [APPLICATION 23] IMPLICIT SEQUENCE {
  initiator  UserId,
  channelId  PrivateChannelId,
  userIds    SET OF UserId
}

ChannelExpelIndication ::= [APPLICATION 24] IMPLICIT SEQUENCE {
  channelId  PrivateChannelId,
  userIds    SET OF UserId
}

--  Part 7: Data transfer
SendDataRequest ::= [APPLICATION 25] IMPLICIT SEQUENCE {
  initiator     UserId,
  channelId     ChannelId,
  dataPriority  DataPriority,
  segmentation  Segmentation,
  userData      OCTET STRING
}

SendDataIndication ::= [APPLICATION 26] IMPLICIT SEQUENCE {
  initiator     UserId,
  channelId     ChannelId,
  dataPriority  DataPriority,
  segmentation  Segmentation,
  userData      OCTET STRING
}

UniformSendDataRequest ::= [APPLICATION 27] IMPLICIT SEQUENCE {
  initiator     UserId,
  channelId     ChannelId,
  dataPriority  DataPriority,
  segmentation  Segmentation,
  userData      OCTET STRING
}

UniformSendDataIndication ::= [APPLICATION 28] IMPLICIT SEQUENCE {
  initiator     UserId,
  channelId     ChannelId,
  dataPriority  DataPriority,
  segmentation  Segmentation,
  userData      OCTET STRING
}

--  Part 8: Token management
TokenGrabRequest ::= [APPLICATION 29] IMPLICIT SEQUENCE {
  initiator  UserId,
  tokenId    TokenId
}

TokenGrabConfirm ::= [APPLICATION 30] IMPLICIT SEQUENCE {
  result       Result,
  initiator    UserId,
  tokenId      TokenId,
  tokenStatus  TokenStatus
}

TokenInhibitRequest ::= [APPLICATION 31] IMPLICIT SEQUENCE {
  initiator  UserId,
  tokenId    TokenId
}

TokenInhibitConfirm ::= [APPLICATION 32] IMPLICIT SEQUENCE {
  result       Result,
  initiator    UserId,
  tokenId      TokenId,
  tokenStatus  TokenStatus
}

TokenGiveRequest ::= [APPLICATION 33] IMPLICIT SEQUENCE {
  initiator  UserId,
  tokenId    TokenId,
  recipient  UserId
}

TokenGiveIndication ::= [APPLICATION 34] IMPLICIT SEQUENCE {
  initiator  UserId,
  tokenId    TokenId,
  recipient  UserId
}

TokenGiveResponse ::= [APPLICATION 35] IMPLICIT SEQUENCE {
  result     Result,
  recipient  UserId,
  tokenId    TokenId
}

TokenGiveConfirm ::= [APPLICATION 36] IMPLICIT SEQUENCE {
  result       Result,
  initiator    UserId,
  tokenId      TokenId,
  tokenStatus  TokenStatus
}

TokenPleaseRequest ::= [APPLICATION 37] IMPLICIT SEQUENCE {
  initiator  UserId,
  tokenId    TokenId
}

TokenPleaseIndication ::= [APPLICATION 38] IMPLICIT SEQUENCE {
  initiator  UserId,
  tokenId    TokenId
}

TokenReleaseRequest ::= [APPLICATION 39] IMPLICIT SEQUENCE {
  initiator  UserId,
  tokenId    TokenId
}

TokenReleaseConfirm ::= [APPLICATION 40] IMPLICIT SEQUENCE {
  result       Result,
  initiator    UserId,
  tokenId      TokenId,
  tokenStatus  TokenStatus
}

TokenTestRequest ::= [APPLICATION 41] IMPLICIT SEQUENCE {
  initiator  UserId,
  tokenId    TokenId
}

TokenTestConfirm ::= [APPLICATION 42] IMPLICIT SEQUENCE {
  initiator    UserId,
  tokenId      TokenId,
  tokenStatus  TokenStatus
}

--  Part 9: Status codes
--  in DisconnectProviderUltimatum, DetachUserRequest, DetachUserIndication
Reason ::= ENUMERATED {
  rn-domain-disconnected(0), rn-provider-initiated(1), rn-token-purged(2),
  rn-user-requested(3), rn-channel-purged(4)}

--  in Connect, response, confirm
Result ::= ENUMERATED {
  rt-successful(0), rt-domain-merging(1), rt-domain-not-hierarchical(2),
  rt-no-such-channel(3), rt-no-such-domain(4), rt-no-such-user(5),
  rt-not-admitted(6), rt-other-user-id(7), rt-parameters-unacceptable(8),
  rt-token-not-available(9), rt-token-not-possessed(10),
  rt-too-many-channels(11), rt-too-many-tokens(12), rt-too-many-users(13),
  rt-unspecified-failure(14), rt-user-rejected(15)}

--  in RejectMCSPDUUltimatum
Diagnostic ::= ENUMERATED {
  dc-inconsistent-merge(0), dc-forbidden-PDU-downward(1),
  dc-forbidden-PDU-upward(2), dc-invalid-BER-encoding(3),
  dc-invalid-PER-encoding(4), dc-misrouted-user(5), dc-unrequested-confirm(6),
  dc-wrong-transport-priority(7), dc-channel-id-conflict(8),
  dc-token-id-conflict(9), dc-not-user-id-channel(10),
  dc-too-many-channels(11), dc-too-many-tokens(12), dc-too-many-users(13)
}

--  Part 10: MCSPDU repertoire
ConnectMCSPDU ::= CHOICE {
  connect-initial     Connect-Initial,
  connect-response    Connect-Response,
  connect-additional  Connect-Additional,
  connect-result      Connect-Result
}

DomainMCSPDU ::= CHOICE {
  plumbDomainIndication        PlumbDomainIndication,
  erectDomainRequest           ErectDomainRequest,
  mergeChannelsRequest         MergeChannelsRequest,
  mergeChannelsConfirm         MergeChannelsConfirm,
  purgeChannelsIndication      PurgeChannelsIndication,
  mergeTokensRequest           MergeTokensRequest,
  mergeTokensConfirm           MergeTokensConfirm,
  purgeTokensIndication        PurgeTokensIndication,
  disconnectProviderUltimatum  DisconnectProviderUltimatum,
  rejectMCSPDUUltimatum        RejectMCSPDUUltimatum,
  attachUserRequest            AttachUserRequest,
  attachUserConfirm            AttachUserConfirm,
  detachUserRequest            DetachUserRequest,
  detachUserIndication         DetachUserIndication,
  channelJoinRequest           ChannelJoinRequest,
  channelJoinConfirm           ChannelJoinConfirm,
  channelLeaveRequest          ChannelLeaveRequest,
  channelConveneRequest        ChannelConveneRequest,
  channelConveneConfirm        ChannelConveneConfirm,
  channelDisbandRequest        ChannelDisbandRequest,
  channelDisbandIndication     ChannelDisbandIndication,
  channelAdmitRequest          ChannelAdmitRequest,
  channelAdmitIndication       ChannelAdmitIndication,
  channelExpelRequest          ChannelExpelRequest,
  channelExpelIndication       ChannelExpelIndication,
  sendDataRequest              SendDataRequest,
  sendDataIndication           SendDataIndication,
  uniformSendDataRequest       UniformSendDataRequest,
  uniformSendDataIndication    UniformSendDataIndication,
  tokenGrabRequest             TokenGrabRequest,
  tokenGrabConfirm             TokenGrabConfirm,
  tokenInhibitRequest          TokenInhibitRequest,
  tokenInhibitConfirm          TokenInhibitConfirm,
  tokenGiveRequest             TokenGiveRequest,
  tokenGiveIndication          TokenGiveIndication,
  tokenGiveResponse            TokenGiveResponse,
  tokenGiveConfirm             TokenGiveConfirm,
  tokenPleaseRequest           TokenPleaseRequest,
  tokenPleaseIndication        TokenPleaseIndication,
  tokenReleaseRequest          TokenReleaseRequest,
  tokenReleaseConfirm          TokenReleaseConfirm,
  tokenTestRequest             TokenTestRequest,
  tokenTestConfirm             TokenTestConfirm
}

END
-- Generated by Asnp, the ASN.1 pretty-printer of France Telecom R&D