summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/asn1/t125
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/asn1/t125
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/asn1/t125')
-rw-r--r--epan/dissectors/asn1/t125/CMakeLists.txt34
-rw-r--r--epan/dissectors/asn1/t125/MCS-PROTOCOL.asn445
-rw-r--r--epan/dissectors/asn1/t125/packet-t125-template.c171
-rw-r--r--epan/dissectors/asn1/t125/t125.cnf119
4 files changed, 769 insertions, 0 deletions
diff --git a/epan/dissectors/asn1/t125/CMakeLists.txt b/epan/dissectors/asn1/t125/CMakeLists.txt
new file mode 100644
index 00000000..5db69d80
--- /dev/null
+++ b/epan/dissectors/asn1/t125/CMakeLists.txt
@@ -0,0 +1,34 @@
+# CMakeLists.txt
+#
+# Wireshark - Network traffic analyzer
+# By Gerald Combs <gerald@wireshark.org>
+# Copyright 1998 Gerald Combs
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+
+set( PROTOCOL_NAME t125 )
+
+set( PROTO_OPT )
+
+set( EXT_ASN_FILE_LIST
+)
+
+set( ASN_FILE_LIST
+ MCS-PROTOCOL.asn
+)
+
+set( EXTRA_DIST
+ ${ASN_FILE_LIST}
+ packet-${PROTOCOL_NAME}-template.c
+ ${PROTOCOL_NAME}.cnf
+)
+
+set( SRC_FILES
+ ${EXTRA_DIST}
+ ${EXT_ASN_FILE_LIST}
+)
+
+set( A2W_FLAGS -b )
+
+ASN2WRS()
diff --git a/epan/dissectors/asn1/t125/MCS-PROTOCOL.asn b/epan/dissectors/asn1/t125/MCS-PROTOCOL.asn
new file mode 100644
index 00000000..95fda658
--- /dev/null
+++ b/epan/dissectors/asn1/t125/MCS-PROTOCOL.asn
@@ -0,0 +1,445 @@
+-- Module MCS-PROTOCOL (T.125:02/1998)
+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
+
diff --git a/epan/dissectors/asn1/t125/packet-t125-template.c b/epan/dissectors/asn1/t125/packet-t125-template.c
new file mode 100644
index 00000000..8a7e99cb
--- /dev/null
+++ b/epan/dissectors/asn1/t125/packet-t125-template.c
@@ -0,0 +1,171 @@
+/* packet-t125.c
+ * Routines for t125 packet dissection
+ * Copyright 2007, Ronnie Sahlberg
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ */
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include <epan/exceptions.h>
+
+#include <epan/asn1.h>
+#include "packet-ber.h"
+#include "packet-per.h"
+
+#include "packet-t124.h"
+
+#define PNAME "MULTIPOINT-COMMUNICATION-SERVICE T.125"
+#define PSNAME "T.125"
+#define PFNAME "t125"
+
+
+#define HF_T125_ERECT_DOMAIN_REQUEST 1
+#define HF_T125_DISCONNECT_PROVIDER_ULTIMATUM 8
+#define HF_T125_ATTACH_USER_REQUEST 10
+#define HF_T125_ATTACH_USER_CONFIRM 11
+#define HF_T125_CHANNEL_JOIN_REQUEST 14
+#define HF_T125_CHANNEL_JOIN_CONFIRM 15
+#define HF_T125_SEND_DATA_REQUEST 25
+#define HF_T125_SEND_DATA_INDICATION 26
+
+void proto_register_t125(void);
+void proto_reg_handoff_t125(void);
+
+/* Initialize the protocol and registered fields */
+static int proto_t125 = -1;
+static proto_tree *top_tree = NULL;
+#include "packet-t125-hf.c"
+
+/* Initialize the subtree pointers */
+static int ett_t125 = -1;
+
+#include "packet-t125-ett.c"
+
+static heur_dissector_list_t t125_heur_subdissector_list;
+
+#include "packet-t125-fn.c"
+
+static int
+dissect_t125(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void *data _U_)
+{
+ proto_item *item = NULL;
+ proto_tree *tree = NULL;
+ gint8 ber_class;
+ bool pc;
+ gint32 tag;
+
+ top_tree = parent_tree;
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "T.125");
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ item = proto_tree_add_item(parent_tree, proto_t125, tvb, 0, tvb_captured_length(tvb), ENC_NA);
+ tree = proto_item_add_subtree(item, ett_t125);
+
+ get_ber_identifier(tvb, 0, &ber_class, &pc, &tag);
+
+ if ( (ber_class==BER_CLASS_APP) && (tag>=101) && (tag<=104) ){
+ dissect_ConnectMCSPDU_PDU(tvb, pinfo, tree, NULL);
+ } else {
+ t124_set_top_tree(top_tree);
+ dissect_DomainMCSPDU_PDU(tvb, pinfo, tree);
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+static gboolean
+dissect_t125_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void *data _U_)
+{
+ gint8 ber_class;
+ bool pc;
+ gint32 tag;
+ volatile bool failed;
+
+ /*
+ * We must catch all the "ran past the end of the packet" exceptions
+ * here and, if we catch one, just return FALSE. It's too painful
+ * to have a version of dissect_per_sequence() that checks all
+ * references to the tvbuff before making them and returning "no"
+ * if they would fail.
+ */
+ failed = FALSE;
+ TRY {
+ /* could be BER */
+ get_ber_identifier(tvb, 0, &ber_class, &pc, &tag);
+ } CATCH_BOUNDS_ERRORS {
+ failed = TRUE;
+ } ENDTRY;
+
+ if (failed) {
+ return FALSE;
+ }
+
+ if (((ber_class==BER_CLASS_APP) && ((tag>=101) && (tag<=104)))) {
+ dissect_t125(tvb, pinfo, parent_tree, NULL);
+
+ return TRUE;
+ }
+
+ /*
+ * Check that the first byte of the packet is a valid t125/MCS header.
+ * This might not be enough, but since t125 only catch COTP packets,
+ * it should not be a problem.
+ */
+ guint8 first_byte = tvb_get_guint8(tvb, 0) >> 2;
+ switch (first_byte) {
+ case HF_T125_ERECT_DOMAIN_REQUEST:
+ case HF_T125_ATTACH_USER_REQUEST:
+ case HF_T125_ATTACH_USER_CONFIRM:
+ case HF_T125_CHANNEL_JOIN_REQUEST:
+ case HF_T125_CHANNEL_JOIN_CONFIRM:
+ case HF_T125_DISCONNECT_PROVIDER_ULTIMATUM:
+ case HF_T125_SEND_DATA_REQUEST:
+ case HF_T125_SEND_DATA_INDICATION:
+ dissect_t125(tvb, pinfo, parent_tree, NULL);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+/*--- proto_register_t125 -------------------------------------------*/
+void proto_register_t125(void) {
+
+ /* List of fields */
+ static hf_register_info hf[] = {
+#include "packet-t125-hfarr.c"
+ };
+
+ /* List of subtrees */
+ static gint *ett[] = {
+ &ett_t125,
+#include "packet-t125-ettarr.c"
+ };
+
+ /* Register protocol */
+ proto_t125 = proto_register_protocol(PNAME, PSNAME, PFNAME);
+ /* Register fields and subtrees */
+ proto_register_field_array(proto_t125, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ t125_heur_subdissector_list= register_heur_dissector_list("t125", proto_t125);
+
+ register_dissector("t125", dissect_t125, proto_t125);
+}
+
+
+/*--- proto_reg_handoff_t125 ---------------------------------------*/
+void proto_reg_handoff_t125(void) {
+
+ heur_dissector_add("cotp", dissect_t125_heur, "T.125 over COTP", "t125_cotp", proto_t125, HEURISTIC_ENABLE);
+ heur_dissector_add("cotp_is", dissect_t125_heur, "T.125 over COTP (inactive subset)", "t125_cotp_is", proto_t125, HEURISTIC_ENABLE);
+}
diff --git a/epan/dissectors/asn1/t125/t125.cnf b/epan/dissectors/asn1/t125/t125.cnf
new file mode 100644
index 00000000..012896f6
--- /dev/null
+++ b/epan/dissectors/asn1/t125/t125.cnf
@@ -0,0 +1,119 @@
+# T.125/MCS-PROTOCOL.cnf
+# Copyright 2007 Ronnie Sahlberg
+#----------------------------------------------------------------------------------------
+#.EXPORTS
+#----------------------------------------------------------------------------------------
+#.END
+
+#.OMIT_ASSIGNMENT
+# dissected in t124
+DomainMCSPDU
+PlumbDomainIndication
+ErectDomainRequest
+MergeChannelsRequest
+MergeChannelsConfirm
+PurgeChannelsIndication
+MergeTokensRequest
+MergeTokensConfirm
+PurgeTokensIndication
+DisconnectProviderUltimatum
+RejectMCSPDUUltimatum
+AttachUserRequest
+AttachUserConfirm
+DetachUserRequest
+DetachUserIndication
+ChannelJoinRequest
+ChannelJoinConfirm
+ChannelLeaveRequest
+ChannelConveneRequest
+ChannelConveneConfirm
+ChannelDisbandRequest
+ChannelDisbandIndication
+ChannelAdmitRequest
+ChannelAdmitIndication
+ChannelExpelRequest
+ChannelExpelIndication
+SendDataRequest
+SendDataIndication
+UniformSendDataRequest
+UniformSendDataIndication
+TokenGrabConfirm
+TokenInhibitRequest
+TokenInhibitConfirm
+TokenGiveRequest
+TokenGiveIndication
+TokenGiveResponse
+TokenGiveConfirm
+TokenPleaseRequest
+TokenPleaseIndication
+TokenReleaseRequest
+TokenReleaseConfirm
+TokenTestRequest
+TokenTestConfirm
+TokenStatus
+Segmentation
+ChannelAttributes
+TokenAttributes
+TokenGrabRequest
+Reason
+Diagnostic
+StaticChannelId
+UserId
+PrivateChannelId
+AssignedChannelId
+TokenId
+DynamicChannelId
+ChannelId
+
+#----------------------------------------------------------------------------------------
+
+#.PDU
+#----------------------------------------------------------------------------------------
+ConnectMCSPDU
+#.END
+
+#.VIRTUAL_ASSGN
+#----------------------------------------------------------------------------------------
+
+# dissected in t124
+# FN_BODY DomainMCSPDU VAL_PTR = &domainmcs_value
+# gint domainmcs_value;
+#
+#%(DEFAULT_BODY)s
+# switch(domainmcs_value) {
+# case 25: /* sendDataRequest */
+# case 26: /* sendDataIndication */
+# case 27: /* uniformSendDataRequest */
+# case 28: /* uniformSendDataIndication */
+# /* Do nothing */
+# break;
+# default:
+# col_append_sep_fstr(%(ACTX)s->pinfo->cinfo, COL_INFO, " ", "MCS: %%s ", val_to_str(domainmcs_value, t125_DomainMCSPDU_vals, "Unknown"));
+# break;
+# }
+# END
+
+#.FN_BODY Connect-Initial/_untag/userData VAL_PTR = &next_tvb
+#.FN_BODY Connect-Initial/_untag/userData
+ tvbuff_t *next_tvb = NULL;
+ heur_dtbl_entry_t *hdtbl_entry;
+%(DEFAULT_BODY)s
+ if(next_tvb)
+ dissector_try_heuristic(t125_heur_subdissector_list, next_tvb,
+ actx->pinfo, top_tree, &hdtbl_entry, NULL);
+#.END
+
+#.FN_BODY Connect-Response/_untag/userData VAL_PTR = &next_tvb
+#.FN_BODY Connect-Response/_untag/userData
+ tvbuff_t *next_tvb = NULL;
+ heur_dtbl_entry_t *hdtbl_entry;
+
+%(DEFAULT_BODY)s
+ if(next_tvb)
+ dissector_try_heuristic(t125_heur_subdissector_list, next_tvb,
+ actx->pinfo, top_tree, &hdtbl_entry, NULL);
+#.END
+
+
+#----------------------------------------------------------------------------------------
+# vim:set ts=4 sts=2 sw=2: