From Graeme Lunt
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Sun, 4 Sep 2005 20:30:31 +0000 (20:30 +0000)
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Sun, 4 Sep 2005 20:30:31 +0000 (20:30 +0000)
 I attach my RTSE dissector (in tar file) which requires the included ROS dissector, as well as a patch to the latest pres.{cnf,asn}. The ROS dissector uses a new field in the SESSION_DATA_STRUCTURE to pass the ROS operation to the sub-dissector, though this is also set by other dissectors (RTSE uses it in X.410 mode).

 Note that X.400 P1 in X.410 mode doesn't use ROS, so it is useful not to explicitly include ROS in my X411 dissector. However, the inclusion of a ROS dissector won't effect any dissectors that currently implement their own ROS.

 I also include dissectors for:

 X.411  (P1)  X.400 OSI Message Transfer Service
 X.420  (P22)  X.400 OSI Information Object
 STANAG 4406 (P772) STANAG 4406 Military Message Extensions (to P22)

 These rely on the RTSE and ROS dissectors.

Withs some changes to remove various warnings and errors.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@15680 f5534014-38df-0310-8fa8-9805f1628bb7

20 files changed:
asn1/pres/packet-pres-template.c
asn1/ros/packet-ros-template.c
asn1/rtse/packet-rtse-template.c
asn1/rtse/packet-rtse-template.h
asn1/s4406/packet-s4406-template.c
asn1/x420/packet-x420-template.c
asn1/x420/packet-x420-template.h
epan/dissectors/Makefile.common
epan/dissectors/packet-pres.c
epan/dissectors/packet-ros.c [new file with mode: 0644]
epan/dissectors/packet-ros.h [new file with mode: 0644]
epan/dissectors/packet-rtse.c [new file with mode: 0644]
epan/dissectors/packet-rtse.h [new file with mode: 0644]
epan/dissectors/packet-s4406.c [new file with mode: 0644]
epan/dissectors/packet-s4406.h [new file with mode: 0644]
epan/dissectors/packet-ses.h
epan/dissectors/packet-x411.c [new file with mode: 0644]
epan/dissectors/packet-x411.h [new file with mode: 0644]
epan/dissectors/packet-x420.c [new file with mode: 0644]
epan/dissectors/packet-x420.h [new file with mode: 0644]

index bddc97f1a0bb4a0ca26126981c56a6844be3d4d0..cbfbe60692cee530e1dabfd918bc2b75049c4096 100644 (file)
@@ -39,6 +39,7 @@
 #include "packet-ber.h"
 #include "packet-ses.h"
 #include "packet-pres.h"
 #include "packet-ber.h"
 #include "packet-ses.h"
 #include "packet-pres.h"
+#include "packet-rtse.h"
 
 
 #define PNAME  "ISO 8823 OSI Presentation Protocol"
 
 
 #define PNAME  "ISO 8823 OSI Presentation Protocol"
index 8d432e5dc7c119334c13729b5684cde01ad437a3..6d507885967b172d70efb296b1ab0ee82115f691 100644 (file)
@@ -35,7 +35,7 @@
 #include <string.h>
 
 #include "packet-ber.h"
 #include <string.h>
 
 #include "packet-ber.h"
-#include "packet-acse.h"
+#include "packet-pres.h"
 #include "packet-ros.h"
 
 #define PNAME  "X.880 OSI Remote Operations Service"
 #include "packet-ros.h"
 
 #define PNAME  "X.880 OSI Remote Operations Service"
@@ -56,8 +56,6 @@ static guint32 opcode;
 static gint ett_ros = -1;
 #include "packet-ros-ett.c"
 
 static gint ett_ros = -1;
 #include "packet-ros-ett.c"
 
-#include "packet-ros-fn.c"
-
 static dissector_table_t ros_oid_dissector_table=NULL;
 static GHashTable *oid_table=NULL;
 static gint ett_ros_unknown = -1;
 static dissector_table_t ros_oid_dissector_table=NULL;
 static GHashTable *oid_table=NULL;
 static gint ett_ros_unknown = -1;
@@ -95,6 +93,9 @@ call_ros_oid_callback(const char *oid, tvbuff_t *tvb, int offset, packet_info *p
        return offset;
 }
 
        return offset;
 }
 
+#include "packet-ros-fn.c"
+
+
 /*
 * Dissect ROS PDUs inside a PPDU.
 */
 /*
 * Dissect ROS PDUs inside a PPDU.
 */
index 6bf6c6484a7e0c56a4dd84fff22d60bd384ef897..61be93a243407e5809efd8b64cb79637cdf3bf1e 100644 (file)
@@ -57,6 +57,8 @@ static guint32 app_proto=0;
 
 static proto_tree *top_tree=NULL;
 
 
 static proto_tree *top_tree=NULL;
 
+static int dissect_rtse_EXTERNAL(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_);
+
 
 #include "packet-rtse-hf.c"
 
 
 #include "packet-rtse-hf.c"
 
@@ -64,7 +66,6 @@ static proto_tree *top_tree=NULL;
 static gint ett_rtse = -1;
 #include "packet-rtse-ett.c"
 
 static gint ett_rtse = -1;
 #include "packet-rtse-ett.c"
 
-#include "packet-rtse-fn.c"
 
 static dissector_table_t rtse_oid_dissector_table=NULL;
 static GHashTable *oid_table=NULL;
 
 static dissector_table_t rtse_oid_dissector_table=NULL;
 static GHashTable *oid_table=NULL;
@@ -103,6 +104,8 @@ call_rtse_oid_callback(const char *oid, tvbuff_t *tvb, int offset, packet_info *
        return offset;
 }
 
        return offset;
 }
 
+#include "packet-rtse-fn.c"
+
 /*
 * Dissect RTSE PDUs inside a PPDU.
 */
 /*
 * Dissect RTSE PDUs inside a PPDU.
 */
index 76003742a08aa2a9aff846caba108d4fb3bc26f7..901ac4bb834e00abba7795d83ddda57a935bbe49 100644 (file)
@@ -26,7 +26,8 @@
 #ifndef PACKET_RTSE_H
 #define PACKET_RTSE_H
 
 #ifndef PACKET_RTSE_H
 #define PACKET_RTSE_H
 
-/*#include "packet-rtse-exp.h"*/
+#include "packet-rtse-exp.h"
+
 void register_rtse_oid_dissector_handle(const char *oid, dissector_handle_t dissector, int proto _U_, const char *name);
 
 #endif  /* PACKET_RTSE_H */
 void register_rtse_oid_dissector_handle(const char *oid, dissector_handle_t dissector, int proto _U_, const char *name);
 
 #endif  /* PACKET_RTSE_H */
index d864769cbca348e81afa0e96064699c047ca0b4e..be7c53d40e4633bedb190dd2dfcfc15156f4d563 100644 (file)
@@ -39,6 +39,8 @@
 #include "packet-x509if.h"
 
 #include "packet-s4406.h"
 #include "packet-x509if.h"
 
 #include "packet-s4406.h"
+#include "packet-x411.h" 
+#include "packet-x420.h" 
 
 #define PNAME  "STANAG 4406 Military Message Extensions"
 #define PSNAME "STANAG 4406"
 
 #define PNAME  "STANAG 4406 Military Message Extensions"
 #define PSNAME "STANAG 4406"
index d7a55fd108abb9cf08500c41a0d05f0fadcb7d98..bb727a78c138b8bbf1c0352f9053f2548955822a 100644 (file)
@@ -67,11 +67,9 @@ static void
 dissect_x420(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
 {
        int offset = 0;
 dissect_x420(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
 {
        int offset = 0;
-       int old_offset;
        proto_item *item=NULL;
        proto_tree *tree=NULL;
        int (*x420_dissector)(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) = NULL;
        proto_item *item=NULL;
        proto_tree *tree=NULL;
        int (*x420_dissector)(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) = NULL;
-       char *x420_op_name;
 
        if(parent_tree){
                item = proto_tree_add_item(parent_tree, proto_x420, tvb, 0, -1, FALSE);
 
        if(parent_tree){
                item = proto_tree_add_item(parent_tree, proto_x420, tvb, 0, -1, FALSE);
index 68c9880aec9022aa27ee44e1cca81d581243c410..bf603bb4f8fc23864391373d7513522269d266a3 100644 (file)
@@ -26,6 +26,6 @@
 #ifndef PACKET_X420_H
 #define PACKET_X420_H
 
 #ifndef PACKET_X420_H
 #define PACKET_X420_H
 
-/*#include "packet-x420-exp.h"*/
+#include "packet-x420-exp.h"
 
 #endif  /* PACKET_X420_H */
 
 #endif  /* PACKET_X420_H */
index eff37f91442896c7138d03105ba6121578209cf3..7b73ce78e2f91624ff53e468b1dbae2b5eac7b8e 100644 (file)
@@ -493,6 +493,7 @@ DISSECTOR_SRC =     \
        packet-rmt-fec.c        \
        packet-rmt-lct.c        \
        packet-rmt-norm.c       \
        packet-rmt-fec.c        \
        packet-rmt-lct.c        \
        packet-rmt-norm.c       \
+       packet-ros.c    \
        packet-rpc.c    \
        packet-rpl.c    \
        packet-rquota.c \
        packet-rpc.c    \
        packet-rpl.c    \
        packet-rquota.c \
@@ -503,10 +504,12 @@ DISSECTOR_SRC =   \
        packet-rtcp.c   \
        packet-rtp-events.c     \
        packet-rtp.c    \
        packet-rtcp.c   \
        packet-rtp-events.c     \
        packet-rtp.c    \
-       packet-rtps.c \
+       packet-rtps.c   \
+       packet-rtse.c   \
        packet-rtsp.c   \
        packet-rwall.c  \
        packet-rtsp.c   \
        packet-rwall.c  \
-       packet-rx.c     \
+       packet-rx.c             \
+       packet-s4406.c  \
        packet-sadmind.c        \
        packet-sap.c    \
        packet-sccp.c   \
        packet-sadmind.c        \
        packet-sap.c    \
        packet-sccp.c   \
@@ -601,6 +604,8 @@ DISSECTOR_SRC =     \
        packet-x11.c    \
        packet-x25.c    \
        packet-x29.c    \
        packet-x11.c    \
        packet-x25.c    \
        packet-x29.c    \
+       packet-x411.c   \
+       packet-x420.c   \
        packet-x509af.c \
        packet-x509ce.c \
        packet-x509if.c \
        packet-x509af.c \
        packet-x509ce.c \
        packet-x509if.c \
@@ -801,6 +806,7 @@ DISSECTOR_INCLUDES =        \
        packet-rmt-fec.h        \
        packet-rmt-lct.h        \
        packet-rmt-norm.h       \
        packet-rmt-fec.h        \
        packet-rmt-lct.h        \
        packet-rmt-norm.h       \
+       packet-ros.h    \
        packet-rpc.h    \
        packet-rquota.h \
        packet-rsvp.h   \
        packet-rpc.h    \
        packet-rquota.h \
        packet-rsvp.h   \
@@ -808,8 +814,10 @@ DISSECTOR_INCLUDES =       \
        packet-rtp.h    \
        packet-rtps.h   \
        packet-rtp-events.h     \
        packet-rtp.h    \
        packet-rtps.h   \
        packet-rtp-events.h     \
+       packet-rtse.h   \
        packet-rwall.h  \
        packet-rwall.h  \
-       packet-rx.h     \
+       packet-rx.h             \
+       packet-s4406.c  \
        packet-scsi.h   \
        packet-sctp.h   \
        packet-sdp.h    \
        packet-scsi.h   \
        packet-sctp.h   \
        packet-sdp.h    \
@@ -847,6 +855,8 @@ DISSECTOR_INCLUDES =        \
        packet-wtp.h    \
        packet-x11-keysym.h     \
        packet-x11-keysymdef.h  \
        packet-wtp.h    \
        packet-x11-keysym.h     \
        packet-x11-keysymdef.h  \
+       packet-x411.h   \
+       packet-x420.h   \
        packet-x509af.h \
        packet-x509ce.h \
        packet-x509if.h \
        packet-x509af.h \
        packet-x509ce.h \
        packet-x509if.h \
index 9c3223872042fb68c77f94ac616aff1641f43f77..996e44c0e71a9a20becd1ba28f43df227f2dc199 100644 (file)
@@ -46,6 +46,7 @@
 #include "packet-ber.h"
 #include "packet-ses.h"
 #include "packet-pres.h"
 #include "packet-ber.h"
 #include "packet-ses.h"
 #include "packet-pres.h"
+#include "packet-rtse.h"
 
 
 #define PNAME  "ISO 8823 OSI Presentation Protocol"
 
 
 #define PNAME  "ISO 8823 OSI Presentation Protocol"
@@ -78,24 +79,6 @@ static GHashTable *pres_ctx_oid_table = NULL;
 
 /*--- Included file: packet-pres-hf.c ---*/
 
 
 /*--- Included file: packet-pres-hf.c ---*/
 
-static int hf_pres_checkpointSize = -1;           /* INTEGER */
-static int hf_pres_windowSize = -1;               /* INTEGER */
-static int hf_pres_dialogueMode = -1;             /* T_dialogueMode */
-static int hf_pres_connectionDataRQ = -1;         /* ConnectionData */
-static int hf_pres_applicationProtocol = -1;      /* INTEGER */
-static int hf_pres_connectionDataAC = -1;         /* ConnectionData */
-static int hf_pres_refuseReason = -1;             /* RefuseReason */
-static int hf_pres_userDataRJ = -1;               /* OPEN */
-static int hf_pres_abortReason = -1;              /* AbortReason */
-static int hf_pres_reflectedParameter = -1;       /* BIT_STRING */
-static int hf_pres_userdataAB = -1;               /* OPEN */
-static int hf_pres_open = -1;                     /* OPEN */
-static int hf_pres_recover = -1;                  /* SessionConnectionIdentifier */
-static int hf_pres_callingSSuserReference = -1;   /* CallingSSuserReference */
-static int hf_pres_commonReference = -1;          /* CommonReference */
-static int hf_pres_additionalReferenceInformation = -1;  /* AdditionalReferenceInformation */
-static int hf_pres_t61String = -1;                /* T61String */
-static int hf_pres_octetString = -1;              /* OCTET_STRING */
 static int hf_pres_mode_selector = -1;            /* Mode_selector */
 static int hf_pres_x410_mode_parameters = -1;     /* RTORQapdu */
 static int hf_pres_normal_mode_parameters = -1;   /* T_normal_mode_parameters */
 static int hf_pres_mode_selector = -1;            /* Mode_selector */
 static int hf_pres_x410_mode_parameters = -1;     /* RTORQapdu */
 static int hf_pres_normal_mode_parameters = -1;   /* T_normal_mode_parameters */
@@ -183,13 +166,6 @@ static gint ett_pres           = -1;
 
 /*--- Included file: packet-pres-ett.c ---*/
 
 
 /*--- Included file: packet-pres-ett.c ---*/
 
-static gint ett_pres_RTORQapdu = -1;
-static gint ett_pres_RTOACapdu = -1;
-static gint ett_pres_RTORJapdu = -1;
-static gint ett_pres_RTABapdu = -1;
-static gint ett_pres_ConnectionData = -1;
-static gint ett_pres_SessionConnectionIdentifier = -1;
-static gint ett_pres_CallingSSuserReference = -1;
 static gint ett_pres_CP_type = -1;
 static gint ett_pres_T_normal_mode_parameters = -1;
 static gint ett_pres_T_extensions = -1;
 static gint ett_pres_CP_type = -1;
 static gint ett_pres_T_normal_mode_parameters = -1;
 static gint ett_pres_T_extensions = -1;
@@ -291,332 +267,17 @@ find_oid_by_pres_ctx_id(packet_info *pinfo _U_, guint32 idx)
 
 /*--- Fields for imported types ---*/
 
 
 /*--- Fields for imported types ---*/
 
-
-
-
-static int
-dissect_pres_INTEGER(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                  NULL);
-
-  return offset;
-}
-static int dissect_checkpointSize_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_pres_checkpointSize);
-}
-static int dissect_windowSize_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_pres_windowSize);
-}
-static int dissect_applicationProtocol_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_pres_applicationProtocol);
-}
-
-
-static const value_string pres_T_dialogueMode_vals[] = {
-  {   0, "monologue" },
-  {   1, "twa" },
-  { 0, NULL }
-};
-
-
-static int
-dissect_pres_T_dialogueMode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                  NULL);
-
-  return offset;
-}
-static int dissect_dialogueMode_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_T_dialogueMode(TRUE, tvb, offset, pinfo, tree, hf_pres_dialogueMode);
-}
-
-
-
-static int
-dissect_pres_OPEN(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-/* FIX ME*/
-
-
-  return offset;
-}
-static int dissect_userDataRJ(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_OPEN(FALSE, tvb, offset, pinfo, tree, hf_pres_userDataRJ);
-}
-static int dissect_userdataAB(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_OPEN(FALSE, tvb, offset, pinfo, tree, hf_pres_userdataAB);
-}
-static int dissect_open(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_OPEN(FALSE, tvb, offset, pinfo, tree, hf_pres_open);
-}
-
-
-
-static int
-dissect_pres_T61String(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_TeletexString,
-                                            pinfo, tree, tvb, offset, hf_index,
-                                            NULL);
-
-  return offset;
-}
-static int dissect_t61String(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_T61String(FALSE, tvb, offset, pinfo, tree, hf_pres_t61String);
-}
-
-
-
-static int
-dissect_pres_OCTET_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                       NULL);
-
-  return offset;
-}
-static int dissect_octetString(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_OCTET_STRING(FALSE, tvb, offset, pinfo, tree, hf_pres_octetString);
-}
-static int dissect_octet_aligned_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_OCTET_STRING(TRUE, tvb, offset, pinfo, tree, hf_pres_octet_aligned);
-}
-
-
-static const value_string pres_CallingSSuserReference_vals[] = {
-  {   0, "t61String" },
-  {   1, "octetString" },
-  { 0, NULL }
-};
-
-static const ber_choice_t CallingSSuserReference_choice[] = {
-  {   0, BER_CLASS_UNI, BER_UNI_TAG_TeletexString, BER_FLAGS_NOOWNTAG, dissect_t61String },
-  {   1, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_octetString },
-  { 0, 0, 0, 0, NULL }
-};
-
-static int
-dissect_pres_CallingSSuserReference(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
-                                 CallingSSuserReference_choice, hf_index, ett_pres_CallingSSuserReference,
-                                 NULL);
-
-  return offset;
-}
-static int dissect_callingSSuserReference(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_CallingSSuserReference(FALSE, tvb, offset, pinfo, tree, hf_pres_callingSSuserReference);
-}
-
-
-
-static int
-dissect_pres_CommonReference(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_UTCTime,
-                                            pinfo, tree, tvb, offset, hf_index,
-                                            NULL);
-
-  return offset;
-}
-static int dissect_commonReference(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_CommonReference(FALSE, tvb, offset, pinfo, tree, hf_pres_commonReference);
-}
-
-
-
-static int
-dissect_pres_AdditionalReferenceInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_TeletexString,
-                                            pinfo, tree, tvb, offset, hf_index,
-                                            NULL);
-
-  return offset;
-}
-static int dissect_additionalReferenceInformation_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_AdditionalReferenceInformation(TRUE, tvb, offset, pinfo, tree, hf_pres_additionalReferenceInformation);
-}
-
-
-static const ber_sequence_t SessionConnectionIdentifier_sequence[] = {
-  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_callingSSuserReference },
-  { BER_CLASS_UNI, BER_UNI_TAG_UTCTime, BER_FLAGS_NOOWNTAG, dissect_commonReference },
-  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_additionalReferenceInformation_impl },
-  { 0, 0, 0, NULL }
-};
-
-static int
-dissect_pres_SessionConnectionIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   SessionConnectionIdentifier_sequence, hf_index, ett_pres_SessionConnectionIdentifier);
-
-  return offset;
-}
-static int dissect_recover_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_SessionConnectionIdentifier(TRUE, tvb, offset, pinfo, tree, hf_pres_recover);
-}
-
-
-static const value_string pres_ConnectionData_vals[] = {
-  {   0, "open" },
-  {   1, "recover" },
-  { 0, NULL }
-};
-
-static const ber_choice_t ConnectionData_choice[] = {
-  {   0, BER_CLASS_CON, 0, 0, dissect_open },
-  {   1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_recover_impl },
-  { 0, 0, 0, 0, NULL }
-};
-
-static int
-dissect_pres_ConnectionData(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
-                                 ConnectionData_choice, hf_index, ett_pres_ConnectionData,
-                                 NULL);
-
-  return offset;
-}
-static int dissect_connectionDataRQ(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_ConnectionData(FALSE, tvb, offset, pinfo, tree, hf_pres_connectionDataRQ);
-}
-static int dissect_connectionDataAC(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_ConnectionData(FALSE, tvb, offset, pinfo, tree, hf_pres_connectionDataAC);
-}
-
-
-static const ber_sequence_t RTORQapdu_set[] = {
-  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_checkpointSize_impl },
-  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_windowSize_impl },
-  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_dialogueMode_impl },
-  { BER_CLASS_CON, 3, BER_FLAGS_NOTCHKTAG, dissect_connectionDataRQ },
-  { BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_applicationProtocol_impl },
-  { 0, 0, 0, NULL }
-};
-
-static int
-dissect_pres_RTORQapdu(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
-                              RTORQapdu_set, hf_index, ett_pres_RTORQapdu);
-
-  return offset;
-}
 static int dissect_x410_mode_parameters_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
 static int dissect_x410_mode_parameters_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_RTORQapdu(TRUE, tvb, offset, pinfo, tree, hf_pres_x410_mode_parameters);
-}
-
-
-static const ber_sequence_t RTOACapdu_set[] = {
-  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_checkpointSize_impl },
-  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_windowSize_impl },
-  { BER_CLASS_CON, 2, BER_FLAGS_NOTCHKTAG, dissect_connectionDataAC },
-  { 0, 0, 0, NULL }
-};
-
-static int
-dissect_pres_RTOACapdu(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
-                              RTOACapdu_set, hf_index, ett_pres_RTOACapdu);
-
-  return offset;
+  return dissect_rtse_RTORQapdu(TRUE, tvb, offset, pinfo, tree, hf_pres_x410_mode_parameters);
 }
 static int dissect_cPR_PPDU_x400_mode_parameters_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
 }
 static int dissect_cPR_PPDU_x400_mode_parameters_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_RTOACapdu(TRUE, tvb, offset, pinfo, tree, hf_pres_cPR_PPDU_x400_mode_parameters);
-}
-
-
-static const value_string pres_RefuseReason_vals[] = {
-  {   0, "rtsBusy" },
-  {   1, "cannotRecover" },
-  {   2, "validationFailure" },
-  {   3, "unacceptableDialogueMode" },
-  { 0, NULL }
-};
-
-
-static int
-dissect_pres_RefuseReason(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                  NULL);
-
-  return offset;
-}
-static int dissect_refuseReason_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_RefuseReason(TRUE, tvb, offset, pinfo, tree, hf_pres_refuseReason);
-}
-
-
-static const ber_sequence_t RTORJapdu_set[] = {
-  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_refuseReason_impl },
-  { BER_CLASS_CON, 1, 0, dissect_userDataRJ },
-  { 0, 0, 0, NULL }
-};
-
-static int
-dissect_pres_RTORJapdu(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
-                              RTORJapdu_set, hf_index, ett_pres_RTORJapdu);
-
-  return offset;
+  return dissect_rtse_RTOACapdu(TRUE, tvb, offset, pinfo, tree, hf_pres_cPR_PPDU_x400_mode_parameters);
 }
 static int dissect_cPU_PPDU_x400_mode_parameters(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
 }
 static int dissect_cPU_PPDU_x400_mode_parameters(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_RTORJapdu(FALSE, tvb, offset, pinfo, tree, hf_pres_cPU_PPDU_x400_mode_parameters);
-}
-
-
-static const value_string pres_AbortReason_vals[] = {
-  {   0, "localSystemProblem" },
-  {   1, "invalidParameter" },
-  {   2, "unrecognizedActivity" },
-  {   3, "temporaryProblem" },
-  {   4, "protocolError" },
-  {   5, "permanentProblem" },
-  {   6, "userError" },
-  {   7, "transferCompleted" },
-  { 0, NULL }
-};
-
-
-static int
-dissect_pres_AbortReason(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                  NULL);
-
-  return offset;
-}
-static int dissect_abortReason_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_AbortReason(TRUE, tvb, offset, pinfo, tree, hf_pres_abortReason);
-}
-
-
-
-static int
-dissect_pres_BIT_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
-                                    NULL, hf_index, -1,
-                                    NULL);
-
-  return offset;
-}
-static int dissect_reflectedParameter_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_BIT_STRING(TRUE, tvb, offset, pinfo, tree, hf_pres_reflectedParameter);
-}
-static int dissect_arbitrary_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_BIT_STRING(TRUE, tvb, offset, pinfo, tree, hf_pres_arbitrary);
-}
-
-
-static const ber_sequence_t RTABapdu_set[] = {
-  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_abortReason_impl },
-  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_reflectedParameter_impl },
-  { BER_CLASS_CON, 2, 0, dissect_userdataAB },
-  { 0, 0, 0, NULL }
-};
-
-static int
-dissect_pres_RTABapdu(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
-                              RTABapdu_set, hf_index, ett_pres_RTABapdu);
-
-  return offset;
+  return dissect_rtse_RTORJapdu(FALSE, tvb, offset, pinfo, tree, hf_pres_cPU_PPDU_x400_mode_parameters);
 }
 static int dissect_aRU_PPDU_x400_mode_parameters(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
 }
 static int dissect_aRU_PPDU_x400_mode_parameters(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_pres_RTABapdu(FALSE, tvb, offset, pinfo, tree, hf_pres_aRU_PPDU_x400_mode_parameters);
+  return dissect_rtse_RTABapdu(FALSE, tvb, offset, pinfo, tree, hf_pres_aRU_PPDU_x400_mode_parameters);
 }
 
 
 }
 
 
@@ -969,6 +630,33 @@ static int dissect_single_ASN1_type_impl(packet_info *pinfo, proto_tree *tree, t
 }
 
 
 }
 
 
+
+static int
+dissect_pres_OCTET_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                       NULL);
+
+  return offset;
+}
+static int dissect_octet_aligned_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_pres_OCTET_STRING(TRUE, tvb, offset, pinfo, tree, hf_pres_octet_aligned);
+}
+
+
+
+static int
+dissect_pres_BIT_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    NULL, hf_index, -1,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_arbitrary_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_pres_BIT_STRING(TRUE, tvb, offset, pinfo, tree, hf_pres_arbitrary);
+}
+
+
 static const value_string pres_T_presentation_data_values_vals[] = {
   {   0, "single-ASN1-type" },
   {   1, "octet-aligned" },
 static const value_string pres_T_presentation_data_values_vals[] = {
   {   0, "single-ASN1-type" },
   {   1, "octet-aligned" },
@@ -1794,78 +1482,6 @@ void proto_register_pres(void) {
 
 /*--- Included file: packet-pres-hfarr.c ---*/
 
 
 /*--- Included file: packet-pres-hfarr.c ---*/
 
-    { &hf_pres_checkpointSize,
-      { "checkpointSize", "pres.checkpointSize",
-        FT_INT32, BASE_DEC, NULL, 0,
-        "", HFILL }},
-    { &hf_pres_windowSize,
-      { "windowSize", "pres.windowSize",
-        FT_INT32, BASE_DEC, NULL, 0,
-        "", HFILL }},
-    { &hf_pres_dialogueMode,
-      { "dialogueMode", "pres.dialogueMode",
-        FT_INT32, BASE_DEC, VALS(pres_T_dialogueMode_vals), 0,
-        "RTORQapdu/dialogueMode", HFILL }},
-    { &hf_pres_connectionDataRQ,
-      { "connectionDataRQ", "pres.connectionDataRQ",
-        FT_UINT32, BASE_DEC, VALS(pres_ConnectionData_vals), 0,
-        "RTORQapdu/connectionDataRQ", HFILL }},
-    { &hf_pres_applicationProtocol,
-      { "applicationProtocol", "pres.applicationProtocol",
-        FT_INT32, BASE_DEC, NULL, 0,
-        "RTORQapdu/applicationProtocol", HFILL }},
-    { &hf_pres_connectionDataAC,
-      { "connectionDataAC", "pres.connectionDataAC",
-        FT_UINT32, BASE_DEC, VALS(pres_ConnectionData_vals), 0,
-        "RTOACapdu/connectionDataAC", HFILL }},
-    { &hf_pres_refuseReason,
-      { "refuseReason", "pres.refuseReason",
-        FT_INT32, BASE_DEC, VALS(pres_RefuseReason_vals), 0,
-        "RTORJapdu/refuseReason", HFILL }},
-    { &hf_pres_userDataRJ,
-      { "userDataRJ", "pres.userDataRJ",
-        FT_NONE, BASE_NONE, NULL, 0,
-        "RTORJapdu/userDataRJ", HFILL }},
-    { &hf_pres_abortReason,
-      { "abortReason", "pres.abortReason",
-        FT_INT32, BASE_DEC, VALS(pres_AbortReason_vals), 0,
-        "RTABapdu/abortReason", HFILL }},
-    { &hf_pres_reflectedParameter,
-      { "reflectedParameter", "pres.reflectedParameter",
-        FT_BYTES, BASE_HEX, NULL, 0,
-        "RTABapdu/reflectedParameter", HFILL }},
-    { &hf_pres_userdataAB,
-      { "userdataAB", "pres.userdataAB",
-        FT_NONE, BASE_NONE, NULL, 0,
-        "RTABapdu/userdataAB", HFILL }},
-    { &hf_pres_open,
-      { "open", "pres.open",
-        FT_NONE, BASE_NONE, NULL, 0,
-        "ConnectionData/open", HFILL }},
-    { &hf_pres_recover,
-      { "recover", "pres.recover",
-        FT_NONE, BASE_NONE, NULL, 0,
-        "ConnectionData/recover", HFILL }},
-    { &hf_pres_callingSSuserReference,
-      { "callingSSuserReference", "pres.callingSSuserReference",
-        FT_UINT32, BASE_DEC, VALS(pres_CallingSSuserReference_vals), 0,
-        "SessionConnectionIdentifier/callingSSuserReference", HFILL }},
-    { &hf_pres_commonReference,
-      { "commonReference", "pres.commonReference",
-        FT_STRING, BASE_NONE, NULL, 0,
-        "SessionConnectionIdentifier/commonReference", HFILL }},
-    { &hf_pres_additionalReferenceInformation,
-      { "additionalReferenceInformation", "pres.additionalReferenceInformation",
-        FT_STRING, BASE_NONE, NULL, 0,
-        "SessionConnectionIdentifier/additionalReferenceInformation", HFILL }},
-    { &hf_pres_t61String,
-      { "t61String", "pres.t61String",
-        FT_STRING, BASE_NONE, NULL, 0,
-        "CallingSSuserReference/t61String", HFILL }},
-    { &hf_pres_octetString,
-      { "octetString", "pres.octetString",
-        FT_BYTES, BASE_HEX, NULL, 0,
-        "CallingSSuserReference/octetString", HFILL }},
     { &hf_pres_mode_selector,
       { "mode-selector", "pres.mode_selector",
         FT_NONE, BASE_NONE, NULL, 0,
     { &hf_pres_mode_selector,
       { "mode-selector", "pres.mode_selector",
         FT_NONE, BASE_NONE, NULL, 0,
@@ -2181,13 +1797,6 @@ void proto_register_pres(void) {
 
 /*--- Included file: packet-pres-ettarr.c ---*/
 
 
 /*--- Included file: packet-pres-ettarr.c ---*/
 
-    &ett_pres_RTORQapdu,
-    &ett_pres_RTOACapdu,
-    &ett_pres_RTORJapdu,
-    &ett_pres_RTABapdu,
-    &ett_pres_ConnectionData,
-    &ett_pres_SessionConnectionIdentifier,
-    &ett_pres_CallingSSuserReference,
     &ett_pres_CP_type,
     &ett_pres_T_normal_mode_parameters,
     &ett_pres_T_extensions,
     &ett_pres_CP_type,
     &ett_pres_T_normal_mode_parameters,
     &ett_pres_T_extensions,
diff --git a/epan/dissectors/packet-ros.c b/epan/dissectors/packet-ros.c
new file mode 100644 (file)
index 0000000..c2ac071
--- /dev/null
@@ -0,0 +1,948 @@
+/* Do not modify this file.                                                   */
+/* It is created automatically by the ASN.1 to Ethereal dissector compiler    */
+/* .\packet-ros.c                                                             */
+/* ../../tools/asn2eth.py -X -b -e -p ros -c ros.cnf -s packet-ros-template ros.asn */
+
+/* Input file: packet-ros-template.c */
+
+/* packet-ros_asn1.c
+ * Routines for ROS packet dissection
+ * Graeme Lunt 2005
+ *
+ * $Id$
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib.h>
+#include <epan/packet.h>
+#include <epan/conversation.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "packet-ber.h"
+#include "packet-pres.h"
+#include "packet-ros.h"
+
+#define PNAME  "X.880 OSI Remote Operations Service"
+#define PSNAME "ROS"
+#define PFNAME "ros"
+
+/* Initialize the protocol and registered fields */
+int proto_ros = -1;
+
+static struct SESSION_DATA_STRUCTURE* session = NULL;
+
+static proto_tree *top_tree=NULL;
+static guint32 opcode;
+
+
+/*--- Included file: packet-ros-hf.c ---*/
+
+static int hf_ros_invoke = -1;                    /* Invoke */
+static int hf_ros_returnResult = -1;              /* ReturnResult */
+static int hf_ros_returnError = -1;               /* ReturnError */
+static int hf_ros_reject = -1;                    /* Reject */
+static int hf_ros_bind_invoke = -1;               /* T_bind_invoke */
+static int hf_ros_bind_result = -1;               /* T_bind_result */
+static int hf_ros_bind_error = -1;                /* T_bind_error */
+static int hf_ros_unbind_invoke = -1;             /* T_unbind_invoke */
+static int hf_ros_unbind_result = -1;             /* T_unbind_result */
+static int hf_ros_unbind_error = -1;              /* T_unbind_error */
+static int hf_ros_invokeId = -1;                  /* InvokeId */
+static int hf_ros_linkedId = -1;                  /* INTEGER */
+static int hf_ros_opcode = -1;                    /* INTEGER */
+static int hf_ros_argument = -1;                  /* T_argument */
+static int hf_ros_result = -1;                    /* T_result */
+static int hf_ros_result1 = -1;                   /* T_result1 */
+static int hf_ros_errcode = -1;                   /* INTEGER */
+static int hf_ros_parameter = -1;                 /* T_parameter */
+static int hf_ros_problem = -1;                   /* T_problem */
+static int hf_ros_general = -1;                   /* GeneralProblem */
+static int hf_ros_invoke1 = -1;                   /* InvokeProblem */
+static int hf_ros_returnResult1 = -1;             /* ReturnResultProblem */
+static int hf_ros_returnError1 = -1;              /* ReturnErrorProblem */
+static int hf_ros_present = -1;                   /* INTEGER */
+static int hf_ros_absent = -1;                    /* NULL */
+static int hf_ros_local = -1;                     /* INTEGER */
+static int hf_ros_global = -1;                    /* OBJECT_IDENTIFIER */
+
+/*--- End of included file: packet-ros-hf.c ---*/
+
+
+/* Initialize the subtree pointers */
+static gint ett_ros = -1;
+
+/*--- Included file: packet-ros-ett.c ---*/
+
+static gint ett_ros_ROS = -1;
+static gint ett_ros_Invoke = -1;
+static gint ett_ros_ReturnResult = -1;
+static gint ett_ros_T_result = -1;
+static gint ett_ros_ReturnError = -1;
+static gint ett_ros_Reject = -1;
+static gint ett_ros_T_problem = -1;
+static gint ett_ros_InvokeId = -1;
+static gint ett_ros_Code = -1;
+
+/*--- End of included file: packet-ros-ett.c ---*/
+
+
+static dissector_table_t ros_oid_dissector_table=NULL;
+static GHashTable *oid_table=NULL;
+static gint ett_ros_unknown = -1;
+
+void
+register_ros_oid_dissector_handle(const char *oid, dissector_handle_t dissector, int proto _U_, const char *name)
+{
+       dissector_add_string("ros.oid", oid, dissector);
+       g_hash_table_insert(oid_table, (gpointer)oid, (gpointer)name);
+}
+
+static int
+call_ros_oid_callback(const char *oid, tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree)
+{
+       tvbuff_t *next_tvb;
+
+       next_tvb = tvb_new_subset(tvb, offset, tvb_length_remaining(tvb, offset), tvb_reported_length_remaining(tvb, offset));
+       if(!dissector_try_string(ros_oid_dissector_table, oid, next_tvb, pinfo, tree)){
+               proto_item *item=NULL;
+               proto_tree *next_tree=NULL;
+
+               item=proto_tree_add_text(tree, next_tvb, 0, tvb_length_remaining(tvb, offset), "RTSE: Dissector for OID:%s not implemented. Contact Ethereal developers if you want this supported", oid);
+               if(item){
+                       next_tree=proto_item_add_subtree(item, ett_ros_unknown);
+               }
+               dissect_unknown_ber(pinfo, next_tvb, offset, next_tree);
+       }
+
+       /*XXX until we change the #.REGISTER signature for _PDU()s 
+        * into new_dissector_t   we have to do this kludge with
+        * manually step past the content in the ANY type.
+        */
+       offset+=tvb_length_remaining(tvb, offset);
+
+       return offset;
+}
+
+
+/*--- Included file: packet-ros-fn.c ---*/
+
+/*--- Fields for imported types ---*/
+
+
+
+
+static int
+dissect_ros_INTEGER(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_linkedId_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_ros_linkedId);
+}
+static int dissect_opcode(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_INTEGER(FALSE, tvb, offset, pinfo, tree, hf_ros_opcode);
+}
+static int dissect_errcode(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_INTEGER(FALSE, tvb, offset, pinfo, tree, hf_ros_errcode);
+}
+static int dissect_present(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_INTEGER(FALSE, tvb, offset, pinfo, tree, hf_ros_present);
+}
+static int dissect_local(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_INTEGER(FALSE, tvb, offset, pinfo, tree, hf_ros_local);
+}
+
+
+
+static int
+dissect_ros_NULL(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_null(implicit_tag, pinfo, tree, tvb, offset, hf_index);
+
+  return offset;
+}
+static int dissect_absent(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_NULL(FALSE, tvb, offset, pinfo, tree, hf_ros_absent);
+}
+
+
+const value_string ros_InvokeId_vals[] = {
+  {   0, "present" },
+  {   1, "absent" },
+  { 0, NULL }
+};
+
+static const ber_choice_t InvokeId_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_present },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_absent },
+  { 0, 0, 0, 0, NULL }
+};
+
+int
+dissect_ros_InvokeId(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 InvokeId_choice, hf_index, ett_ros_InvokeId,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_invokeId(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_InvokeId(FALSE, tvb, offset, pinfo, tree, hf_ros_invokeId);
+}
+
+
+
+static int
+dissect_ros_T_argument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  char *oid;
+  /* not sure what the length should be - -1 for now */
+  proto_tree_add_text(tree, tvb, offset,-1, "invoke argument");
+       
+  if(session && session->pres_ctx_id && (oid = find_oid_by_pres_ctx_id(pinfo, session->pres_ctx_id))) {
+       /* this should be ROS! */
+       session->ros_op = (ROS_OP_INVOKE | ROS_OP_ARGUMENT);
+       /* now add the opcode */
+       session->ros_op |= opcode;
+       offset = call_ros_oid_callback(oid, tvb, offset, pinfo, top_tree);
+  }
+
+
+  return offset;
+}
+static int dissect_argument(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_T_argument(FALSE, tvb, offset, pinfo, tree, hf_ros_argument);
+}
+
+
+static const ber_sequence_t Invoke_sequence[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_invokeId },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_linkedId_impl },
+  { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_opcode },
+  { BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_argument },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_ros_Invoke(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   Invoke_sequence, hf_index, ett_ros_Invoke);
+
+  return offset;
+}
+static int dissect_invoke_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_Invoke(TRUE, tvb, offset, pinfo, tree, hf_ros_invoke);
+}
+
+
+
+static int
+dissect_ros_T_result1(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  char *oid;
+  /* not sure what the length should be - -1 for now */
+  proto_tree_add_text(tree, tvb, offset,-1, "return result");
+       
+  if(session && session->pres_ctx_id && (oid = find_oid_by_pres_ctx_id(pinfo, session->pres_ctx_id))) {
+       /* this should be ROS! */
+       session->ros_op = (ROS_OP_INVOKE | ROS_OP_RESULT);
+       /* now add the opcode */
+       session->ros_op |= opcode;
+       offset = call_ros_oid_callback(oid, tvb, offset, pinfo, top_tree);
+  }
+
+
+  return offset;
+}
+static int dissect_result1(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_T_result1(FALSE, tvb, offset, pinfo, tree, hf_ros_result1);
+}
+
+
+static const ber_sequence_t T_result_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_opcode },
+  { BER_CLASS_ANY, 0, BER_FLAGS_NOOWNTAG, dissect_result1 },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_ros_T_result(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   T_result_sequence, hf_index, ett_ros_T_result);
+
+  return offset;
+}
+static int dissect_result(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_T_result(FALSE, tvb, offset, pinfo, tree, hf_ros_result);
+}
+
+
+static const ber_sequence_t ReturnResult_sequence[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_invokeId },
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_result },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_ros_ReturnResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ReturnResult_sequence, hf_index, ett_ros_ReturnResult);
+
+  return offset;
+}
+static int dissect_returnResult_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_ReturnResult(TRUE, tvb, offset, pinfo, tree, hf_ros_returnResult);
+}
+
+
+
+static int
+dissect_ros_T_parameter(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  char *oid;
+  /* not sure what the length should be - -1 for now */
+  proto_tree_add_text(tree, tvb, offset,-1, "return result");
+       
+  if(session && session->pres_ctx_id && (oid = find_oid_by_pres_ctx_id(pinfo, session->pres_ctx_id))) {
+       /* this should be ROS! */
+       session->ros_op = (ROS_OP_INVOKE | ROS_OP_ERROR);
+       /* now add the opcode  (really the errode) */
+       session->ros_op |= opcode;
+       offset = call_ros_oid_callback(oid, tvb, offset, pinfo, top_tree);
+  }
+
+
+
+  return offset;
+}
+static int dissect_parameter(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_T_parameter(FALSE, tvb, offset, pinfo, tree, hf_ros_parameter);
+}
+
+
+static const ber_sequence_t ReturnError_sequence[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_invokeId },
+  { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_errcode },
+  { BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_parameter },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_ros_ReturnError(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ReturnError_sequence, hf_index, ett_ros_ReturnError);
+
+  return offset;
+}
+static int dissect_returnError_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_ReturnError(TRUE, tvb, offset, pinfo, tree, hf_ros_returnError);
+}
+
+
+static const value_string ros_GeneralProblem_vals[] = {
+  {   0, "unrecognizedPDU" },
+  {   1, "mistypedPDU" },
+  {   2, "badlyStructuredPDU" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_ros_GeneralProblem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_general_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_GeneralProblem(TRUE, tvb, offset, pinfo, tree, hf_ros_general);
+}
+
+
+static const value_string ros_InvokeProblem_vals[] = {
+  {   0, "duplicateInvocation" },
+  {   1, "unrecognizedOperation" },
+  {   2, "mistypedArgument" },
+  {   3, "resourceLimitation" },
+  {   4, "releaseInProgress" },
+  {   5, "unrecognizedLinkedId" },
+  {   6, "linkedResponseUnexpected" },
+  {   7, "unexpectedLinkedOperation" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_ros_InvokeProblem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_invoke1_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_InvokeProblem(TRUE, tvb, offset, pinfo, tree, hf_ros_invoke1);
+}
+
+
+static const value_string ros_ReturnResultProblem_vals[] = {
+  {   0, "unrecognizedInvocation" },
+  {   1, "resultResponseUnexpected" },
+  {   2, "mistypedResult" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_ros_ReturnResultProblem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_returnResult1_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_ReturnResultProblem(TRUE, tvb, offset, pinfo, tree, hf_ros_returnResult1);
+}
+
+
+static const value_string ros_ReturnErrorProblem_vals[] = {
+  {   0, "unrecognizedInvocation" },
+  {   1, "errorResponseUnexpected" },
+  {   2, "unrecognizedError" },
+  {   3, "unexpectedError" },
+  {   4, "mistypedParameter" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_ros_ReturnErrorProblem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_returnError1_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_ReturnErrorProblem(TRUE, tvb, offset, pinfo, tree, hf_ros_returnError1);
+}
+
+
+static const value_string ros_T_problem_vals[] = {
+  {   0, "general" },
+  {   1, "invoke" },
+  {   2, "returnResult" },
+  {   3, "returnError" },
+  { 0, NULL }
+};
+
+static const ber_choice_t T_problem_choice[] = {
+  {   0, BER_CLASS_CON, 0, 0, dissect_general_impl },
+  {   1, BER_CLASS_CON, 1, 0, dissect_invoke1_impl },
+  {   2, BER_CLASS_CON, 2, 0, dissect_returnResult1_impl },
+  {   3, BER_CLASS_CON, 3, 0, dissect_returnError1_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_ros_T_problem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 T_problem_choice, hf_index, ett_ros_T_problem,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_problem(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_T_problem(FALSE, tvb, offset, pinfo, tree, hf_ros_problem);
+}
+
+
+static const ber_sequence_t Reject_sequence[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_invokeId },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_problem },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_ros_Reject(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   Reject_sequence, hf_index, ett_ros_Reject);
+
+  return offset;
+}
+static int dissect_reject_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_Reject(TRUE, tvb, offset, pinfo, tree, hf_ros_reject);
+}
+
+
+
+static int
+dissect_ros_T_bind_invoke(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  char *oid;
+  /* not sure what the length should be - -1 for now */
+  proto_tree_add_text(tree, tvb, offset,-1, "bind-invoke");
+
+  if(session && session->pres_ctx_id && (oid = find_oid_by_pres_ctx_id(pinfo, session->pres_ctx_id))) {
+    /* this should be ROS! */
+    session->ros_op = (ROS_OP_BIND | ROS_OP_ARGUMENT);
+    offset = call_ros_oid_callback(oid, tvb, offset, pinfo, top_tree);
+  }
+
+
+  return offset;
+}
+static int dissect_bind_invoke_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_T_bind_invoke(TRUE, tvb, offset, pinfo, tree, hf_ros_bind_invoke);
+}
+
+
+
+static int
+dissect_ros_T_bind_result(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  char *oid;
+  /* not sure what the length should be - -1 for now */
+  proto_tree_add_text(tree, tvb, offset,-1, "bind-result");
+
+  if(session && session->pres_ctx_id && (oid = find_oid_by_pres_ctx_id(pinfo, session->pres_ctx_id))) {
+    /* this should be ROS! */
+    session->ros_op = (ROS_OP_BIND | ROS_OP_RESULT);
+    offset = call_ros_oid_callback(oid, tvb, offset, pinfo, top_tree);
+  }
+
+
+  return offset;
+}
+static int dissect_bind_result_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_T_bind_result(TRUE, tvb, offset, pinfo, tree, hf_ros_bind_result);
+}
+
+
+
+static int
+dissect_ros_T_bind_error(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  char *oid;
+  /* not sure what the length should be - -1 for now */
+  proto_tree_add_text(tree, tvb, offset,-1, "bind-error");
+
+  if(session && session->pres_ctx_id && (oid = find_oid_by_pres_ctx_id(pinfo, session->pres_ctx_id))) {
+    /* this should be ROS! */
+    session->ros_op = (ROS_OP_BIND | ROS_OP_ERROR);
+    offset = call_ros_oid_callback(oid, tvb, offset, pinfo, top_tree);
+  }
+
+
+
+  return offset;
+}
+static int dissect_bind_error_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_T_bind_error(TRUE, tvb, offset, pinfo, tree, hf_ros_bind_error);
+}
+
+
+
+static int
+dissect_ros_T_unbind_invoke(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  char *oid;
+  /* not sure what the length should be - -1 for now */
+  proto_tree_add_text(tree, tvb, offset,-1, "unbind-invoke");
+
+  if(session && session->pres_ctx_id && (oid = find_oid_by_pres_ctx_id(pinfo, session->pres_ctx_id))) {
+    /* this should be ROS! */
+    session->ros_op = (ROS_OP_UNBIND | ROS_OP_ARGUMENT);
+    offset = call_ros_oid_callback(oid, tvb, offset, pinfo, top_tree);
+  }
+
+
+
+  return offset;
+}
+static int dissect_unbind_invoke_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_T_unbind_invoke(TRUE, tvb, offset, pinfo, tree, hf_ros_unbind_invoke);
+}
+
+
+
+static int
+dissect_ros_T_unbind_result(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  char *oid;
+  /* not sure what the length should be - -1 for now */
+  proto_tree_add_text(tree, tvb, offset,-1, "unbind-result");
+
+  if(session && session->pres_ctx_id && (oid = find_oid_by_pres_ctx_id(pinfo, session->pres_ctx_id))) {
+    /* this should be ROS! */
+    session->ros_op = (ROS_OP_UNBIND | ROS_OP_RESULT);
+    offset = call_ros_oid_callback(oid, tvb, offset, pinfo, top_tree);
+  }
+
+
+  return offset;
+}
+static int dissect_unbind_result_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_T_unbind_result(TRUE, tvb, offset, pinfo, tree, hf_ros_unbind_result);
+}
+
+
+
+static int
+dissect_ros_T_unbind_error(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  char *oid;
+  /* not sure what the length should be - -1 for now */
+  proto_tree_add_text(tree, tvb, offset,-1, "unbind-error");
+
+  if(session && session->pres_ctx_id && (oid = find_oid_by_pres_ctx_id(pinfo, session->pres_ctx_id))) {
+    /* this should be ROS! */
+    session->ros_op = (ROS_OP_UNBIND | ROS_OP_ERROR);
+    offset = call_ros_oid_callback(oid, tvb, offset, pinfo, top_tree);
+  }
+
+  return offset;
+}
+static int dissect_unbind_error_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_T_unbind_error(TRUE, tvb, offset, pinfo, tree, hf_ros_unbind_error);
+}
+
+
+static const value_string ros_ROS_vals[] = {
+  {   1, "invoke" },
+  {   2, "returnResult" },
+  {   3, "returnError" },
+  {   4, "reject" },
+  {  16, "bind-invoke" },
+  {  17, "bind-result" },
+  {  18, "bind-error" },
+  {  19, "unbind-invoke" },
+  {  20, "unbind-result" },
+  {  21, "unbind-error" },
+  { 0, NULL }
+};
+
+static const ber_choice_t ROS_choice[] = {
+  {   1, BER_CLASS_CON, 1, 0, dissect_invoke_impl },
+  {   2, BER_CLASS_CON, 2, 0, dissect_returnResult_impl },
+  {   3, BER_CLASS_CON, 3, 0, dissect_returnError_impl },
+  {   4, BER_CLASS_CON, 4, 0, dissect_reject_impl },
+  {  16, BER_CLASS_CON, 16, 0, dissect_bind_invoke_impl },
+  {  17, BER_CLASS_CON, 17, 0, dissect_bind_result_impl },
+  {  18, BER_CLASS_CON, 18, 0, dissect_bind_error_impl },
+  {  19, BER_CLASS_CON, 19, 0, dissect_unbind_invoke_impl },
+  {  20, BER_CLASS_CON, 20, 0, dissect_unbind_result_impl },
+  {  21, BER_CLASS_CON, 21, 0, dissect_unbind_error_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_ros_ROS(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 ROS_choice, hf_index, ett_ros_ROS,
+                                 NULL);
+
+  return offset;
+}
+
+
+static const value_string ros_RejectProblem_vals[] = {
+  {   0, "general-unrecognizedPDU" },
+  {   1, "general-mistypedPDU" },
+  {   2, "general-badlyStructuredPDU" },
+  {  10, "invoke-duplicateInvocation" },
+  {  11, "invoke-unrecognizedOperation" },
+  {  12, "invoke-mistypedArgument" },
+  {  13, "invoke-resourceLimitation" },
+  {  14, "invoke-releaseInProgress" },
+  {  15, "invoke-unrecognizedLinkedId" },
+  {  16, "invoke-linkedResponseUnexpected" },
+  {  17, "invoke-unexpectedLinkedOperation" },
+  {  20, "returnResult-unrecognizedInvocation" },
+  {  21, "returnResult-resultResponseUnexpected" },
+  {  22, "returnResult-mistypedResult" },
+  {  30, "returnError-unrecognizedInvocation" },
+  {  31, "returnError-errorResponseUnexpected" },
+  {  32, "returnError-unrecognizedError" },
+  {  33, "returnError-unexpectedError" },
+  {  34, "returnError-mistypedParameter" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_ros_RejectProblem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_ros_OBJECT_IDENTIFIER(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_global(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_ros_OBJECT_IDENTIFIER(FALSE, tvb, offset, pinfo, tree, hf_ros_global);
+}
+
+
+const value_string ros_Code_vals[] = {
+  {   0, "local" },
+  {   1, "global" },
+  { 0, NULL }
+};
+
+static const ber_choice_t Code_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_local },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_global },
+  { 0, 0, 0, 0, NULL }
+};
+
+int
+dissect_ros_Code(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 Code_choice, hf_index, ett_ros_Code,
+                                 NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_ros_Priority(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+/*--- End of included file: packet-ros-fn.c ---*/
+
+
+
+/*
+* Dissect ROS PDUs inside a PPDU.
+*/
+static void
+dissect_ros(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
+{
+       int offset = 0;
+       int old_offset;
+       proto_item *item=NULL;
+       proto_tree *tree=NULL;
+
+       /* save parent_tree so subdissectors can create new top nodes */
+       top_tree=parent_tree;
+
+       /* do we have application context from the acse dissector?  */
+       if( !pinfo->private_data ){
+               if(parent_tree){
+                       proto_tree_add_text(parent_tree, tvb, offset, -1,
+                               "Internal error:can't get application context from ACSE dissector.");
+               } 
+               return  ;
+       } else {
+               session  = ( (struct SESSION_DATA_STRUCTURE*)(pinfo->private_data) );
+
+       }
+
+       if(parent_tree){
+               item = proto_tree_add_item(parent_tree, proto_ros, tvb, 0, -1, FALSE);
+               tree = proto_item_add_subtree(item, ett_ros);
+       }
+       if (check_col(pinfo->cinfo, COL_PROTOCOL))
+               col_set_str(pinfo->cinfo, COL_PROTOCOL, "ROS");
+       if (check_col(pinfo->cinfo, COL_INFO))
+               col_clear(pinfo->cinfo, COL_INFO);
+
+       while (tvb_reported_length_remaining(tvb, offset) > 0){
+               old_offset=offset;
+               offset=dissect_ros_ROS(FALSE, tvb, offset, pinfo , tree, -1);
+               if(offset == old_offset){
+                       proto_tree_add_text(tree, tvb, offset, -1,"Internal error, zero-byte ROS PDU");
+                       offset = tvb_length(tvb);
+                       break;
+               }
+       }
+}
+
+
+/*--- proto_register_ros -------------------------------------------*/
+void proto_register_ros(void) {
+
+  /* List of fields */
+  static hf_register_info hf[] =
+  {
+
+/*--- Included file: packet-ros-hfarr.c ---*/
+
+    { &hf_ros_invoke,
+      { "invoke", "ros.invoke",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ROS/invoke", HFILL }},
+    { &hf_ros_returnResult,
+      { "returnResult", "ros.returnResult",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ROS/returnResult", HFILL }},
+    { &hf_ros_returnError,
+      { "returnError", "ros.returnError",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ROS/returnError", HFILL }},
+    { &hf_ros_reject,
+      { "reject", "ros.reject",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ROS/reject", HFILL }},
+    { &hf_ros_bind_invoke,
+      { "bind-invoke", "ros.bind_invoke",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ROS/bind-invoke", HFILL }},
+    { &hf_ros_bind_result,
+      { "bind-result", "ros.bind_result",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ROS/bind-result", HFILL }},
+    { &hf_ros_bind_error,
+      { "bind-error", "ros.bind_error",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ROS/bind-error", HFILL }},
+    { &hf_ros_unbind_invoke,
+      { "unbind-invoke", "ros.unbind_invoke",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ROS/unbind-invoke", HFILL }},
+    { &hf_ros_unbind_result,
+      { "unbind-result", "ros.unbind_result",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ROS/unbind-result", HFILL }},
+    { &hf_ros_unbind_error,
+      { "unbind-error", "ros.unbind_error",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ROS/unbind-error", HFILL }},
+    { &hf_ros_invokeId,
+      { "invokeId", "ros.invokeId",
+        FT_UINT32, BASE_DEC, VALS(ros_InvokeId_vals), 0,
+        "", HFILL }},
+    { &hf_ros_linkedId,
+      { "linkedId", "ros.linkedId",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "Invoke/linkedId", HFILL }},
+    { &hf_ros_opcode,
+      { "opcode", "ros.opcode",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "", HFILL }},
+    { &hf_ros_argument,
+      { "argument", "ros.argument",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "Invoke/argument", HFILL }},
+    { &hf_ros_result,
+      { "result", "ros.result",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ReturnResult/result", HFILL }},
+    { &hf_ros_result1,
+      { "result", "ros.result",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ReturnResult/result/result", HFILL }},
+    { &hf_ros_errcode,
+      { "errcode", "ros.errcode",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "ReturnError/errcode", HFILL }},
+    { &hf_ros_parameter,
+      { "parameter", "ros.parameter",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ReturnError/parameter", HFILL }},
+    { &hf_ros_problem,
+      { "problem", "ros.problem",
+        FT_UINT32, BASE_DEC, VALS(ros_T_problem_vals), 0,
+        "Reject/problem", HFILL }},
+    { &hf_ros_general,
+      { "general", "ros.general",
+        FT_INT32, BASE_DEC, VALS(ros_GeneralProblem_vals), 0,
+        "Reject/problem/general", HFILL }},
+    { &hf_ros_invoke1,
+      { "invoke", "ros.invoke",
+        FT_INT32, BASE_DEC, VALS(ros_InvokeProblem_vals), 0,
+        "Reject/problem/invoke", HFILL }},
+    { &hf_ros_returnResult1,
+      { "returnResult", "ros.returnResult",
+        FT_INT32, BASE_DEC, VALS(ros_ReturnResultProblem_vals), 0,
+        "Reject/problem/returnResult", HFILL }},
+    { &hf_ros_returnError1,
+      { "returnError", "ros.returnError",
+        FT_INT32, BASE_DEC, VALS(ros_ReturnErrorProblem_vals), 0,
+        "Reject/problem/returnError", HFILL }},
+    { &hf_ros_present,
+      { "present", "ros.present",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "InvokeId/present", HFILL }},
+    { &hf_ros_absent,
+      { "absent", "ros.absent",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "InvokeId/absent", HFILL }},
+    { &hf_ros_local,
+      { "local", "ros.local",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "Code/local", HFILL }},
+    { &hf_ros_global,
+      { "global", "ros.global",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "Code/global", HFILL }},
+
+/*--- End of included file: packet-ros-hfarr.c ---*/
+
+  };
+
+  /* List of subtrees */
+  static gint *ett[] = {
+    &ett_ros,
+    &ett_ros_unknown,
+
+/*--- Included file: packet-ros-ettarr.c ---*/
+
+    &ett_ros_ROS,
+    &ett_ros_Invoke,
+    &ett_ros_ReturnResult,
+    &ett_ros_T_result,
+    &ett_ros_ReturnError,
+    &ett_ros_Reject,
+    &ett_ros_T_problem,
+    &ett_ros_InvokeId,
+    &ett_ros_Code,
+
+/*--- End of included file: packet-ros-ettarr.c ---*/
+
+  };
+
+  /* Register protocol */
+  proto_ros = proto_register_protocol(PNAME, PSNAME, PFNAME);
+  register_dissector("ros", dissect_ros, proto_ros);
+  /* Register fields and subtrees */
+  proto_register_field_array(proto_ros, hf, array_length(hf));
+  proto_register_subtree_array(ett, array_length(ett));
+
+  ros_oid_dissector_table = register_dissector_table("ros.oid", "ROS OID Dissectors", FT_STRING, BASE_NONE);
+  oid_table=g_hash_table_new(g_str_hash, g_str_equal);
+}
+
+
+/*--- proto_reg_handoff_ros --- */
+void proto_reg_handoff_ros(void) {
+}
diff --git a/epan/dissectors/packet-ros.h b/epan/dissectors/packet-ros.h
new file mode 100644 (file)
index 0000000..e7e44ad
--- /dev/null
@@ -0,0 +1,68 @@
+/* Do not modify this file.                                                   */
+/* It is created automatically by the ASN.1 to Ethereal dissector compiler    */
+/* .\packet-ros.h                                                             */
+/* ../../tools/asn2eth.py -X -b -e -p ros -c ros.cnf -s packet-ros-template ros.asn */
+
+/* Input file: packet-ros-template.h */
+
+/* packet-ros.h
+ * Routines for ROS packet dissection
+ * Graeme Lunt 2005
+ *
+ * $Id$
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifndef PACKET_ROS_H
+#define PACKET_ROS_H
+
+
+/*--- Included file: packet-ros-exp.h ---*/
+
+extern const value_string ros_InvokeId_vals[];
+extern const value_string ros_Code_vals[];
+int dissect_ros_InvokeId(gboolean implicit_tag, tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, int hf_index);
+int dissect_ros_Code(gboolean implicit_tag, tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, int hf_index);
+
+/*--- End of included file: packet-ros-exp.h ---*/
+
+
+# include "packet-ses.h"
+
+/* for use in the SESSION_DATA_STRUCTURE ros_op argument
+   top byte indicates ROS invocation 
+   bottom three bytes indicate operation code */
+
+# define ROS_OP_MASK    0xff000000
+
+# define ROS_OP_ARGUMENT  0x10000000
+# define ROS_OP_RESULT  0x20000000
+# define ROS_OP_ERROR   0x30000000
+# define ROS_OP_REJECT  0x40000000
+
+# define ROS_OP_BIND    0x01000000
+# define ROS_OP_UNBIND  0x02000000
+# define ROS_OP_INVOKE  0x03000000
+
+# define ROS_OP_OPCODE_MASK (~ROS_OP_MASK)
+
+void register_ros_oid_dissector_handle(const char *oid, dissector_handle_t dissector, int proto _U_, const char *name);
+
+#endif  /* PACKET_ROS_H */
diff --git a/epan/dissectors/packet-rtse.c b/epan/dissectors/packet-rtse.c
new file mode 100644 (file)
index 0000000..23f9338
--- /dev/null
@@ -0,0 +1,989 @@
+/* Do not modify this file.                                                   */
+/* It is created automatically by the ASN.1 to Ethereal dissector compiler    */
+/* .\packet-rtse.c                                                            */
+/* ../../tools/asn2eth.py -X -b -e -p rtse -c rtse.cnf -s packet-rtse-template rtse.asn */
+
+/* Input file: packet-rtse-template.c */
+
+/* packet-rtse_asn1.c
+ * Routines for RTSE packet dissection
+ * Graeme Lunt 2005
+ *
+ * $Id$
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib.h>
+#include <epan/packet.h>
+#include <epan/conversation.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "packet-ber.h"
+#include "packet-pres.h"
+#include "packet-acse.h"
+#include "packet-ros.h"
+#include "packet-rtse.h"
+
+#define PNAME  "X.228 OSI Reliable Transfer Service"
+#define PSNAME "RTSE"
+#define PFNAME "rtse"
+
+/* Initialize the protocol and registered fields */
+int proto_rtse = -1;
+
+static struct SESSION_DATA_STRUCTURE* session = NULL;
+
+static char object_identifier_id[MAX_OID_STR_LEN];
+/* indirect_reference, used to pick up the signalling so we know what
+   kind of data is transferred in SES_DATA_TRANSFER_PDUs */
+static guint32 indir_ref=0;
+static guint32 app_proto=0;
+
+static proto_tree *top_tree=NULL;
+
+static int dissect_rtse_EXTERNAL(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_);
+
+
+
+/*--- Included file: packet-rtse-hf.c ---*/
+
+static int hf_rtse_rtorq_apdu = -1;               /* RTORQapdu */
+static int hf_rtse_rtoac_apdu = -1;               /* RTOACapdu */
+static int hf_rtse_rtorj_apdu = -1;               /* RTORJapdu */
+static int hf_rtse_rttp_apdu = -1;                /* RTTPapdu */
+static int hf_rtse_rttr_apdu = -1;                /* RTTRapdu */
+static int hf_rtse_rtab_apdu = -1;                /* RTABapdu */
+static int hf_rtse_checkpointSize = -1;           /* INTEGER */
+static int hf_rtse_windowSize = -1;               /* INTEGER */
+static int hf_rtse_dialogueMode = -1;             /* T_dialogueMode */
+static int hf_rtse_connectionDataRQ = -1;         /* ConnectionData */
+static int hf_rtse_applicationProtocol = -1;      /* T_applicationProtocol */
+static int hf_rtse_connectionDataAC = -1;         /* ConnectionData */
+static int hf_rtse_refuseReason = -1;             /* RefuseReason */
+static int hf_rtse_userDataRJ = -1;               /* T_userDataRJ */
+static int hf_rtse_abortReason = -1;              /* AbortReason */
+static int hf_rtse_reflectedParameter = -1;       /* BIT_STRING */
+static int hf_rtse_userdataAB = -1;               /* T_userdataAB */
+static int hf_rtse_open = -1;                     /* T_open */
+static int hf_rtse_recover = -1;                  /* SessionConnectionIdentifier */
+static int hf_rtse_callingSSuserReference = -1;   /* CallingSSuserReference */
+static int hf_rtse_commonReference = -1;          /* CommonReference */
+static int hf_rtse_additionalReferenceInformation = -1;  /* AdditionalReferenceInformation */
+static int hf_rtse_t61String = -1;                /* T61String */
+static int hf_rtse_octetString = -1;              /* OCTET_STRING */
+static int hf_rtse_direct_reference = -1;         /* OBJECT_IDENTIFIER */
+static int hf_rtse_indirect_reference = -1;       /* T_indirect_reference */
+static int hf_rtse_data_value_descriptor = -1;    /* ObjectDescriptor */
+static int hf_rtse_encoding = -1;                 /* T_encoding */
+static int hf_rtse_single_ASN1_type = -1;         /* T_single_ASN1_type */
+static int hf_rtse_octet_aligned = -1;            /* OCTET_STRING */
+static int hf_rtse_arbitrary = -1;                /* BIT_STRING */
+
+/*--- End of included file: packet-rtse-hf.c ---*/
+
+
+/* Initialize the subtree pointers */
+static gint ett_rtse = -1;
+
+/*--- Included file: packet-rtse-ett.c ---*/
+
+static gint ett_rtse_RTSE_apdus = -1;
+static gint ett_rtse_RTORQapdu = -1;
+static gint ett_rtse_RTOACapdu = -1;
+static gint ett_rtse_RTORJapdu = -1;
+static gint ett_rtse_RTABapdu = -1;
+static gint ett_rtse_ConnectionData = -1;
+static gint ett_rtse_SessionConnectionIdentifier = -1;
+static gint ett_rtse_CallingSSuserReference = -1;
+static gint ett_rtse_EXTERNAL = -1;
+static gint ett_rtse_T_encoding = -1;
+
+/*--- End of included file: packet-rtse-ett.c ---*/
+
+
+
+static dissector_table_t rtse_oid_dissector_table=NULL;
+static GHashTable *oid_table=NULL;
+static gint ett_rtse_unknown = -1;
+
+void
+register_rtse_oid_dissector_handle(const char *oid, dissector_handle_t dissector, int proto _U_, const char *name)
+{
+       dissector_add_string("rtse.oid", oid, dissector);
+       g_hash_table_insert(oid_table, (gpointer)oid, (gpointer)name);
+}
+
+static int
+call_rtse_oid_callback(const char *oid, tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree)
+{
+       tvbuff_t *next_tvb;
+
+       next_tvb = tvb_new_subset(tvb, offset, tvb_length_remaining(tvb, offset), tvb_reported_length_remaining(tvb, offset));
+       if(!dissector_try_string(rtse_oid_dissector_table, oid, next_tvb, pinfo, tree)){
+               proto_item *item=NULL;
+               proto_tree *next_tree=NULL;
+
+               item=proto_tree_add_text(tree, next_tvb, 0, tvb_length_remaining(tvb, offset), "RTSE: Dissector for OID:%s not implemented. Contact Ethereal developers if you want this supported", oid);
+               if(item){
+                       next_tree=proto_item_add_subtree(item, ett_rtse_unknown);
+               }
+               dissect_unknown_ber(pinfo, next_tvb, offset, next_tree);
+       }
+
+       /*XXX until we change the #.REGISTER signature for _PDU()s 
+        * into new_dissector_t   we have to do this kludge with
+        * manually step past the content in the ANY type.
+        */
+       offset+=tvb_length_remaining(tvb, offset);
+
+       return offset;
+}
+
+
+/*--- Included file: packet-rtse-fn.c ---*/
+
+/*--- Fields for imported types ---*/
+
+
+
+
+static int
+dissect_rtse_INTEGER(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_checkpointSize_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_rtse_checkpointSize);
+}
+static int dissect_windowSize_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_rtse_windowSize);
+}
+
+
+static const value_string rtse_T_dialogueMode_vals[] = {
+  {   0, "monologue" },
+  {   1, "twa" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_rtse_T_dialogueMode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_dialogueMode_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_T_dialogueMode(TRUE, tvb, offset, pinfo, tree, hf_rtse_dialogueMode);
+}
+
+
+
+static int
+dissect_rtse_T_open(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+
+       char *oid = NULL;
+
+       switch(app_proto)  {
+       case 1:         /* mts-transfer-protocol-1984 */
+               oid = "applicationProtocol.1";
+               break;
+       case 12:        /* mts-transfer-protocol */
+               oid = "applicationProtocol.12";
+               break;
+       default:
+               if(session && session->pres_ctx_id)
+                       oid = find_oid_by_pres_ctx_id(pinfo, session->pres_ctx_id);
+               break;
+       }
+       
+       if(!oid) /* XXX: problem here is we haven't decoded the applicationProtocol yet - so we make assumptions! */
+               oid = "applicationProtocol.12";
+
+       if(oid) {
+
+               offset = call_rtse_oid_callback(oid, tvb, offset, pinfo, top_tree ? top_tree : tree);
+       }
+
+       /* else XXX: need to flag we can't find the presentation context */
+
+
+  return offset;
+}
+static int dissect_open(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_T_open(FALSE, tvb, offset, pinfo, tree, hf_rtse_open);
+}
+
+
+
+static int
+dissect_rtse_T61String(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_TeletexString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_t61String(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_T61String(FALSE, tvb, offset, pinfo, tree, hf_rtse_t61String);
+}
+
+
+
+static int
+dissect_rtse_OCTET_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                       NULL);
+
+  return offset;
+}
+static int dissect_octetString(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_OCTET_STRING(FALSE, tvb, offset, pinfo, tree, hf_rtse_octetString);
+}
+static int dissect_octet_aligned_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_OCTET_STRING(TRUE, tvb, offset, pinfo, tree, hf_rtse_octet_aligned);
+}
+
+
+static const value_string rtse_CallingSSuserReference_vals[] = {
+  {   0, "t61String" },
+  {   1, "octetString" },
+  { 0, NULL }
+};
+
+static const ber_choice_t CallingSSuserReference_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_TeletexString, BER_FLAGS_NOOWNTAG, dissect_t61String },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_octetString },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_rtse_CallingSSuserReference(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 CallingSSuserReference_choice, hf_index, ett_rtse_CallingSSuserReference,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_callingSSuserReference(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_CallingSSuserReference(FALSE, tvb, offset, pinfo, tree, hf_rtse_callingSSuserReference);
+}
+
+
+
+static int
+dissect_rtse_CommonReference(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_UTCTime,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_commonReference(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_CommonReference(FALSE, tvb, offset, pinfo, tree, hf_rtse_commonReference);
+}
+
+
+
+static int
+dissect_rtse_AdditionalReferenceInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_TeletexString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_additionalReferenceInformation_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_AdditionalReferenceInformation(TRUE, tvb, offset, pinfo, tree, hf_rtse_additionalReferenceInformation);
+}
+
+
+static const ber_sequence_t SessionConnectionIdentifier_sequence[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_callingSSuserReference },
+  { BER_CLASS_UNI, BER_UNI_TAG_UTCTime, BER_FLAGS_NOOWNTAG, dissect_commonReference },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_additionalReferenceInformation_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_rtse_SessionConnectionIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   SessionConnectionIdentifier_sequence, hf_index, ett_rtse_SessionConnectionIdentifier);
+
+  return offset;
+}
+static int dissect_recover_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_SessionConnectionIdentifier(TRUE, tvb, offset, pinfo, tree, hf_rtse_recover);
+}
+
+
+static const value_string rtse_ConnectionData_vals[] = {
+  {   0, "open" },
+  {   1, "recover" },
+  { 0, NULL }
+};
+
+static const ber_choice_t ConnectionData_choice[] = {
+  {   0, BER_CLASS_CON, 0, 0, dissect_open },
+  {   1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_recover_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_rtse_ConnectionData(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 ConnectionData_choice, hf_index, ett_rtse_ConnectionData,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_connectionDataRQ(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_ConnectionData(FALSE, tvb, offset, pinfo, tree, hf_rtse_connectionDataRQ);
+}
+static int dissect_connectionDataAC(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_ConnectionData(FALSE, tvb, offset, pinfo, tree, hf_rtse_connectionDataAC);
+}
+
+
+static const value_string rtse_T_applicationProtocol_vals[] = {
+  {  12, "mts-transfer-protocol" },
+  {   1, "mts-transfer-protocol-1984" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_rtse_T_applicationProtocol(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+
+  offset = dissect_ber_integer(TRUE, pinfo, tree, tvb, offset, hf_index, &app_proto);
+
+
+  return offset;
+}
+static int dissect_applicationProtocol_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_T_applicationProtocol(TRUE, tvb, offset, pinfo, tree, hf_rtse_applicationProtocol);
+}
+
+
+static const ber_sequence_t RTORQapdu_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_checkpointSize_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_windowSize_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_dialogueMode_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_NOTCHKTAG, dissect_connectionDataRQ },
+  { BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_applicationProtocol_impl },
+  { 0, 0, 0, NULL }
+};
+
+int
+dissect_rtse_RTORQapdu(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+
+  if(session  = (struct SESSION_DATA_STRUCTURE*)(pinfo->private_data))
+       session->ros_op = (ROS_OP_BIND | ROS_OP_ARGUMENT);
+
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              RTORQapdu_set, hf_index, ett_rtse_RTORQapdu);
+
+
+
+  return offset;
+}
+static int dissect_rtorq_apdu_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_RTORQapdu(TRUE, tvb, offset, pinfo, tree, hf_rtse_rtorq_apdu);
+}
+
+
+static const ber_sequence_t RTOACapdu_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_checkpointSize_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_windowSize_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_NOTCHKTAG, dissect_connectionDataAC },
+  { 0, 0, 0, NULL }
+};
+
+int
+dissect_rtse_RTOACapdu(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+
+  if(session  = (struct SESSION_DATA_STRUCTURE*)(pinfo->private_data))
+       session->ros_op = (ROS_OP_BIND | ROS_OP_RESULT);
+
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              RTOACapdu_set, hf_index, ett_rtse_RTOACapdu);
+
+
+
+  return offset;
+}
+static int dissect_rtoac_apdu_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_RTOACapdu(TRUE, tvb, offset, pinfo, tree, hf_rtse_rtoac_apdu);
+}
+
+
+static const value_string rtse_RefuseReason_vals[] = {
+  {   0, "rtsBusy" },
+  {   1, "cannotRecover" },
+  {   2, "validationFailure" },
+  {   3, "unacceptableDialogueMode" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_rtse_RefuseReason(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_refuseReason_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_RefuseReason(TRUE, tvb, offset, pinfo, tree, hf_rtse_refuseReason);
+}
+
+
+
+static int
+dissect_rtse_T_userDataRJ(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+/*XXX not implemented yet */
+
+
+  return offset;
+}
+static int dissect_userDataRJ(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_T_userDataRJ(FALSE, tvb, offset, pinfo, tree, hf_rtse_userDataRJ);
+}
+
+
+static const ber_sequence_t RTORJapdu_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_refuseReason_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL, dissect_userDataRJ },
+  { 0, 0, 0, NULL }
+};
+
+int
+dissect_rtse_RTORJapdu(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              RTORJapdu_set, hf_index, ett_rtse_RTORJapdu);
+
+  return offset;
+}
+static int dissect_rtorj_apdu_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_RTORJapdu(TRUE, tvb, offset, pinfo, tree, hf_rtse_rtorj_apdu);
+}
+
+
+
+static int
+dissect_rtse_RTTPapdu(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_rttp_apdu(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_RTTPapdu(FALSE, tvb, offset, pinfo, tree, hf_rtse_rttp_apdu);
+}
+
+
+
+static int
+dissect_rtse_RTTRapdu(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+       tvbuff_t *next_tvb = NULL;
+
+       offset = dissect_ber_octet_string(FALSE, pinfo, tree, tvb, offset, hf_index, &next_tvb);
+
+       if(next_tvb) {
+
+               /* XXX: we should check is this is an EXTERNAL first */
+
+               /* ROS won't do this for us */
+               if(session)
+                       session->ros_op = (ROS_OP_INVOKE | ROS_OP_ARGUMENT);
+
+               offset = dissect_rtse_EXTERNAL(FALSE, next_tvb, 0, pinfo, tree, -1);
+
+       }
+
+
+  return offset;
+}
+static int dissect_rttr_apdu(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_RTTRapdu(FALSE, tvb, offset, pinfo, tree, hf_rtse_rttr_apdu);
+}
+
+
+static const value_string rtse_AbortReason_vals[] = {
+  {   0, "localSystemProblem" },
+  {   1, "invalidParameter" },
+  {   2, "unrecognizedActivity" },
+  {   3, "temporaryProblem" },
+  {   4, "protocolError" },
+  {   5, "permanentProblem" },
+  {   6, "userError" },
+  {   7, "transferCompleted" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_rtse_AbortReason(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_abortReason_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_AbortReason(TRUE, tvb, offset, pinfo, tree, hf_rtse_abortReason);
+}
+
+
+
+static int
+dissect_rtse_BIT_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    NULL, hf_index, -1,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_reflectedParameter_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_BIT_STRING(TRUE, tvb, offset, pinfo, tree, hf_rtse_reflectedParameter);
+}
+static int dissect_arbitrary_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_BIT_STRING(TRUE, tvb, offset, pinfo, tree, hf_rtse_arbitrary);
+}
+
+
+
+static int
+dissect_rtse_T_userdataAB(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+/*XXX not implemented yet */
+
+
+  return offset;
+}
+static int dissect_userdataAB(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_T_userdataAB(FALSE, tvb, offset, pinfo, tree, hf_rtse_userdataAB);
+}
+
+
+static const ber_sequence_t RTABapdu_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_abortReason_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_reflectedParameter_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL, dissect_userdataAB },
+  { 0, 0, 0, NULL }
+};
+
+int
+dissect_rtse_RTABapdu(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              RTABapdu_set, hf_index, ett_rtse_RTABapdu);
+
+  return offset;
+}
+static int dissect_rtab_apdu_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_RTABapdu(TRUE, tvb, offset, pinfo, tree, hf_rtse_rtab_apdu);
+}
+
+
+static const value_string rtse_RTSE_apdus_vals[] = {
+  {   0, "rtorq-apdu" },
+  {   1, "rtoac-apdu" },
+  {   2, "rtorj-apdu" },
+  {   3, "rttp-apdu" },
+  {   4, "rttr-apdu" },
+  {   5, "rtab-apdu" },
+  { 0, NULL }
+};
+
+static const ber_choice_t RTSE_apdus_choice[] = {
+  {   0, BER_CLASS_CON, 16, BER_FLAGS_IMPLTAG, dissect_rtorq_apdu_impl },
+  {   1, BER_CLASS_CON, 17, BER_FLAGS_IMPLTAG, dissect_rtoac_apdu_impl },
+  {   2, BER_CLASS_CON, 18, BER_FLAGS_IMPLTAG, dissect_rtorj_apdu_impl },
+  {   3, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_rttp_apdu },
+  {   4, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_rttr_apdu },
+  {   5, BER_CLASS_CON, 22, BER_FLAGS_IMPLTAG, dissect_rtab_apdu_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_rtse_RTSE_apdus(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 RTSE_apdus_choice, hf_index, ett_rtse_RTSE_apdus,
+                                 NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_rtse_OBJECT_IDENTIFIER(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_direct_reference(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_OBJECT_IDENTIFIER(FALSE, tvb, offset, pinfo, tree, hf_rtse_direct_reference);
+}
+
+
+
+static int
+dissect_rtse_T_indirect_reference(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  char *oid;
+
+  offset = dissect_ber_integer(FALSE, pinfo, tree, tvb, offset,
+                hf_rtse_indirect_reference,
+                &indir_ref);
+
+  /* look up the indirect reference */
+  if(oid = find_oid_by_pres_ctx_id(pinfo, indir_ref)) {
+    strcpy(object_identifier_id, oid);
+  }
+       
+
+
+  return offset;
+}
+static int dissect_indirect_reference(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_T_indirect_reference(FALSE, tvb, offset, pinfo, tree, hf_rtse_indirect_reference);
+}
+
+
+
+static int
+dissect_rtse_ObjectDescriptor(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_ObjectDescriptor,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_data_value_descriptor(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_ObjectDescriptor(FALSE, tvb, offset, pinfo, tree, hf_rtse_data_value_descriptor);
+}
+
+
+
+static int
+dissect_rtse_T_single_ASN1_type(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset=call_rtse_oid_callback(object_identifier_id, tvb, offset, pinfo, top_tree);
+
+
+
+  return offset;
+}
+static int dissect_single_ASN1_type(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_T_single_ASN1_type(FALSE, tvb, offset, pinfo, tree, hf_rtse_single_ASN1_type);
+}
+
+
+static const value_string rtse_T_encoding_vals[] = {
+  {   0, "single-ASN1-type" },
+  {   1, "octet-aligned" },
+  {   2, "arbitrary" },
+  { 0, NULL }
+};
+
+static const ber_choice_t T_encoding_choice[] = {
+  {   0, BER_CLASS_CON, 0, 0, dissect_single_ASN1_type },
+  {   1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_octet_aligned_impl },
+  {   2, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_arbitrary_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_rtse_T_encoding(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 T_encoding_choice, hf_index, ett_rtse_T_encoding,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_encoding(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_rtse_T_encoding(FALSE, tvb, offset, pinfo, tree, hf_rtse_encoding);
+}
+
+
+static const ber_sequence_t EXTERNAL_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_direct_reference },
+  { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_indirect_reference },
+  { BER_CLASS_UNI, BER_UNI_TAG_ObjectDescriptor, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_data_value_descriptor },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_encoding },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_rtse_EXTERNAL(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  gint8 class;
+  gboolean pc, ind_field;
+  gint32 tag;
+  guint32 len1;
+
+  /* XXX  asn2eth can not yet handle tagged assignment so for the
+   * time being  just remove this tag manually inside the EXTERNAL
+   * dissector.
+   */
+   offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
+   offset = get_ber_length(tree, tvb, offset, &len1, &ind_field);
+   offset = dissect_ber_sequence(TRUE, pinfo, tree, tvb, offset,
+                                EXTERNAL_sequence, hf_index, ett_rtse_EXTERNAL);
+
+
+  return offset;
+}
+
+
+/*--- End of included file: packet-rtse-fn.c ---*/
+
+
+/*
+* Dissect RTSE PDUs inside a PPDU.
+*/
+static void
+dissect_rtse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
+{
+       int offset = 0;
+       int old_offset;
+       proto_item *item=NULL;
+       proto_tree *tree=NULL;
+
+       /* save parent_tree so subdissectors can create new top nodes */
+       top_tree=parent_tree;
+
+       /* do we have application context from the acse dissector?  */
+       if( !pinfo->private_data ){
+               if(parent_tree){
+                       proto_tree_add_text(parent_tree, tvb, offset, -1,
+                               "Internal error:can't get application context from ACSE dissector.");
+               } 
+               return  ;
+       } else {
+               session  = ( (struct SESSION_DATA_STRUCTURE*)(pinfo->private_data) );
+
+       }
+
+       if(parent_tree){
+               item = proto_tree_add_item(parent_tree, proto_rtse, tvb, 0, -1, FALSE);
+               tree = proto_item_add_subtree(item, ett_rtse);
+       }
+       if (check_col(pinfo->cinfo, COL_PROTOCOL))
+               col_set_str(pinfo->cinfo, COL_PROTOCOL, "RTSE");
+       if (check_col(pinfo->cinfo, COL_INFO))
+               col_clear(pinfo->cinfo, COL_INFO);
+
+       while (tvb_reported_length_remaining(tvb, offset) > 0){
+               old_offset=offset;
+               offset=dissect_rtse_RTSE_apdus(FALSE, tvb, offset, pinfo , tree, -1);
+               if(offset == old_offset){
+                       proto_tree_add_text(tree, tvb, offset, -1,"Internal error, zero-byte RTSE PDU");
+                       offset = tvb_length(tvb);
+                       break;
+               }
+       }
+
+       top_tree = NULL;
+}
+
+
+/*--- proto_register_rtse -------------------------------------------*/
+void proto_register_rtse(void) {
+
+  /* List of fields */
+  static hf_register_info hf[] =
+  {
+
+/*--- Included file: packet-rtse-hfarr.c ---*/
+
+    { &hf_rtse_rtorq_apdu,
+      { "rtorq-apdu", "rtse.rtorq_apdu",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "RTSE-apdus/rtorq-apdu", HFILL }},
+    { &hf_rtse_rtoac_apdu,
+      { "rtoac-apdu", "rtse.rtoac_apdu",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "RTSE-apdus/rtoac-apdu", HFILL }},
+    { &hf_rtse_rtorj_apdu,
+      { "rtorj-apdu", "rtse.rtorj_apdu",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "RTSE-apdus/rtorj-apdu", HFILL }},
+    { &hf_rtse_rttp_apdu,
+      { "rttp-apdu", "rtse.rttp_apdu",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "RTSE-apdus/rttp-apdu", HFILL }},
+    { &hf_rtse_rttr_apdu,
+      { "rttr-apdu", "rtse.rttr_apdu",
+        FT_BYTES, BASE_HEX, NULL, 0,
+        "RTSE-apdus/rttr-apdu", HFILL }},
+    { &hf_rtse_rtab_apdu,
+      { "rtab-apdu", "rtse.rtab_apdu",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "RTSE-apdus/rtab-apdu", HFILL }},
+    { &hf_rtse_checkpointSize,
+      { "checkpointSize", "rtse.checkpointSize",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "", HFILL }},
+    { &hf_rtse_windowSize,
+      { "windowSize", "rtse.windowSize",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "", HFILL }},
+    { &hf_rtse_dialogueMode,
+      { "dialogueMode", "rtse.dialogueMode",
+        FT_INT32, BASE_DEC, VALS(rtse_T_dialogueMode_vals), 0,
+        "RTORQapdu/dialogueMode", HFILL }},
+    { &hf_rtse_connectionDataRQ,
+      { "connectionDataRQ", "rtse.connectionDataRQ",
+        FT_UINT32, BASE_DEC, VALS(rtse_ConnectionData_vals), 0,
+        "RTORQapdu/connectionDataRQ", HFILL }},
+    { &hf_rtse_applicationProtocol,
+      { "applicationProtocol", "rtse.applicationProtocol",
+        FT_INT32, BASE_DEC, VALS(rtse_T_applicationProtocol_vals), 0,
+        "RTORQapdu/applicationProtocol", HFILL }},
+    { &hf_rtse_connectionDataAC,
+      { "connectionDataAC", "rtse.connectionDataAC",
+        FT_UINT32, BASE_DEC, VALS(rtse_ConnectionData_vals), 0,
+        "RTOACapdu/connectionDataAC", HFILL }},
+    { &hf_rtse_refuseReason,
+      { "refuseReason", "rtse.refuseReason",
+        FT_INT32, BASE_DEC, VALS(rtse_RefuseReason_vals), 0,
+        "RTORJapdu/refuseReason", HFILL }},
+    { &hf_rtse_userDataRJ,
+      { "userDataRJ", "rtse.userDataRJ",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "RTORJapdu/userDataRJ", HFILL }},
+    { &hf_rtse_abortReason,
+      { "abortReason", "rtse.abortReason",
+        FT_INT32, BASE_DEC, VALS(rtse_AbortReason_vals), 0,
+        "RTABapdu/abortReason", HFILL }},
+    { &hf_rtse_reflectedParameter,
+      { "reflectedParameter", "rtse.reflectedParameter",
+        FT_BYTES, BASE_HEX, NULL, 0,
+        "RTABapdu/reflectedParameter", HFILL }},
+    { &hf_rtse_userdataAB,
+      { "userdataAB", "rtse.userdataAB",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "RTABapdu/userdataAB", HFILL }},
+    { &hf_rtse_open,
+      { "open", "rtse.open",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ConnectionData/open", HFILL }},
+    { &hf_rtse_recover,
+      { "recover", "rtse.recover",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ConnectionData/recover", HFILL }},
+    { &hf_rtse_callingSSuserReference,
+      { "callingSSuserReference", "rtse.callingSSuserReference",
+        FT_UINT32, BASE_DEC, VALS(rtse_CallingSSuserReference_vals), 0,
+        "SessionConnectionIdentifier/callingSSuserReference", HFILL }},
+    { &hf_rtse_commonReference,
+      { "commonReference", "rtse.commonReference",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "SessionConnectionIdentifier/commonReference", HFILL }},
+    { &hf_rtse_additionalReferenceInformation,
+      { "additionalReferenceInformation", "rtse.additionalReferenceInformation",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "SessionConnectionIdentifier/additionalReferenceInformation", HFILL }},
+    { &hf_rtse_t61String,
+      { "t61String", "rtse.t61String",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "CallingSSuserReference/t61String", HFILL }},
+    { &hf_rtse_octetString,
+      { "octetString", "rtse.octetString",
+        FT_BYTES, BASE_HEX, NULL, 0,
+        "CallingSSuserReference/octetString", HFILL }},
+    { &hf_rtse_direct_reference,
+      { "direct-reference", "rtse.direct_reference",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "EXTERNAL/direct-reference", HFILL }},
+    { &hf_rtse_indirect_reference,
+      { "indirect-reference", "rtse.indirect_reference",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "EXTERNAL/indirect-reference", HFILL }},
+    { &hf_rtse_data_value_descriptor,
+      { "data-value-descriptor", "rtse.data_value_descriptor",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "EXTERNAL/data-value-descriptor", HFILL }},
+    { &hf_rtse_encoding,
+      { "encoding", "rtse.encoding",
+        FT_UINT32, BASE_DEC, VALS(rtse_T_encoding_vals), 0,
+        "EXTERNAL/encoding", HFILL }},
+    { &hf_rtse_single_ASN1_type,
+      { "single-ASN1-type", "rtse.single_ASN1_type",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "EXTERNAL/encoding/single-ASN1-type", HFILL }},
+    { &hf_rtse_octet_aligned,
+      { "octet-aligned", "rtse.octet_aligned",
+        FT_BYTES, BASE_HEX, NULL, 0,
+        "EXTERNAL/encoding/octet-aligned", HFILL }},
+    { &hf_rtse_arbitrary,
+      { "arbitrary", "rtse.arbitrary",
+        FT_BYTES, BASE_HEX, NULL, 0,
+        "EXTERNAL/encoding/arbitrary", HFILL }},
+
+/*--- End of included file: packet-rtse-hfarr.c ---*/
+
+  };
+
+  /* List of subtrees */
+  static gint *ett[] = {
+    &ett_rtse,
+    &ett_rtse_unknown,
+
+/*--- Included file: packet-rtse-ettarr.c ---*/
+
+    &ett_rtse_RTSE_apdus,
+    &ett_rtse_RTORQapdu,
+    &ett_rtse_RTOACapdu,
+    &ett_rtse_RTORJapdu,
+    &ett_rtse_RTABapdu,
+    &ett_rtse_ConnectionData,
+    &ett_rtse_SessionConnectionIdentifier,
+    &ett_rtse_CallingSSuserReference,
+    &ett_rtse_EXTERNAL,
+    &ett_rtse_T_encoding,
+
+/*--- End of included file: packet-rtse-ettarr.c ---*/
+
+  };
+
+  /* Register protocol */
+  proto_rtse = proto_register_protocol(PNAME, PSNAME, PFNAME);
+  register_dissector("rtse", dissect_rtse, proto_rtse);
+  /* Register fields and subtrees */
+  proto_register_field_array(proto_rtse, hf, array_length(hf));
+  proto_register_subtree_array(ett, array_length(ett));
+
+  rtse_oid_dissector_table = register_dissector_table("rtse.oid", "RTSE OID Dissectors", FT_STRING, BASE_NONE);
+  oid_table=g_hash_table_new(g_str_hash, g_str_equal);
+
+}
+
+
+/*--- proto_reg_handoff_rtse --- */
+void proto_reg_handoff_rtse(void) {
+}
diff --git a/epan/dissectors/packet-rtse.h b/epan/dissectors/packet-rtse.h
new file mode 100644 (file)
index 0000000..da644b1
--- /dev/null
@@ -0,0 +1,49 @@
+/* Do not modify this file.                                                   */
+/* It is created automatically by the ASN.1 to Ethereal dissector compiler    */
+/* .\packet-rtse.h                                                            */
+/* ../../tools/asn2eth.py -X -b -e -p rtse -c rtse.cnf -s packet-rtse-template rtse.asn */
+
+/* Input file: packet-rtse-template.h */
+
+/* packet-rtse.h
+ * Routines for RTSE packet dissection
+ * Graeme Lunt 2005
+ *
+ * $Id$
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifndef PACKET_RTSE_H
+#define PACKET_RTSE_H
+
+
+/*--- Included file: packet-rtse-exp.h ---*/
+
+int dissect_rtse_RTORQapdu(gboolean implicit_tag, tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, int hf_index);
+int dissect_rtse_RTOACapdu(gboolean implicit_tag, tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, int hf_index);
+int dissect_rtse_RTORJapdu(gboolean implicit_tag, tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, int hf_index);
+int dissect_rtse_RTABapdu(gboolean implicit_tag, tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, int hf_index);
+
+/*--- End of included file: packet-rtse-exp.h ---*/
+
+
+void register_rtse_oid_dissector_handle(const char *oid, dissector_handle_t dissector, int proto _U_, const char *name);
+
+#endif  /* PACKET_RTSE_H */
diff --git a/epan/dissectors/packet-s4406.c b/epan/dissectors/packet-s4406.c
new file mode 100644 (file)
index 0000000..2b4172d
--- /dev/null
@@ -0,0 +1,948 @@
+/* Do not modify this file.                                                   */
+/* It is created automatically by the ASN.1 to Ethereal dissector compiler    */
+/* .\packet-s4406.c                                                           */
+/* ../../tools/asn2eth.py -X -b -e -p s4406 -c s4406.cnf -s packet-s4406-template s4406.asn */
+
+/* Input file: packet-s4406-template.c */
+
+/* packet-s4406.c
+ * Routines for STANAG 4406 (X.400 Military Message Extensions)  packet dissection
+ * Graeme Lunt 2005
+ *
+ * $Id$
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib.h>
+#include <epan/packet.h>
+#include <epan/conversation.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "packet-ber.h"
+
+#include "packet-x509if.h"
+
+#include "packet-s4406.h"
+#include "packet-x411.h" 
+#include "packet-x420.h" 
+
+#define PNAME  "STANAG 4406 Military Message Extensions"
+#define PSNAME "STANAG 4406"
+#define PFNAME "MMHS"
+
+/* Initialize the protocol and registered fields */
+int proto_s4406 = -1;
+
+
+/*--- Included file: packet-s4406-hf.c ---*/
+
+static int hf_s4406_ExemptedAddress_PDU = -1;     /* ExemptedAddress */
+static int hf_s4406_ExtendedAuthorisationInfo_PDU = -1;  /* ExtendedAuthorisationInfo */
+static int hf_s4406_DistributionCodes_PDU = -1;   /* DistributionCodes */
+static int hf_s4406_HandlingInstructions_PDU = -1;  /* HandlingInstructions */
+static int hf_s4406_MessageInstructions_PDU = -1;  /* MessageInstructions */
+static int hf_s4406_CodressMessage_PDU = -1;      /* CodressMessage */
+static int hf_s4406_OriginatorReference_PDU = -1;  /* OriginatorReference */
+static int hf_s4406_MMHSPrecedence_PDU = -1;      /* MMHSPrecedence */
+static int hf_s4406_MessageType_PDU = -1;         /* MessageType */
+static int hf_s4406_AddressListDesignator_PDU = -1;  /* AddressListDesignator */
+static int hf_s4406_OtherRecipientDesignator_PDU = -1;  /* OtherRecipientDesignator */
+static int hf_s4406_PilotInformation_PDU = -1;    /* PilotInformation */
+static int hf_s4406_Acp127MessageIdentifier_PDU = -1;  /* Acp127MessageIdentifier */
+static int hf_s4406_OriginatorPlad_PDU = -1;      /* OriginatorPlad */
+static int hf_s4406_SecurityInformationLabels_PDU = -1;  /* SecurityInformationLabels */
+static int hf_s4406_sics = -1;                    /* SEQUENCE_OF_Sic */
+static int hf_s4406_sics_item = -1;               /* Sic */
+static int hf_s4406_dist_Extensions = -1;         /* SEQUENCE_OF_DistributionExtensionField */
+static int hf_s4406_dist_Extensions_item = -1;    /* DistributionExtensionField */
+static int hf_s4406_dist_type = -1;               /* OBJECT_IDENTIFIER */
+static int hf_s4406_dist_value = -1;              /* T_dist_value */
+static int hf_s4406_HandlingInstructions_item = -1;  /* MilitaryString */
+static int hf_s4406_MessageInstructions_item = -1;  /* MilitaryString */
+static int hf_s4406_message_type_type = -1;       /* TypeMessage */
+static int hf_s4406_identifier = -1;              /* MessageIdentifier */
+static int hf_s4406_address_list_type = -1;       /* AddressListType */
+static int hf_s4406_listName = -1;                /* ORDescriptor */
+static int hf_s4406_notificationRequest = -1;     /* AddressListRequest */
+static int hf_s4406_replyRequest = -1;            /* AddressListRequest */
+static int hf_s4406_other_recipient_type = -1;    /* OtherRecipientType */
+static int hf_s4406_designator = -1;              /* MilitaryString */
+static int hf_s4406_pilotPrecedence = -1;         /* MMHSPrecedence */
+static int hf_s4406_pilotRecipient = -1;          /* SEQUENCE_OF_ORDescriptor */
+static int hf_s4406_pilotRecipient_item = -1;     /* ORDescriptor */
+static int hf_s4406_pilotSecurity = -1;           /* SecurityLabel */
+static int hf_s4406_pilotHandling = -1;           /* SEQUENCE_OF_MilitaryString */
+static int hf_s4406_pilotHandling_item = -1;      /* MilitaryString */
+static int hf_s4406_content_security_label = -1;  /* SecurityLabel */
+static int hf_s4406_heading_security_label = -1;  /* SecurityLabel */
+static int hf_s4406_body_part_security_labels = -1;  /* SEQUENCE_OF_BodyPartSecurityLabel */
+static int hf_s4406_body_part_security_labels_item = -1;  /* BodyPartSecurityLabel */
+static int hf_s4406_body_part_security_label = -1;  /* SecurityLabel */
+static int hf_s4406_body_part_sequence_number = -1;  /* BodyPartSequenceNumber */
+
+/*--- End of included file: packet-s4406-hf.c ---*/
+
+
+/* Initialize the subtree pointers */
+static gint ett_s4406 = -1;
+
+/*--- Included file: packet-s4406-ett.c ---*/
+
+static gint ett_s4406_DistributionCodes = -1;
+static gint ett_s4406_SEQUENCE_OF_Sic = -1;
+static gint ett_s4406_SEQUENCE_OF_DistributionExtensionField = -1;
+static gint ett_s4406_DistributionExtensionField = -1;
+static gint ett_s4406_HandlingInstructions = -1;
+static gint ett_s4406_MessageInstructions = -1;
+static gint ett_s4406_MessageType = -1;
+static gint ett_s4406_AddressListDesignator = -1;
+static gint ett_s4406_OtherRecipientDesignator = -1;
+static gint ett_s4406_PilotInformation = -1;
+static gint ett_s4406_SEQUENCE_OF_ORDescriptor = -1;
+static gint ett_s4406_SEQUENCE_OF_MilitaryString = -1;
+static gint ett_s4406_SecurityInformationLabels = -1;
+static gint ett_s4406_SEQUENCE_OF_BodyPartSecurityLabel = -1;
+static gint ett_s4406_BodyPartSecurityLabel = -1;
+
+/*--- End of included file: packet-s4406-ett.c ---*/
+
+
+
+/*--- Included file: packet-s4406-fn.c ---*/
+
+/*--- Fields for imported types ---*/
+
+static int dissect_listName_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x420_ORDescriptor(TRUE, tvb, offset, pinfo, tree, hf_s4406_listName);
+}
+static int dissect_pilotRecipient_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x420_ORDescriptor(FALSE, tvb, offset, pinfo, tree, hf_s4406_pilotRecipient_item);
+}
+static int dissect_pilotSecurity_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityLabel(TRUE, tvb, offset, pinfo, tree, hf_s4406_pilotSecurity);
+}
+static int dissect_content_security_label_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityLabel(TRUE, tvb, offset, pinfo, tree, hf_s4406_content_security_label);
+}
+static int dissect_heading_security_label_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityLabel(TRUE, tvb, offset, pinfo, tree, hf_s4406_heading_security_label);
+}
+static int dissect_body_part_security_label_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityLabel(TRUE, tvb, offset, pinfo, tree, hf_s4406_body_part_security_label);
+}
+
+
+
+static int
+dissect_s4406_ExemptedAddress(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x420_ORDescriptor(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_s4406_ExtendedAuthorisationInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_UTCTime,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_s4406_Sic(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_PrintableString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_sics_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_Sic(FALSE, tvb, offset, pinfo, tree, hf_s4406_sics_item);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_Sic_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_sics_item },
+};
+
+static int
+dissect_s4406_SEQUENCE_OF_Sic(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_Sic_sequence_of, hf_index, ett_s4406_SEQUENCE_OF_Sic);
+
+  return offset;
+}
+static int dissect_sics_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_SEQUENCE_OF_Sic(TRUE, tvb, offset, pinfo, tree, hf_s4406_sics);
+}
+
+
+
+static int
+dissect_s4406_OBJECT_IDENTIFIER(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_dist_type(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_OBJECT_IDENTIFIER(FALSE, tvb, offset, pinfo, tree, hf_s4406_dist_type);
+}
+
+
+
+static int
+dissect_s4406_T_dist_value(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+/* XXX: not implemented */
+  return offset;
+}
+static int dissect_dist_value(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_T_dist_value(FALSE, tvb, offset, pinfo, tree, hf_s4406_dist_value);
+}
+
+
+static const ber_sequence_t DistributionExtensionField_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_dist_type },
+  { BER_CLASS_ANY, 0, BER_FLAGS_NOOWNTAG, dissect_dist_value },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_s4406_DistributionExtensionField(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   DistributionExtensionField_sequence, hf_index, ett_s4406_DistributionExtensionField);
+
+  return offset;
+}
+static int dissect_dist_Extensions_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_DistributionExtensionField(FALSE, tvb, offset, pinfo, tree, hf_s4406_dist_Extensions_item);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_DistributionExtensionField_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_dist_Extensions_item },
+};
+
+static int
+dissect_s4406_SEQUENCE_OF_DistributionExtensionField(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_DistributionExtensionField_sequence_of, hf_index, ett_s4406_SEQUENCE_OF_DistributionExtensionField);
+
+  return offset;
+}
+static int dissect_dist_Extensions_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_SEQUENCE_OF_DistributionExtensionField(TRUE, tvb, offset, pinfo, tree, hf_s4406_dist_Extensions);
+}
+
+
+static const ber_sequence_t DistributionCodes_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_sics_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_dist_Extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_s4406_DistributionCodes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              DistributionCodes_set, hf_index, ett_s4406_DistributionCodes);
+
+  return offset;
+}
+
+
+
+static int
+dissect_s4406_MilitaryString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_PrintableString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_HandlingInstructions_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_MilitaryString(FALSE, tvb, offset, pinfo, tree, hf_s4406_HandlingInstructions_item);
+}
+static int dissect_MessageInstructions_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_MilitaryString(FALSE, tvb, offset, pinfo, tree, hf_s4406_MessageInstructions_item);
+}
+static int dissect_designator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_MilitaryString(TRUE, tvb, offset, pinfo, tree, hf_s4406_designator);
+}
+static int dissect_pilotHandling_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_MilitaryString(FALSE, tvb, offset, pinfo, tree, hf_s4406_pilotHandling_item);
+}
+
+
+static const ber_sequence_t HandlingInstructions_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_HandlingInstructions_item },
+};
+
+static int
+dissect_s4406_HandlingInstructions(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      HandlingInstructions_sequence_of, hf_index, ett_s4406_HandlingInstructions);
+
+  return offset;
+}
+
+
+static const ber_sequence_t MessageInstructions_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_MessageInstructions_item },
+};
+
+static int
+dissect_s4406_MessageInstructions(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      MessageInstructions_sequence_of, hf_index, ett_s4406_MessageInstructions);
+
+  return offset;
+}
+
+
+
+static int
+dissect_s4406_CodressMessage(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_s4406_OriginatorReference(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_s4406_MilitaryString(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+static const value_string s4406_MMHSPrecedence_vals[] = {
+  {   0, "deferred" },
+  {   1, "routine" },
+  {   2, "priority" },
+  {   3, "immediate" },
+  {   4, "flash" },
+  {   5, "override" },
+  {  16, "ecp" },
+  {  17, "critic" },
+  {  18, "override" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_s4406_MMHSPrecedence(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_pilotPrecedence_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_MMHSPrecedence(TRUE, tvb, offset, pinfo, tree, hf_s4406_pilotPrecedence);
+}
+
+
+static const value_string s4406_TypeMessage_vals[] = {
+  {   0, "exercise" },
+  {   1, "operation" },
+  {   2, "project" },
+  {   3, "drill" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_s4406_TypeMessage(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_message_type_type_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_TypeMessage(TRUE, tvb, offset, pinfo, tree, hf_s4406_message_type_type);
+}
+
+
+
+static int
+dissect_s4406_MessageIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_s4406_MilitaryString(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_identifier_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_MessageIdentifier(TRUE, tvb, offset, pinfo, tree, hf_s4406_identifier);
+}
+
+
+static const ber_sequence_t MessageType_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_message_type_type_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_identifier_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_s4406_MessageType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              MessageType_set, hf_index, ett_s4406_MessageType);
+
+  return offset;
+}
+
+
+static const value_string s4406_AddressListType_vals[] = {
+  {   0, "primaryAddressList" },
+  {   1, "copyAddressList" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_s4406_AddressListType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_address_list_type_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_AddressListType(TRUE, tvb, offset, pinfo, tree, hf_s4406_address_list_type);
+}
+
+
+static const value_string s4406_AddressListRequest_vals[] = {
+  {   0, "action" },
+  {   1, "info" },
+  {   2, "both" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_s4406_AddressListRequest(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_notificationRequest_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_AddressListRequest(TRUE, tvb, offset, pinfo, tree, hf_s4406_notificationRequest);
+}
+static int dissect_replyRequest_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_AddressListRequest(TRUE, tvb, offset, pinfo, tree, hf_s4406_replyRequest);
+}
+
+
+static const ber_sequence_t AddressListDesignator_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_address_list_type_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_listName_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_notificationRequest_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_replyRequest_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_s4406_AddressListDesignator(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              AddressListDesignator_set, hf_index, ett_s4406_AddressListDesignator);
+
+  return offset;
+}
+
+
+static const value_string s4406_OtherRecipientType_vals[] = {
+  {   0, "primary" },
+  {   1, "copy" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_s4406_OtherRecipientType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_other_recipient_type_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_OtherRecipientType(TRUE, tvb, offset, pinfo, tree, hf_s4406_other_recipient_type);
+}
+
+
+static const ber_sequence_t OtherRecipientDesignator_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_other_recipient_type_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_designator_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_s4406_OtherRecipientDesignator(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              OtherRecipientDesignator_set, hf_index, ett_s4406_OtherRecipientDesignator);
+
+  return offset;
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_ORDescriptor_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_pilotRecipient_item },
+};
+
+static int
+dissect_s4406_SEQUENCE_OF_ORDescriptor(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_ORDescriptor_sequence_of, hf_index, ett_s4406_SEQUENCE_OF_ORDescriptor);
+
+  return offset;
+}
+static int dissect_pilotRecipient_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_SEQUENCE_OF_ORDescriptor(TRUE, tvb, offset, pinfo, tree, hf_s4406_pilotRecipient);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_MilitaryString_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_pilotHandling_item },
+};
+
+static int
+dissect_s4406_SEQUENCE_OF_MilitaryString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_MilitaryString_sequence_of, hf_index, ett_s4406_SEQUENCE_OF_MilitaryString);
+
+  return offset;
+}
+static int dissect_pilotHandling_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_SEQUENCE_OF_MilitaryString(TRUE, tvb, offset, pinfo, tree, hf_s4406_pilotHandling);
+}
+
+
+static const ber_sequence_t PilotInformation_sequence[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_pilotPrecedence_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_pilotRecipient_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_pilotSecurity_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_pilotHandling_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_s4406_PilotInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   PilotInformation_sequence, hf_index, ett_s4406_PilotInformation);
+
+  return offset;
+}
+
+
+
+static int
+dissect_s4406_Acp127MessageIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_s4406_MilitaryString(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_s4406_OriginatorPlad(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_s4406_MilitaryString(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_s4406_BodyPartSequenceNumber(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_body_part_sequence_number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_BodyPartSequenceNumber(TRUE, tvb, offset, pinfo, tree, hf_s4406_body_part_sequence_number);
+}
+
+
+static const ber_sequence_t BodyPartSecurityLabel_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_body_part_security_label_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_body_part_sequence_number_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_s4406_BodyPartSecurityLabel(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              BodyPartSecurityLabel_set, hf_index, ett_s4406_BodyPartSecurityLabel);
+
+  return offset;
+}
+static int dissect_body_part_security_labels_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_BodyPartSecurityLabel(FALSE, tvb, offset, pinfo, tree, hf_s4406_body_part_security_labels_item);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_BodyPartSecurityLabel_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_body_part_security_labels_item },
+};
+
+static int
+dissect_s4406_SEQUENCE_OF_BodyPartSecurityLabel(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_BodyPartSecurityLabel_sequence_of, hf_index, ett_s4406_SEQUENCE_OF_BodyPartSecurityLabel);
+
+  return offset;
+}
+static int dissect_body_part_security_labels_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_s4406_SEQUENCE_OF_BodyPartSecurityLabel(TRUE, tvb, offset, pinfo, tree, hf_s4406_body_part_security_labels);
+}
+
+
+static const ber_sequence_t SecurityInformationLabels_sequence[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_content_security_label_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_heading_security_label_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_body_part_security_labels_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_s4406_SecurityInformationLabels(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   SecurityInformationLabels_sequence, hf_index, ett_s4406_SecurityInformationLabels);
+
+  return offset;
+}
+
+/*--- PDUs ---*/
+
+static void dissect_ExemptedAddress_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_ExemptedAddress(FALSE, tvb, 0, pinfo, tree, hf_s4406_ExemptedAddress_PDU);
+}
+static void dissect_ExtendedAuthorisationInfo_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_ExtendedAuthorisationInfo(FALSE, tvb, 0, pinfo, tree, hf_s4406_ExtendedAuthorisationInfo_PDU);
+}
+static void dissect_DistributionCodes_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_DistributionCodes(FALSE, tvb, 0, pinfo, tree, hf_s4406_DistributionCodes_PDU);
+}
+static void dissect_HandlingInstructions_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_HandlingInstructions(FALSE, tvb, 0, pinfo, tree, hf_s4406_HandlingInstructions_PDU);
+}
+static void dissect_MessageInstructions_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_MessageInstructions(FALSE, tvb, 0, pinfo, tree, hf_s4406_MessageInstructions_PDU);
+}
+static void dissect_CodressMessage_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_CodressMessage(FALSE, tvb, 0, pinfo, tree, hf_s4406_CodressMessage_PDU);
+}
+static void dissect_OriginatorReference_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_OriginatorReference(FALSE, tvb, 0, pinfo, tree, hf_s4406_OriginatorReference_PDU);
+}
+static void dissect_MMHSPrecedence_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_MMHSPrecedence(FALSE, tvb, 0, pinfo, tree, hf_s4406_MMHSPrecedence_PDU);
+}
+static void dissect_MessageType_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_MessageType(FALSE, tvb, 0, pinfo, tree, hf_s4406_MessageType_PDU);
+}
+static void dissect_AddressListDesignator_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_AddressListDesignator(FALSE, tvb, 0, pinfo, tree, hf_s4406_AddressListDesignator_PDU);
+}
+static void dissect_OtherRecipientDesignator_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_OtherRecipientDesignator(FALSE, tvb, 0, pinfo, tree, hf_s4406_OtherRecipientDesignator_PDU);
+}
+static void dissect_PilotInformation_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_PilotInformation(FALSE, tvb, 0, pinfo, tree, hf_s4406_PilotInformation_PDU);
+}
+static void dissect_Acp127MessageIdentifier_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_Acp127MessageIdentifier(FALSE, tvb, 0, pinfo, tree, hf_s4406_Acp127MessageIdentifier_PDU);
+}
+static void dissect_OriginatorPlad_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_OriginatorPlad(FALSE, tvb, 0, pinfo, tree, hf_s4406_OriginatorPlad_PDU);
+}
+static void dissect_SecurityInformationLabels_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_s4406_SecurityInformationLabels(FALSE, tvb, 0, pinfo, tree, hf_s4406_SecurityInformationLabels_PDU);
+}
+
+
+/*--- End of included file: packet-s4406-fn.c ---*/
+
+
+
+
+
+/*--- proto_register_s4406 -------------------------------------------*/
+void proto_register_s4406(void) {
+
+  /* List of fields */
+  static hf_register_info hf[] =
+  {
+
+/*--- Included file: packet-s4406-hfarr.c ---*/
+
+    { &hf_s4406_ExemptedAddress_PDU,
+      { "ExemptedAddress", "s4406.ExemptedAddress",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ExemptedAddress", HFILL }},
+    { &hf_s4406_ExtendedAuthorisationInfo_PDU,
+      { "ExtendedAuthorisationInfo", "s4406.ExtendedAuthorisationInfo",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "ExtendedAuthorisationInfo", HFILL }},
+    { &hf_s4406_DistributionCodes_PDU,
+      { "DistributionCodes", "s4406.DistributionCodes",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "DistributionCodes", HFILL }},
+    { &hf_s4406_HandlingInstructions_PDU,
+      { "HandlingInstructions", "s4406.HandlingInstructions",
+        FT_UINT32, BASE_DEC, NULL, 0,
+        "HandlingInstructions", HFILL }},
+    { &hf_s4406_MessageInstructions_PDU,
+      { "MessageInstructions", "s4406.MessageInstructions",
+        FT_UINT32, BASE_DEC, NULL, 0,
+        "MessageInstructions", HFILL }},
+    { &hf_s4406_CodressMessage_PDU,
+      { "CodressMessage", "s4406.CodressMessage",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "CodressMessage", HFILL }},
+    { &hf_s4406_OriginatorReference_PDU,
+      { "OriginatorReference", "s4406.OriginatorReference",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "OriginatorReference", HFILL }},
+    { &hf_s4406_MMHSPrecedence_PDU,
+      { "MMHSPrecedence", "s4406.MMHSPrecedence",
+        FT_INT32, BASE_DEC, VALS(s4406_MMHSPrecedence_vals), 0,
+        "MMHSPrecedence", HFILL }},
+    { &hf_s4406_MessageType_PDU,
+      { "MessageType", "s4406.MessageType",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "MessageType", HFILL }},
+    { &hf_s4406_AddressListDesignator_PDU,
+      { "AddressListDesignator", "s4406.AddressListDesignator",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "AddressListDesignator", HFILL }},
+    { &hf_s4406_OtherRecipientDesignator_PDU,
+      { "OtherRecipientDesignator", "s4406.OtherRecipientDesignator",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "OtherRecipientDesignator", HFILL }},
+    { &hf_s4406_PilotInformation_PDU,
+      { "PilotInformation", "s4406.PilotInformation",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "PilotInformation", HFILL }},
+    { &hf_s4406_Acp127MessageIdentifier_PDU,
+      { "Acp127MessageIdentifier", "s4406.Acp127MessageIdentifier",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "Acp127MessageIdentifier", HFILL }},
+    { &hf_s4406_OriginatorPlad_PDU,
+      { "OriginatorPlad", "s4406.OriginatorPlad",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "OriginatorPlad", HFILL }},
+    { &hf_s4406_SecurityInformationLabels_PDU,
+      { "SecurityInformationLabels", "s4406.SecurityInformationLabels",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "SecurityInformationLabels", HFILL }},
+    { &hf_s4406_sics,
+      { "sics", "s4406.sics",
+        FT_UINT32, BASE_DEC, NULL, 0,
+        "DistributionCodes/sics", HFILL }},
+    { &hf_s4406_sics_item,
+      { "Item", "s4406.sics_item",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "DistributionCodes/sics/_item", HFILL }},
+    { &hf_s4406_dist_Extensions,
+      { "dist-Extensions", "s4406.dist_Extensions",
+        FT_UINT32, BASE_DEC, NULL, 0,
+        "DistributionCodes/dist-Extensions", HFILL }},
+    { &hf_s4406_dist_Extensions_item,
+      { "Item", "s4406.dist_Extensions_item",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "DistributionCodes/dist-Extensions/_item", HFILL }},
+    { &hf_s4406_dist_type,
+      { "dist-type", "s4406.dist_type",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "DistributionExtensionField/dist-type", HFILL }},
+    { &hf_s4406_dist_value,
+      { "dist-value", "s4406.dist_value",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "DistributionExtensionField/dist-value", HFILL }},
+    { &hf_s4406_HandlingInstructions_item,
+      { "Item", "s4406.HandlingInstructions_item",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "HandlingInstructions/_item", HFILL }},
+    { &hf_s4406_MessageInstructions_item,
+      { "Item", "s4406.MessageInstructions_item",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "MessageInstructions/_item", HFILL }},
+    { &hf_s4406_message_type_type,
+      { "type", "s4406.type",
+        FT_INT32, BASE_DEC, VALS(s4406_TypeMessage_vals), 0,
+        "MessageType/type", HFILL }},
+    { &hf_s4406_identifier,
+      { "identifier", "s4406.identifier",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "MessageType/identifier", HFILL }},
+    { &hf_s4406_address_list_type,
+      { "type", "s4406.type",
+        FT_INT32, BASE_DEC, VALS(s4406_AddressListType_vals), 0,
+        "AddressListDesignator/type", HFILL }},
+    { &hf_s4406_listName,
+      { "listName", "s4406.listName",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "AddressListDesignator/listName", HFILL }},
+    { &hf_s4406_notificationRequest,
+      { "notificationRequest", "s4406.notificationRequest",
+        FT_INT32, BASE_DEC, VALS(s4406_AddressListRequest_vals), 0,
+        "AddressListDesignator/notificationRequest", HFILL }},
+    { &hf_s4406_replyRequest,
+      { "replyRequest", "s4406.replyRequest",
+        FT_INT32, BASE_DEC, VALS(s4406_AddressListRequest_vals), 0,
+        "AddressListDesignator/replyRequest", HFILL }},
+    { &hf_s4406_other_recipient_type,
+      { "type", "s4406.type",
+        FT_INT32, BASE_DEC, VALS(s4406_OtherRecipientType_vals), 0,
+        "OtherRecipientDesignator/type", HFILL }},
+    { &hf_s4406_designator,
+      { "designator", "s4406.designator",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "OtherRecipientDesignator/designator", HFILL }},
+    { &hf_s4406_pilotPrecedence,
+      { "pilotPrecedence", "s4406.pilotPrecedence",
+        FT_INT32, BASE_DEC, VALS(s4406_MMHSPrecedence_vals), 0,
+        "PilotInformation/pilotPrecedence", HFILL }},
+    { &hf_s4406_pilotRecipient,
+      { "pilotRecipient", "s4406.pilotRecipient",
+        FT_UINT32, BASE_DEC, NULL, 0,
+        "PilotInformation/pilotRecipient", HFILL }},
+    { &hf_s4406_pilotRecipient_item,
+      { "Item", "s4406.pilotRecipient_item",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "PilotInformation/pilotRecipient/_item", HFILL }},
+    { &hf_s4406_pilotSecurity,
+      { "pilotSecurity", "s4406.pilotSecurity",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "PilotInformation/pilotSecurity", HFILL }},
+    { &hf_s4406_pilotHandling,
+      { "pilotHandling", "s4406.pilotHandling",
+        FT_UINT32, BASE_DEC, NULL, 0,
+        "PilotInformation/pilotHandling", HFILL }},
+    { &hf_s4406_pilotHandling_item,
+      { "Item", "s4406.pilotHandling_item",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "PilotInformation/pilotHandling/_item", HFILL }},
+    { &hf_s4406_content_security_label,
+      { "content-security-label", "s4406.content_security_label",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "SecurityInformationLabels/content-security-label", HFILL }},
+    { &hf_s4406_heading_security_label,
+      { "heading-security-label", "s4406.heading_security_label",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "SecurityInformationLabels/heading-security-label", HFILL }},
+    { &hf_s4406_body_part_security_labels,
+      { "body-part-security-labels", "s4406.body_part_security_labels",
+        FT_UINT32, BASE_DEC, NULL, 0,
+        "SecurityInformationLabels/body-part-security-labels", HFILL }},
+    { &hf_s4406_body_part_security_labels_item,
+      { "Item", "s4406.body_part_security_labels_item",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "SecurityInformationLabels/body-part-security-labels/_item", HFILL }},
+    { &hf_s4406_body_part_security_label,
+      { "body-part-security-label", "s4406.body_part_security_label",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "BodyPartSecurityLabel/body-part-security-label", HFILL }},
+    { &hf_s4406_body_part_sequence_number,
+      { "body-part-sequence-number", "s4406.body_part_sequence_number",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "BodyPartSecurityLabel/body-part-sequence-number", HFILL }},
+
+/*--- End of included file: packet-s4406-hfarr.c ---*/
+
+  };
+
+  /* List of subtrees */
+  static gint *ett[] = {
+    &ett_s4406,
+
+/*--- Included file: packet-s4406-ettarr.c ---*/
+
+    &ett_s4406_DistributionCodes,
+    &ett_s4406_SEQUENCE_OF_Sic,
+    &ett_s4406_SEQUENCE_OF_DistributionExtensionField,
+    &ett_s4406_DistributionExtensionField,
+    &ett_s4406_HandlingInstructions,
+    &ett_s4406_MessageInstructions,
+    &ett_s4406_MessageType,
+    &ett_s4406_AddressListDesignator,
+    &ett_s4406_OtherRecipientDesignator,
+    &ett_s4406_PilotInformation,
+    &ett_s4406_SEQUENCE_OF_ORDescriptor,
+    &ett_s4406_SEQUENCE_OF_MilitaryString,
+    &ett_s4406_SecurityInformationLabels,
+    &ett_s4406_SEQUENCE_OF_BodyPartSecurityLabel,
+    &ett_s4406_BodyPartSecurityLabel,
+
+/*--- End of included file: packet-s4406-ettarr.c ---*/
+
+  };
+
+  /* Register protocol */
+  proto_s4406 = proto_register_protocol(PNAME, PSNAME, PFNAME);
+
+  /* Register fields and subtrees */
+  proto_register_field_array(proto_s4406, hf, array_length(hf));
+  proto_register_subtree_array(ett, array_length(ett));
+
+}
+
+
+/*--- proto_reg_handoff_s4406 --- */
+void proto_reg_handoff_s4406(void) {
+
+/*--- Included file: packet-s4406-dis-tab.c ---*/
+
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.0", dissect_MMHSPrecedence_PDU, proto_s4406, "primary-precedence");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.1", dissect_MMHSPrecedence_PDU, proto_s4406, "copy-precedence");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.2", dissect_MessageType_PDU, proto_s4406, "message-type");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.3", dissect_AddressListDesignator_PDU, proto_s4406, "address-list-indicator");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.4", dissect_ExemptedAddress_PDU, proto_s4406, "exempted-address");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.5", dissect_ExtendedAuthorisationInfo_PDU, proto_s4406, "extended-authorisation-info");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.6", dissect_DistributionCodes_PDU, proto_s4406, "distribution-codes");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.7", dissect_HandlingInstructions_PDU, proto_s4406, "handling-instructions");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.8", dissect_MessageInstructions_PDU, proto_s4406, "message-instructions");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.9", dissect_CodressMessage_PDU, proto_s4406, "codress-message");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.10", dissect_OriginatorReference_PDU, proto_s4406, "originator-reference");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.11", dissect_OtherRecipientDesignator_PDU, proto_s4406, "other-recipients-indicator");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.12", dissect_PilotInformation_PDU, proto_s4406, "pilot-forwarding-info");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.13", dissect_Acp127MessageIdentifier_PDU, proto_s4406, "acp127-message-identifierr");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.14", dissect_OriginatorPlad_PDU, proto_s4406, "originator-plad");
+  register_ber_oid_dissector("1.3.26.0.4406.0.2.17", dissect_SecurityInformationLabels_PDU, proto_s4406, "information-labels");
+
+
+/*--- End of included file: packet-s4406-dis-tab.c ---*/
+
+
+}
diff --git a/epan/dissectors/packet-s4406.h b/epan/dissectors/packet-s4406.h
new file mode 100644 (file)
index 0000000..14caf7e
--- /dev/null
@@ -0,0 +1,38 @@
+/* Do not modify this file.                                                   */
+/* It is created automatically by the ASN.1 to Ethereal dissector compiler    */
+/* .\packet-s4406.h                                                           */
+/* ../../tools/asn2eth.py -X -b -e -p s4406 -c s4406.cnf -s packet-s4406-template s4406.asn */
+
+/* Input file: packet-s4406-template.h */
+
+/* packet-s4406.h
+ * Routines for X.411 (X.400 Message Transfer) packet dissection
+ * Graeme Lunt 2005
+ *
+ * $Id$
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifndef PACKET_S4406_H
+#define PACKET_S4406_H
+
+/* #include "packet-s4406-exp.h" */
+
+#endif  /* PACKET_S4406_H */
index 2a801c67f30e4fe0fc7a077f2b2f53d18a23f9e9..5055c9b1a27538ee6ce27a9d630b69a82a48b2a0 100644 (file)
@@ -195,6 +195,7 @@ struct SESSION_DATA_STRUCTURE
        guint8  spdu_type;
        guint8  abort_type;
        guint8  pres_ctx_id;
        guint8  spdu_type;
        guint8  abort_type;
        guint8  pres_ctx_id;
+       guint32 ros_op;
 };
 #define                implementation_restriction              0x10
 
 };
 #define                implementation_restriction              0x10
 
diff --git a/epan/dissectors/packet-x411.c b/epan/dissectors/packet-x411.c
new file mode 100644 (file)
index 0000000..0e4bff9
--- /dev/null
@@ -0,0 +1,8441 @@
+/* Do not modify this file.                                                   */
+/* It is created automatically by the ASN.1 to Ethereal dissector compiler    */
+/* .\packet-x411.c                                                            */
+/* ../../tools/asn2eth.py -X -b -e -p x411 -c x411.cnf -s packet-x411-template x411.asn */
+
+/* Input file: packet-x411-template.c */
+
+/* packet-x411.c
+ * Routines for X.411 (X.400 Message Transfer)  packet dissection
+ * Graeme Lunt 2005
+ *
+ * $Id$
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib.h>
+#include <epan/packet.h>
+#include <epan/conversation.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "packet-ber.h"
+#include "packet-acse.h"
+#include "packet-ros.h"
+#include "packet-rtse.h"
+
+#include "packet-x509af.h"
+#include "packet-x509ce.h"
+#include "packet-x509if.h"
+#include "packet-x509sat.h"
+
+#include "packet-x411.h"
+
+#define PNAME  "X.411 OSI Message Transfer Service"
+#define PSNAME "X411"
+#define PFNAME "x411"
+
+/* Initialize the protocol and registered fields */
+int proto_x411 = -1;
+
+static struct SESSION_DATA_STRUCTURE* session = NULL;
+static int extension_id = 0; /* integer extension id */
+static char object_identifier_id[BER_MAX_OID_STR_LEN]; /* content type identifier */
+static int
+call_x411_oid_callback(char *base_oid, tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree);
+
+
+/*--- Included file: packet-x411-hf.c ---*/
+
+static int hf_x411_InternalTraceInformation_PDU = -1;  /* InternalTraceInformation */
+static int hf_x411_TraceInformation_PDU = -1;     /* TraceInformation */
+static int hf_x411_RecipientReassignmentProhibited_PDU = -1;  /* RecipientReassignmentProhibited */
+static int hf_x411_MTSOriginatorRequestedAlternateRecipient_PDU = -1;  /* MTSOriginatorRequestedAlternateRecipient */
+static int hf_x411_DLExpansionProhibited_PDU = -1;  /* DLExpansionProhibited */
+static int hf_x411_ConversionWithLossProhibited_PDU = -1;  /* ConversionWithLossProhibited */
+static int hf_x411_LatestDeliveryTime_PDU = -1;   /* LatestDeliveryTime */
+static int hf_x411_RequestedDeliveryMethod_PDU = -1;  /* RequestedDeliveryMethod */
+static int hf_x411_PhysicalForwardingProhibited_PDU = -1;  /* PhysicalForwardingProhibited */
+static int hf_x411_PhysicalForwardingAddressRequest_PDU = -1;  /* PhysicalForwardingAddressRequest */
+static int hf_x411_PhysicalDeliveryModes_PDU = -1;  /* PhysicalDeliveryModes */
+static int hf_x411_RegisteredMailType_PDU = -1;   /* RegisteredMailType */
+static int hf_x411_RecipientNumberForAdvice_PDU = -1;  /* RecipientNumberForAdvice */
+static int hf_x411_PhysicalRenditionAttributes_PDU = -1;  /* PhysicalRenditionAttributes */
+static int hf_x411_OriginatorReturnAddress_PDU = -1;  /* OriginatorReturnAddress */
+static int hf_x411_PhysicalDeliveryReportRequest_PDU = -1;  /* PhysicalDeliveryReportRequest */
+static int hf_x411_OriginatorCertificate_PDU = -1;  /* OriginatorCertificate */
+static int hf_x411_ContentConfidentialityAlgorithmIdentifier_PDU = -1;  /* ContentConfidentialityAlgorithmIdentifier */
+static int hf_x411_MessageSecurityLabel_PDU = -1;  /* MessageSecurityLabel */
+static int hf_x411_ProofOfSubmissionRequest_PDU = -1;  /* ProofOfSubmissionRequest */
+static int hf_x411_ProofOfDeliveryRequest_PDU = -1;  /* ProofOfDeliveryRequest */
+static int hf_x411_ContentCorrelator_PDU = -1;    /* ContentCorrelator */
+static int hf_x411_RedirectionHistory_PDU = -1;   /* RedirectionHistory */
+static int hf_x411_DLExpansionHistory_PDU = -1;   /* DLExpansionHistory */
+static int hf_x411_PhysicalForwardingAddress_PDU = -1;  /* PhysicalForwardingAddress */
+static int hf_x411_OriginatorAndDLExpansionHistory_PDU = -1;  /* OriginatorAndDLExpansionHistory */
+static int hf_x411_ReportingDLName_PDU = -1;      /* ReportingDLName */
+static int hf_x411_ReportingMTACertificate_PDU = -1;  /* ReportingMTACertificate */
+static int hf_x411_ReportingMTAName_PDU = -1;     /* ReportingMTAName */
+static int hf_x411_ExtendedCertificates_PDU = -1;  /* ExtendedCertificates */
+static int hf_x411_DLExemptedRecipients_PDU = -1;  /* DLExemptedRecipients */
+static int hf_x411_CertificateSelectors_PDU = -1;  /* CertificateSelectors */
+static int hf_x411_CommonName_PDU = -1;           /* CommonName */
+static int hf_x411_TeletexCommonName_PDU = -1;    /* TeletexCommonName */
+static int hf_x411_UniversalCommonName_PDU = -1;  /* UniversalCommonName */
+static int hf_x411_TeletexOrganizationName_PDU = -1;  /* TeletexOrganizationName */
+static int hf_x411_UniversalOrganizationName_PDU = -1;  /* UniversalOrganizationName */
+static int hf_x411_TeletexPersonalName_PDU = -1;  /* TeletexPersonalName */
+static int hf_x411_UniversalPersonalName_PDU = -1;  /* UniversalPersonalName */
+static int hf_x411_TeletexOrganizationalUnitNames_PDU = -1;  /* TeletexOrganizationalUnitNames */
+static int hf_x411_UniversalOrganizationalUnitNames_PDU = -1;  /* UniversalOrganizationalUnitNames */
+static int hf_x411_PDSName_PDU = -1;              /* PDSName */
+static int hf_x411_PhysicalDeliveryCountryName_PDU = -1;  /* PhysicalDeliveryCountryName */
+static int hf_x411_PostalCode_PDU = -1;           /* PostalCode */
+static int hf_x411_PhysicalDeliveryOfficeName_PDU = -1;  /* PhysicalDeliveryOfficeName */
+static int hf_x411_unauthenticated = -1;          /* NULL */
+static int hf_x411_authenticated_argument = -1;   /* AuthenticatedArgument */
+static int hf_x411_authenticated_initiator_name = -1;  /* MTAName */
+static int hf_x411_initiator_credentials = -1;    /* InitiatorCredentials */
+static int hf_x411_security_context = -1;         /* SecurityContext */
+static int hf_x411_authenticated_result = -1;     /* AuthenticatedResult */
+static int hf_x411_authenticated_responder_name = -1;  /* MTAName */
+static int hf_x411_responder_credentials = -1;    /* ResponderCredentials */
+static int hf_x411_message = -1;                  /* Message */
+static int hf_x411_probe = -1;                    /* Probe */
+static int hf_x411_report = -1;                   /* Report */
+static int hf_x411_message_envelope = -1;         /* MessageTransferEnvelope */
+static int hf_x411_content = -1;                  /* Content */
+static int hf_x411_report_envelope = -1;          /* ReportTransferEnvelope */
+static int hf_x411_report_content = -1;           /* ReportTransferContent */
+static int hf_x411_message_identifier = -1;       /* MessageIdentifier */
+static int hf_x411_mta_originator_name = -1;      /* MTAOriginatorName */
+static int hf_x411_original_encoded_information_types = -1;  /* OriginalEncodedInformationTypes */
+static int hf_x411_content_type = -1;             /* ContentType */
+static int hf_x411_content_identifier = -1;       /* ContentIdentifier */
+static int hf_x411_priority = -1;                 /* Priority */
+static int hf_x411_per_message_indicators = -1;   /* PerMessageIndicators */
+static int hf_x411_deferred_delivery_time = -1;   /* DeferredDeliveryTime */
+static int hf_x411_per_domain_bilateral_information = -1;  /* SEQUENCE_OF_PerDomainBilateralInformation */
+static int hf_x411_per_domain_bilateral_information_item = -1;  /* PerDomainBilateralInformation */
+static int hf_x411_trace_information = -1;        /* TraceInformation */
+static int hf_x411_extensions = -1;               /* SET_OF_ExtensionField */
+static int hf_x411_extensions_item = -1;          /* ExtensionField */
+static int hf_x411_per_recipient_message_fields = -1;  /* SEQUENCE_OF_PerRecipientMessageTransferFields */
+static int hf_x411_per_recipient_message_fields_item = -1;  /* PerRecipientMessageTransferFields */
+static int hf_x411_recipient_name = -1;           /* MTARecipientName */
+static int hf_x411_originally_specified_recipient_number = -1;  /* OriginallySpecifiedRecipientNumber */
+static int hf_x411_per_recipient_indicators = -1;  /* PerRecipientIndicators */
+static int hf_x411_explicit_conversion = -1;      /* ExplicitConversion */
+static int hf_x411_probe_identifier = -1;         /* ProbeIdentifier */
+static int hf_x411_content_length = -1;           /* ContentLength */
+static int hf_x411_per_recipient_probe_transfer_fields = -1;  /* SEQUENCE_OF_PerRecipientProbeTransferFields */
+static int hf_x411_per_recipient_probe_transfer_fields_item = -1;  /* PerRecipientProbeTransferFields */
+static int hf_x411_report_identifier = -1;        /* ReportIdentifier */
+static int hf_x411_report_destination_name = -1;  /* ReportDestinationName */
+static int hf_x411_subject_identifier = -1;       /* SubjectIdentifier */
+static int hf_x411_subject_intermediate_trace_information = -1;  /* SubjectIntermediateTraceInformation */
+static int hf_x411_returned_content = -1;         /* Content */
+static int hf_x411_additional_information = -1;   /* AdditionalInformation */
+static int hf_x411_per_recipient_report_fields = -1;  /* SEQUENCE_OF_PerRecipientReportTransferFields */
+static int hf_x411_per_recipient_fields_item = -1;  /* PerRecipientReportTransferFields */
+static int hf_x411_mta_actual_recipient_name = -1;  /* MTAActualRecipientName */
+static int hf_x411_last_trace_information = -1;   /* LastTraceInformation */
+static int hf_x411_report_originally_intended_recipient_name = -1;  /* MTAOriginallyIntendedRecipientName */
+static int hf_x411_supplementary_information = -1;  /* SupplementaryInformation */
+static int hf_x411_country_name = -1;             /* CountryName */
+static int hf_x411_bilateral_domain = -1;         /* T_domain */
+static int hf_x411_administration_domain_name = -1;  /* AdministrationDomainName */
+static int hf_x411_private_domain = -1;           /* T_private_domain */
+static int hf_x411_private_domain_identifier = -1;  /* PrivateDomainIdentifier */
+static int hf_x411_arrival_time = -1;             /* ArrivalTime */
+static int hf_x411_converted_encoded_information_types = -1;  /* ConvertedEncodedInformationTypes */
+static int hf_x411_trace_report_type = -1;        /* ReportType */
+static int hf_x411_InternalTraceInformation_item = -1;  /* InternalTraceInformationElement */
+static int hf_x411_global_domain_identifier = -1;  /* GlobalDomainIdentifier */
+static int hf_x411_mta_name = -1;                 /* MTAName */
+static int hf_x411_mta_supplied_information = -1;  /* MTASuppliedInformation */
+static int hf_x411_routing_action = -1;           /* RoutingAction */
+static int hf_x411_attempted = -1;                /* T_attempted */
+static int hf_x411_mta = -1;                      /* MTAName */
+static int hf_x411_domain = -1;                   /* GlobalDomainIdentifier */
+static int hf_x411_deferred_time = -1;            /* DeferredTime */
+static int hf_x411_other_actions = -1;            /* OtherActions */
+static int hf_x411_TraceInformation_item = -1;    /* TraceInformationElement */
+static int hf_x411_domain_supplied_information = -1;  /* DomainSuppliedInformation */
+static int hf_x411_attempted_domain = -1;         /* GlobalDomainIdentifier */
+static int hf_x411_initiator_name = -1;           /* ObjectName */
+static int hf_x411_messages_waiting = -1;         /* MessagesWaiting */
+static int hf_x411_responder_name = -1;           /* ObjectName */
+static int hf_x411_user_agent = -1;               /* ORAddressAndOptionalDirectoryName */
+static int hf_x411_mTA = -1;                      /* MTAName */
+static int hf_x411_message_store = -1;            /* ORAddressAndOptionalDirectoryName */
+static int hf_x411_urgent = -1;                   /* DeliveryQueue */
+static int hf_x411_normal = -1;                   /* DeliveryQueue */
+static int hf_x411_non_urgent = -1;               /* DeliveryQueue */
+static int hf_x411_messages = -1;                 /* INTEGER */
+static int hf_x411_delivery_queue_octets = -1;    /* INTEGER */
+static int hf_x411_simple = -1;                   /* Password */
+static int hf_x411_ia5_string = -1;               /* IA5String */
+static int hf_x411_octet_string = -1;             /* OCTET_STRING */
+static int hf_x411_SecurityContext_item = -1;     /* SecurityLabel */
+static int hf_x411_message_submission_envelope = -1;  /* MessageSubmissionEnvelope */
+static int hf_x411_message_submission_identifier = -1;  /* MessageSubmissionIdentifier */
+static int hf_x411_message_submission_time = -1;  /* MessageSubmissionTime */
+static int hf_x411_probe_submission_identifier = -1;  /* ProbeSubmissionIdentifier */
+static int hf_x411_probe_submission_time = -1;    /* ProbeSubmissionTime */
+static int hf_x411_ImproperlySpecifiedRecipients_item = -1;  /* MTSRecipientName */
+static int hf_x411_waiting_operations = -1;       /* Operations */
+static int hf_x411_waiting_messages = -1;         /* WaitingMessages */
+static int hf_x411_waiting_content_types = -1;    /* SET_OF_ContentType */
+static int hf_x411_waiting_content_types_item = -1;  /* ContentType */
+static int hf_x411_waiting_encoded_information_types = -1;  /* EncodedInformationTypes */
+static int hf_x411_message_delivery_identifier = -1;  /* MessageDeliveryIdentifier */
+static int hf_x411_message_delivery_time = -1;    /* MessageDeliveryTime */
+static int hf_x411_other_fields = -1;             /* OtherMessageDeliveryFields */
+static int hf_x411_recipient_certificate = -1;    /* RecipientCertificate */
+static int hf_x411_subject_submission_identifier = -1;  /* SubjectSubmissionIdentifier */
+static int hf_x411_per_recipient_report_delivery_fields = -1;  /* SEQUENCE_OF_PerRecipientReportDeliveryFields */
+static int hf_x411_per_recipient_report_delivery_fields_item = -1;  /* PerRecipientReportDeliveryFields */
+static int hf_x411_empty_result = -1;             /* NULL */
+static int hf_x411_restrict = -1;                 /* BOOLEAN */
+static int hf_x411_permissible_operations = -1;   /* Operations */
+static int hf_x411_permissible_maximum_content_length = -1;  /* ContentLength */
+static int hf_x411_permissible_lowest_priority = -1;  /* Priority */
+static int hf_x411_permissible_content_types = -1;  /* ContentTypes */
+static int hf_x411_permissible_encoded_information_types = -1;  /* PermissibleEncodedInformationTypes */
+static int hf_x411_permissible_security_context = -1;  /* SecurityContext */
+static int hf_x411_refused_argument = -1;         /* T_refused_argument */
+static int hf_x411_built_in_argument = -1;        /* RefusedArgument */
+static int hf_x411_refused_extension = -1;        /* T_refused_extension */
+static int hf_x411_refusal_reason = -1;           /* RefusalReason */
+static int hf_x411_user_name = -1;                /* UserName */
+static int hf_x411_user_address = -1;             /* UserAddress */
+static int hf_x411_deliverable_class = -1;        /* SET_OF_DeliverableClass */
+static int hf_x411_deliverable_class_item = -1;   /* DeliverableClass */
+static int hf_x411_default_delivery_controls = -1;  /* DefaultDeliveryControls */
+static int hf_x411_redirections = -1;             /* Redirections */
+static int hf_x411_restricted_delivery = -1;      /* RestrictedDelivery */
+static int hf_x411_retrieve_registrations = -1;   /* RegistrationTypes */
+static int hf_x411_non_empty_result = -1;         /* T_non_empty_result */
+static int hf_x411_registered_information = -1;   /* RegisterArgument */
+static int hf_x411_old_credentials = -1;          /* Credentials */
+static int hf_x411_new_credentials = -1;          /* Credentials */
+static int hf_x411_x121 = -1;                     /* T_x121 */
+static int hf_x411_x121_address = -1;             /* NumericString */
+static int hf_x411_tsap_id = -1;                  /* PrintableString */
+static int hf_x411_presentation = -1;             /* PSAPAddress */
+static int hf_x411_Redirections_item = -1;        /* RecipientRedirection */
+static int hf_x411_redirection_classes = -1;      /* SET_OF_RedirectionClass */
+static int hf_x411_redirection_classes_item = -1;  /* RedirectionClass */
+static int hf_x411_recipient_assigned_alternate_recipient = -1;  /* RecipientAssignedAlternateRecipient */
+static int hf_x411_content_types = -1;            /* ContentTypes */
+static int hf_x411_maximum_content_length = -1;   /* ContentLength */
+static int hf_x411_encoded_information_types_constraints = -1;  /* EncodedInformationTypesConstraints */
+static int hf_x411_security_labels = -1;          /* SecurityContext */
+static int hf_x411_class_priority = -1;           /* SET_OF_Priority */
+static int hf_x411_priority_item = -1;            /* Priority */
+static int hf_x411_objects = -1;                  /* T_objects */
+static int hf_x411_applies_only_to = -1;          /* SEQUENCE_OF_Restriction */
+static int hf_x411_applies_only_to_item = -1;     /* Restriction */
+static int hf_x411_unacceptable_eits = -1;        /* ExtendedEncodedInformationTypes */
+static int hf_x411_acceptable_eits = -1;          /* ExtendedEncodedInformationTypes */
+static int hf_x411_exclusively_acceptable_eits = -1;  /* ExtendedEncodedInformationTypes */
+static int hf_x411_RestrictedDelivery_item = -1;  /* Restriction */
+static int hf_x411_permitted = -1;                /* BOOLEAN */
+static int hf_x411_source_type = -1;              /* T_source_type */
+static int hf_x411_source_name = -1;              /* ExactOrPattern */
+static int hf_x411_exact_match = -1;              /* ORName */
+static int hf_x411_pattern_match = -1;            /* ORName */
+static int hf_x411_standard_parameters = -1;      /* T_standard_parameters */
+static int hf_x411_type_extensions = -1;          /* T_extensions */
+static int hf_x411_type_extensions_item = -1;     /* T_extensions_item */
+static int hf_x411_mts_originator_name = -1;      /* MTSOriginatorName */
+static int hf_x411_per_recipient_message_submission_fields = -1;  /* SEQUENCE_OF_PerRecipientMessageSubmissionFields */
+static int hf_x411_per_recipient_message_submission_fields_item = -1;  /* PerRecipientMessageSubmissionFields */
+static int hf_x411_submission_recipient_name = -1;  /* MTSRecipientName */
+static int hf_x411_originator_report_request = -1;  /* OriginatorReportRequest */
+static int hf_x411_per_recipient_probe_submission_fields = -1;  /* SEQUENCE_OF_PerRecipientProbeSubmissionFields */
+static int hf_x411_per_recipient_probe_submission_fields_item = -1;  /* PerRecipientProbeSubmissionFields */
+static int hf_x411_probe_recipient_name = -1;     /* MTSRecipientName */
+static int hf_x411_delivered_content_type = -1;   /* DeliveredContentType */
+static int hf_x411_originator_name = -1;          /* DeliveredOriginatorName */
+static int hf_x411_delivery_flags = -1;           /* DeliveryFlags */
+static int hf_x411_other_recipient_names = -1;    /* OtherRecipientNames */
+static int hf_x411_this_recipient_name = -1;      /* ThisRecipientName */
+static int hf_x411_originally_intended_recipient_name = -1;  /* MTSOriginallyIntendedRecipientName */
+static int hf_x411_actual_recipient_name = -1;    /* MTSActualRecipientName */
+static int hf_x411_delivery_report_type = -1;     /* ReportType */
+static int hf_x411_delivery = -1;                 /* DeliveryReport */
+static int hf_x411_non_delivery = -1;             /* NonDeliveryReport */
+static int hf_x411_type_of_MTS_user = -1;         /* TypeOfMTSUser */
+static int hf_x411_non_delivery_reason_code = -1;  /* NonDeliveryReasonCode */
+static int hf_x411_non_delivery_diagnostic_code = -1;  /* NonDeliveryDiagnosticCode */
+static int hf_x411_ContentTypes_item = -1;        /* ContentType */
+static int hf_x411_built_in = -1;                 /* BuiltInContentType */
+static int hf_x411_extended = -1;                 /* ExtendedContentType */
+static int hf_x411_OtherRecipientNames_item = -1;  /* OtherRecipientName */
+static int hf_x411_standard_extension = -1;       /* INTEGER */
+static int hf_x411_private_extension = -1;        /* OBJECT_IDENTIFIER */
+static int hf_x411_extension_type = -1;           /* ExtensionType */
+static int hf_x411_criticality = -1;              /* Criticality */
+static int hf_x411_extension_value = -1;          /* ExtensionValue */
+static int hf_x411_RequestedDeliveryMethod_item = -1;  /* RequestedDeliveryMethod_item */
+static int hf_x411_ia5text = -1;                  /* IA5String */
+static int hf_x411_octets = -1;                   /* OCTET_STRING */
+static int hf_x411_RedirectionHistory_item = -1;  /* Redirection */
+static int hf_x411_intended_recipient_name = -1;  /* IntendedRecipientName */
+static int hf_x411_redirection_reason = -1;       /* RedirectionReason */
+static int hf_x411_intended_recipient = -1;       /* ORAddressAndOptionalDirectoryName */
+static int hf_x411_redirection_time = -1;         /* Time */
+static int hf_x411_DLExpansionHistory_item = -1;  /* DLExpansion */
+static int hf_x411_dl = -1;                       /* ORAddressAndOptionalDirectoryName */
+static int hf_x411_dl_expansion_time = -1;        /* Time */
+static int hf_x411_OriginatorAndDLExpansionHistory_item = -1;  /* OriginatorAndDLExpansion */
+static int hf_x411_originator_or_dl_name = -1;    /* ORAddressAndOptionalDirectoryName */
+static int hf_x411_origination_or_expansion_time = -1;  /* Time */
+static int hf_x411_report_type = -1;              /* T_report_type */
+static int hf_x411_report_type_delivery = -1;     /* PerRecipientDeliveryReportFields */
+static int hf_x411_non_delivery_report = -1;      /* PerRecipientNonDeliveryReportFields */
+static int hf_x411_mta_directory_name = -1;       /* Name */
+static int hf_x411_ExtendedCertificates_item = -1;  /* ExtendedCertificate */
+static int hf_x411_directory_entry = -1;          /* Name */
+static int hf_x411_certificate = -1;              /* Certificates */
+static int hf_x411_DLExemptedRecipients_item = -1;  /* ORAddressAndOrDirectoryName */
+static int hf_x411_encryption_recipient = -1;     /* CertificateAssertion */
+static int hf_x411_encryption_originator = -1;    /* CertificateAssertion */
+static int hf_x411_content_integrity_check = -1;  /* CertificateAssertion */
+static int hf_x411_token_signature = -1;          /* CertificateAssertion */
+static int hf_x411_message_origin_authentication = -1;  /* CertificateAssertion */
+static int hf_x411_local_identifier = -1;         /* LocalIdentifier */
+static int hf_x411_numeric = -1;                  /* NumericString */
+static int hf_x411_printable = -1;                /* PrintableString */
+static int hf_x411_built_in_standard_attributes = -1;  /* BuiltInStandardAttributes */
+static int hf_x411_built_in_domain_defined_attributes = -1;  /* BuiltInDomainDefinedAttributes */
+static int hf_x411_extension_attributes = -1;     /* ExtensionAttributes */
+static int hf_x411_directory_name = -1;           /* Name */
+static int hf_x411_network_address = -1;          /* NetworkAddress */
+static int hf_x411_terminal_identifier = -1;      /* TerminalIdentifier */
+static int hf_x411_private_domain_name = -1;      /* PrivateDomainName */
+static int hf_x411_organization_name = -1;        /* OrganizationName */
+static int hf_x411_numeric_user_identifier = -1;  /* NumericUserIdentifier */
+static int hf_x411_personal_name = -1;            /* PersonalName */
+static int hf_x411_organizational_unit_names = -1;  /* OrganizationalUnitNames */
+static int hf_x411_x121_dcc_code = -1;            /* NumericString */
+static int hf_x411_iso_3166_alpha2_code = -1;     /* PrintableString */
+static int hf_x411_printable_surname = -1;        /* PrintableString */
+static int hf_x411_printable_given_name = -1;     /* PrintableString */
+static int hf_x411_printable_initials = -1;       /* PrintableString */
+static int hf_x411_printable_generation_qualifier = -1;  /* PrintableString */
+static int hf_x411_OrganizationalUnitNames_item = -1;  /* OrganizationalUnitName */
+static int hf_x411_BuiltInDomainDefinedAttributes_item = -1;  /* BuiltInDomainDefinedAttribute */
+static int hf_x411_printable_type = -1;           /* PrintableString */
+static int hf_x411_printable_value = -1;          /* PrintableString */
+static int hf_x411_ExtensionAttributes_item = -1;  /* ExtensionAttribute */
+static int hf_x411_extension_attribute_type = -1;  /* INTEGER */
+static int hf_x411_extension_attribute_value = -1;  /* T_extension_attribute_value */
+static int hf_x411_teletex_surname = -1;          /* TeletexString */
+static int hf_x411_teletex_given_name = -1;       /* TeletexString */
+static int hf_x411_teletex_initials = -1;         /* TeletexString */
+static int hf_x411_teletex_generation_qualifier = -1;  /* TeletexString */
+static int hf_x411_universal_surname = -1;        /* UniversalOrBMPString */
+static int hf_x411_universal_given_name = -1;     /* UniversalOrBMPString */
+static int hf_x411_universal_initials = -1;       /* UniversalOrBMPString */
+static int hf_x411_universal_generation_qualifier = -1;  /* UniversalOrBMPString */
+static int hf_x411_TeletexOrganizationalUnitNames_item = -1;  /* TeletexOrganizationalUnitName */
+static int hf_x411_UniversalOrganizationalUnitNames_item = -1;  /* UniversalOrganizationalUnitName */
+static int hf_x411_character_encoding = -1;       /* T_character_encoding */
+static int hf_x411_two_octets = -1;               /* BMPString */
+static int hf_x411_four_octets = -1;              /* UniversalString */
+static int hf_x411_iso_639_language_code = -1;    /* PrintableString */
+static int hf_x411_numeric_code = -1;             /* NumericString */
+static int hf_x411_printable_code = -1;           /* PrintableString */
+static int hf_x411_printable_address = -1;        /* T_printable_address */
+static int hf_x411_printable_address_item = -1;   /* PrintableString */
+static int hf_x411_teletex_string = -1;           /* TeletexString */
+static int hf_x411_printable_string = -1;         /* PrintableString */
+static int hf_x411_e163_4_address = -1;           /* T_e163_4_address */
+static int hf_x411_number = -1;                   /* NumericString */
+static int hf_x411_sub_address = -1;              /* NumericString */
+static int hf_x411_psap_address = -1;             /* PresentationAddress */
+static int hf_x411_TeletexDomainDefinedAttributes_item = -1;  /* TeletexDomainDefinedAttribute */
+static int hf_x411_type = -1;                     /* TeletexString */
+static int hf_x411_teletex_value = -1;            /* TeletexString */
+static int hf_x411_UniversalDomainDefinedAttributes_item = -1;  /* UniversalDomainDefinedAttribute */
+static int hf_x411_universal_type = -1;           /* UniversalOrBMPString */
+static int hf_x411_universal_value = -1;          /* UniversalOrBMPString */
+static int hf_x411_built_in_encoded_information_types = -1;  /* BuiltInEncodedInformationTypes */
+static int hf_x411_g3_facsimile = -1;             /* G3FacsimileNonBasicParameters */
+static int hf_x411_teletex = -1;                  /* TeletexNonBasicParameters */
+static int hf_x411_extended_encoded_information_types = -1;  /* ExtendedEncodedInformationTypes */
+static int hf_x411_ExtendedEncodedInformationTypes_item = -1;  /* ExtendedEncodedInformationType */
+static int hf_x411_graphic_character_sets = -1;   /* TeletexString */
+static int hf_x411_control_character_sets = -1;   /* TeletexString */
+static int hf_x411_page_formats = -1;             /* OCTET_STRING */
+static int hf_x411_miscellaneous_terminal_capabilities = -1;  /* TeletexString */
+static int hf_x411_private_use = -1;              /* OCTET_STRING */
+static int hf_x411_security_policy_identifier = -1;  /* SecurityPolicyIdentifier */
+static int hf_x411_security_classification = -1;  /* SecurityClassification */
+static int hf_x411_privacy_mark = -1;             /* PrivacyMark */
+static int hf_x411_security_categories = -1;      /* SecurityCategories */
+static int hf_x411_SecurityCategories_item = -1;  /* SecurityCategory */
+static int hf_x411_category_type = -1;            /* OBJECT_IDENTIFIER */
+static int hf_x411_category_value = -1;           /* CategoryValue */
+/* named bits */
+static int hf_x411_PerRecipientIndicators_responsibility = -1;
+static int hf_x411_PerRecipientIndicators_originating_MTA_report = -1;
+static int hf_x411_PerRecipientIndicators_originating_MTA_non_delivery_report = -1;
+static int hf_x411_PerRecipientIndicators_originator_report = -1;
+static int hf_x411_PerRecipientIndicators_originator_non_delivery_report = -1;
+static int hf_x411_PerRecipientIndicators_reserved_5 = -1;
+static int hf_x411_PerRecipientIndicators_reserved_6 = -1;
+static int hf_x411_PerRecipientIndicators_reserved_7 = -1;
+static int hf_x411_OtherActions_redirected = -1;
+static int hf_x411_OtherActions_dl_operation = -1;
+static int hf_x411_Operations_probe_submission_or_report_delivery = -1;
+static int hf_x411_Operations_message_submission_or_message_delivery = -1;
+static int hf_x411_WaitingMessages_long_content = -1;
+static int hf_x411_WaitingMessages_low_priority = -1;
+static int hf_x411_WaitingMessages_other_security_labels = -1;
+static int hf_x411_T_source_type_originated_by = -1;
+static int hf_x411_T_source_type_redirected_by = -1;
+static int hf_x411_T_source_type_dl_expanded_by = -1;
+static int hf_x411_T_standard_parameters_user_name = -1;
+static int hf_x411_T_standard_parameters_user_address = -1;
+static int hf_x411_T_standard_parameters_deliverable_class = -1;
+static int hf_x411_T_standard_parameters_default_delivery_controls = -1;
+static int hf_x411_T_standard_parameters_redirections = -1;
+static int hf_x411_T_standard_parameters_restricted_delivery = -1;
+static int hf_x411_PerMessageIndicators_disclosure_of_other_recipients = -1;
+static int hf_x411_PerMessageIndicators_implicit_conversion_prohibited = -1;
+static int hf_x411_PerMessageIndicators_alternate_recipient_allowed = -1;
+static int hf_x411_PerMessageIndicators_content_return_request = -1;
+static int hf_x411_PerMessageIndicators_reserved = -1;
+static int hf_x411_PerMessageIndicators_bit_5 = -1;
+static int hf_x411_PerMessageIndicators_bit_6 = -1;
+static int hf_x411_PerMessageIndicators_service_message = -1;
+static int hf_x411_OriginatorReportRequest_report = -1;
+static int hf_x411_OriginatorReportRequest_non_delivery_report = -1;
+static int hf_x411_DeliveryFlags_implicit_conversion_prohibited = -1;
+static int hf_x411_Criticality_for_submission = -1;
+static int hf_x411_Criticality_for_transfer = -1;
+static int hf_x411_Criticality_for_delivery = -1;
+static int hf_x411_PhysicalDeliveryModes_ordinary_mail = -1;
+static int hf_x411_PhysicalDeliveryModes_special_delivery = -1;
+static int hf_x411_PhysicalDeliveryModes_express_mail = -1;
+static int hf_x411_PhysicalDeliveryModes_counter_collection = -1;
+static int hf_x411_PhysicalDeliveryModes_counter_collection_with_telephone_advice = -1;
+static int hf_x411_PhysicalDeliveryModes_counter_collection_with_telex_advice = -1;
+static int hf_x411_PhysicalDeliveryModes_counter_collection_with_teletex_advice = -1;
+static int hf_x411_PhysicalDeliveryModes_bureau_fax_delivery = -1;
+static int hf_x411_BuiltInEncodedInformationTypes_unknown = -1;
+static int hf_x411_BuiltInEncodedInformationTypes_ia5_text = -1;
+static int hf_x411_BuiltInEncodedInformationTypes_g3_facsimile = -1;
+static int hf_x411_BuiltInEncodedInformationTypes_g4_class_1 = -1;
+static int hf_x411_BuiltInEncodedInformationTypes_teletex = -1;
+static int hf_x411_BuiltInEncodedInformationTypes_videotex = -1;
+static int hf_x411_BuiltInEncodedInformationTypes_voice = -1;
+static int hf_x411_BuiltInEncodedInformationTypes_sfd = -1;
+static int hf_x411_BuiltInEncodedInformationTypes_mixed_mode = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_two_dimensional = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_fine_resolution = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_unlimited_length = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_b4_length = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_a3_width = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_b4_width = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_t6_coding = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_uncompressed = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_width_middle_864_of_1728 = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_width_middle_1216_of_1728 = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_resolution_type = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_resolution_400x400 = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_resolution_300x300 = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_resolution_8x15 = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_edi = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_dtm = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_bft = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_mixed_mode = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_character_mode = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_twelve_bits = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_preferred_huffmann = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_full_colour = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_jpeg = -1;
+static int hf_x411_G3FacsimileNonBasicParameters_processable_mode_26 = -1;
+
+/*--- End of included file: packet-x411-hf.c ---*/
+
+
+/* Initialize the subtree pointers */
+static gint ett_x411 = -1;
+
+/*--- Included file: packet-x411-ett.c ---*/
+
+static gint ett_x411_MTABindArgument = -1;
+static gint ett_x411_AuthenticatedArgument = -1;
+static gint ett_x411_MTABindResult = -1;
+static gint ett_x411_AuthenticatedResult = -1;
+static gint ett_x411_MTS_APDU = -1;
+static gint ett_x411_Message = -1;
+static gint ett_x411_Report = -1;
+static gint ett_x411_MessageTransferEnvelope = -1;
+static gint ett_x411_SEQUENCE_OF_PerDomainBilateralInformation = -1;
+static gint ett_x411_SET_OF_ExtensionField = -1;
+static gint ett_x411_SEQUENCE_OF_PerRecipientMessageTransferFields = -1;
+static gint ett_x411_PerRecipientMessageTransferFields = -1;
+static gint ett_x411_ProbeTransferEnvelope = -1;
+static gint ett_x411_SEQUENCE_OF_PerRecipientProbeTransferFields = -1;
+static gint ett_x411_PerRecipientProbeTransferFields = -1;
+static gint ett_x411_ReportTransferEnvelope = -1;
+static gint ett_x411_ReportTransferContent = -1;
+static gint ett_x411_SEQUENCE_OF_PerRecipientReportTransferFields = -1;
+static gint ett_x411_PerRecipientReportTransferFields = -1;
+static gint ett_x411_PerDomainBilateralInformation = -1;
+static gint ett_x411_T_domain = -1;
+static gint ett_x411_T_private_domain = -1;
+static gint ett_x411_PerRecipientIndicators = -1;
+static gint ett_x411_LastTraceInformation = -1;
+static gint ett_x411_InternalTraceInformation = -1;
+static gint ett_x411_InternalTraceInformationElement = -1;
+static gint ett_x411_MTASuppliedInformation = -1;
+static gint ett_x411_T_attempted = -1;
+static gint ett_x411_TraceInformation = -1;
+static gint ett_x411_TraceInformationElement = -1;
+static gint ett_x411_DomainSuppliedInformation = -1;
+static gint ett_x411_OtherActions = -1;
+static gint ett_x411_MTSBindArgument = -1;
+static gint ett_x411_MTSBindResult = -1;
+static gint ett_x411_ObjectName = -1;
+static gint ett_x411_MessagesWaiting = -1;
+static gint ett_x411_DeliveryQueue = -1;
+static gint ett_x411_Credentials = -1;
+static gint ett_x411_Password = -1;
+static gint ett_x411_SecurityContext = -1;
+static gint ett_x411_MessageSubmissionArgument = -1;
+static gint ett_x411_MessageSubmissionResult = -1;
+static gint ett_x411_ProbeSubmissionResult = -1;
+static gint ett_x411_ImproperlySpecifiedRecipients = -1;
+static gint ett_x411_Waiting = -1;
+static gint ett_x411_SET_OF_ContentType = -1;
+static gint ett_x411_Operations = -1;
+static gint ett_x411_WaitingMessages = -1;
+static gint ett_x411_MessageDeliveryArgument = -1;
+static gint ett_x411_MessageDeliveryResult = -1;
+static gint ett_x411_ReportDeliveryArgument = -1;
+static gint ett_x411_SEQUENCE_OF_PerRecipientReportDeliveryFields = -1;
+static gint ett_x411_ReportDeliveryResult = -1;
+static gint ett_x411_DeliveryControlArgument = -1;
+static gint ett_x411_DeliveryControlResult = -1;
+static gint ett_x411_RefusedOperation = -1;
+static gint ett_x411_T_refused_argument = -1;
+static gint ett_x411_Controls = -1;
+static gint ett_x411_RegisterArgument = -1;
+static gint ett_x411_SET_OF_DeliverableClass = -1;
+static gint ett_x411_RegisterResult = -1;
+static gint ett_x411_T_non_empty_result = -1;
+static gint ett_x411_ChangeCredentialsArgument = -1;
+static gint ett_x411_UserAddress = -1;
+static gint ett_x411_T_x121 = -1;
+static gint ett_x411_Redirections = -1;
+static gint ett_x411_RecipientRedirection = -1;
+static gint ett_x411_SET_OF_RedirectionClass = -1;
+static gint ett_x411_MessageClass = -1;
+static gint ett_x411_SET_OF_Priority = -1;
+static gint ett_x411_SEQUENCE_OF_Restriction = -1;
+static gint ett_x411_EncodedInformationTypesConstraints = -1;
+static gint ett_x411_RestrictedDelivery = -1;
+static gint ett_x411_Restriction = -1;
+static gint ett_x411_T_source_type = -1;
+static gint ett_x411_ExactOrPattern = -1;
+static gint ett_x411_RegistrationTypes = -1;
+static gint ett_x411_T_standard_parameters = -1;
+static gint ett_x411_T_extensions = -1;
+static gint ett_x411_MessageSubmissionEnvelope = -1;
+static gint ett_x411_SEQUENCE_OF_PerRecipientMessageSubmissionFields = -1;
+static gint ett_x411_PerRecipientMessageSubmissionFields = -1;
+static gint ett_x411_ProbeSubmissionEnvelope = -1;
+static gint ett_x411_SEQUENCE_OF_PerRecipientProbeSubmissionFields = -1;
+static gint ett_x411_PerRecipientProbeSubmissionFields = -1;
+static gint ett_x411_MessageDeliveryEnvelope = -1;
+static gint ett_x411_OtherMessageDeliveryFields = -1;
+static gint ett_x411_ReportDeliveryEnvelope = -1;
+static gint ett_x411_PerRecipientReportDeliveryFields = -1;
+static gint ett_x411_ReportType = -1;
+static gint ett_x411_DeliveryReport = -1;
+static gint ett_x411_NonDeliveryReport = -1;
+static gint ett_x411_ContentTypes = -1;
+static gint ett_x411_ContentType = -1;
+static gint ett_x411_DeliveredContentType = -1;
+static gint ett_x411_PerMessageIndicators = -1;
+static gint ett_x411_OriginatorReportRequest = -1;
+static gint ett_x411_DeliveryFlags = -1;
+static gint ett_x411_OtherRecipientNames = -1;
+static gint ett_x411_ExtensionType = -1;
+static gint ett_x411_Criticality = -1;
+static gint ett_x411_ExtensionField = -1;
+static gint ett_x411_RequestedDeliveryMethod = -1;
+static gint ett_x411_PhysicalDeliveryModes = -1;
+static gint ett_x411_ContentCorrelator = -1;
+static gint ett_x411_RedirectionHistory = -1;
+static gint ett_x411_Redirection = -1;
+static gint ett_x411_IntendedRecipientName = -1;
+static gint ett_x411_DLExpansionHistory = -1;
+static gint ett_x411_DLExpansion = -1;
+static gint ett_x411_OriginatorAndDLExpansionHistory = -1;
+static gint ett_x411_OriginatorAndDLExpansion = -1;
+static gint ett_x411_PerRecipientReportFields = -1;
+static gint ett_x411_T_report_type = -1;
+static gint ett_x411_PerRecipientDeliveryReportFields = -1;
+static gint ett_x411_PerRecipientNonDeliveryReportFields = -1;
+static gint ett_x411_ReportingMTAName = -1;
+static gint ett_x411_ExtendedCertificates = -1;
+static gint ett_x411_ExtendedCertificate = -1;
+static gint ett_x411_DLExemptedRecipients = -1;
+static gint ett_x411_CertificateSelectors = -1;
+static gint ett_x411_MTSIdentifier = -1;
+static gint ett_x411_GlobalDomainIdentifier = -1;
+static gint ett_x411_PrivateDomainIdentifier = -1;
+static gint ett_x411_ORName = -1;
+static gint ett_x411_ORAddress = -1;
+static gint ett_x411_BuiltInStandardAttributes = -1;
+static gint ett_x411_CountryName = -1;
+static gint ett_x411_AdministrationDomainName = -1;
+static gint ett_x411_PrivateDomainName = -1;
+static gint ett_x411_PersonalName = -1;
+static gint ett_x411_OrganizationalUnitNames = -1;
+static gint ett_x411_BuiltInDomainDefinedAttributes = -1;
+static gint ett_x411_BuiltInDomainDefinedAttribute = -1;
+static gint ett_x411_ExtensionAttributes = -1;
+static gint ett_x411_ExtensionAttribute = -1;
+static gint ett_x411_TeletexPersonalName = -1;
+static gint ett_x411_UniversalPersonalName = -1;
+static gint ett_x411_TeletexOrganizationalUnitNames = -1;
+static gint ett_x411_UniversalOrganizationalUnitNames = -1;
+static gint ett_x411_UniversalOrBMPString = -1;
+static gint ett_x411_T_character_encoding = -1;
+static gint ett_x411_PhysicalDeliveryCountryName = -1;
+static gint ett_x411_PostalCode = -1;
+static gint ett_x411_UnformattedPostalAddress = -1;
+static gint ett_x411_T_printable_address = -1;
+static gint ett_x411_PDSParameter = -1;
+static gint ett_x411_ExtendedNetworkAddress = -1;
+static gint ett_x411_T_e163_4_address = -1;
+static gint ett_x411_TeletexDomainDefinedAttributes = -1;
+static gint ett_x411_TeletexDomainDefinedAttribute = -1;
+static gint ett_x411_UniversalDomainDefinedAttributes = -1;
+static gint ett_x411_UniversalDomainDefinedAttribute = -1;
+static gint ett_x411_EncodedInformationTypes = -1;
+static gint ett_x411_BuiltInEncodedInformationTypes = -1;
+static gint ett_x411_ExtendedEncodedInformationTypes = -1;
+static gint ett_x411_NonBasicParameters = -1;
+static gint ett_x411_G3FacsimileNonBasicParameters = -1;
+static gint ett_x411_TeletexNonBasicParameters = -1;
+static gint ett_x411_SecurityLabel = -1;
+static gint ett_x411_SecurityCategories = -1;
+static gint ett_x411_SecurityCategory = -1;
+
+/*--- End of included file: packet-x411-ett.c ---*/
+
+
+
+/*--- Included file: packet-x411-fn.c ---*/
+
+/*--- Fields for imported types ---*/
+
+static int dissect_mta_directory_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x509if_Name(TRUE, tvb, offset, pinfo, tree, hf_x411_mta_directory_name);
+}
+static int dissect_directory_entry_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x509if_Name(TRUE, tvb, offset, pinfo, tree, hf_x411_directory_entry);
+}
+static int dissect_certificate_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x509af_Certificates(TRUE, tvb, offset, pinfo, tree, hf_x411_certificate);
+}
+static int dissect_encryption_recipient_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x509ce_CertificateAssertion(TRUE, tvb, offset, pinfo, tree, hf_x411_encryption_recipient);
+}
+static int dissect_encryption_originator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x509ce_CertificateAssertion(TRUE, tvb, offset, pinfo, tree, hf_x411_encryption_originator);
+}
+static int dissect_content_integrity_check_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x509ce_CertificateAssertion(TRUE, tvb, offset, pinfo, tree, hf_x411_content_integrity_check);
+}
+static int dissect_token_signature_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x509ce_CertificateAssertion(TRUE, tvb, offset, pinfo, tree, hf_x411_token_signature);
+}
+static int dissect_message_origin_authentication_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x509ce_CertificateAssertion(TRUE, tvb, offset, pinfo, tree, hf_x411_message_origin_authentication);
+}
+static int dissect_directory_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x509if_Name(TRUE, tvb, offset, pinfo, tree, hf_x411_directory_name);
+}
+static int dissect_psap_address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x509sat_PresentationAddress(TRUE, tvb, offset, pinfo, tree, hf_x411_psap_address);
+}
+
+
+
+static int
+dissect_x411_NULL(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_null(implicit_tag, pinfo, tree, tvb, offset, hf_index);
+
+  return offset;
+}
+static int dissect_unauthenticated(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NULL(FALSE, tvb, offset, pinfo, tree, hf_x411_unauthenticated);
+}
+static int dissect_empty_result(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NULL(FALSE, tvb, offset, pinfo, tree, hf_x411_empty_result);
+}
+
+
+
+static int
+dissect_x411_MTAName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_IA5String,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_authenticated_initiator_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTAName(TRUE, tvb, offset, pinfo, tree, hf_x411_authenticated_initiator_name);
+}
+static int dissect_authenticated_responder_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTAName(TRUE, tvb, offset, pinfo, tree, hf_x411_authenticated_responder_name);
+}
+static int dissect_mta_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTAName(FALSE, tvb, offset, pinfo, tree, hf_x411_mta_name);
+}
+static int dissect_mta(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTAName(FALSE, tvb, offset, pinfo, tree, hf_x411_mta);
+}
+static int dissect_mTA_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTAName(TRUE, tvb, offset, pinfo, tree, hf_x411_mTA);
+}
+
+
+
+static int
+dissect_x411_IA5String(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_IA5String,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_ia5_string(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_IA5String(FALSE, tvb, offset, pinfo, tree, hf_x411_ia5_string);
+}
+static int dissect_ia5text(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_IA5String(FALSE, tvb, offset, pinfo, tree, hf_x411_ia5text);
+}
+
+
+
+static int
+dissect_x411_OCTET_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                       NULL);
+
+  return offset;
+}
+static int dissect_octet_string(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OCTET_STRING(FALSE, tvb, offset, pinfo, tree, hf_x411_octet_string);
+}
+static int dissect_octets(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OCTET_STRING(FALSE, tvb, offset, pinfo, tree, hf_x411_octets);
+}
+static int dissect_page_formats_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OCTET_STRING(TRUE, tvb, offset, pinfo, tree, hf_x411_page_formats);
+}
+static int dissect_private_use_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OCTET_STRING(TRUE, tvb, offset, pinfo, tree, hf_x411_private_use);
+}
+
+
+static const value_string x411_Password_vals[] = {
+  {   0, "ia5-string" },
+  {   1, "octet-string" },
+  { 0, NULL }
+};
+
+static const ber_choice_t Password_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_IA5String, BER_FLAGS_NOOWNTAG, dissect_ia5_string },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_octet_string },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_Password(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 Password_choice, hf_index, ett_x411_Password,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_simple(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Password(FALSE, tvb, offset, pinfo, tree, hf_x411_simple);
+}
+
+
+static const value_string x411_Credentials_vals[] = {
+  { -1/*choice*/, "simple" },
+  { 0, NULL }
+};
+
+static const ber_choice_t Credentials_choice[] = {
+  { -1/*choice*/, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG, dissect_simple },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_Credentials(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 Credentials_choice, hf_index, ett_x411_Credentials,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_old_credentials_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Credentials(TRUE, tvb, offset, pinfo, tree, hf_x411_old_credentials);
+}
+static int dissect_new_credentials_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Credentials(TRUE, tvb, offset, pinfo, tree, hf_x411_new_credentials);
+}
+
+
+
+static int
+dissect_x411_InitiatorCredentials(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Credentials(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_initiator_credentials_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_InitiatorCredentials(TRUE, tvb, offset, pinfo, tree, hf_x411_initiator_credentials);
+}
+
+
+
+static int
+dissect_x411_SecurityPolicyIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_security_policy_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityPolicyIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_security_policy_identifier);
+}
+
+
+static const value_string x411_SecurityClassification_vals[] = {
+  {   0, "unmarked" },
+  {   1, "unclassified" },
+  {   2, "restricted" },
+  {   3, "confidential" },
+  {   4, "secret" },
+  {   5, "top-secret" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_SecurityClassification(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_security_classification(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityClassification(FALSE, tvb, offset, pinfo, tree, hf_x411_security_classification);
+}
+
+
+
+static int
+dissect_x411_PrivacyMark(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_PrintableString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_privacy_mark(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrivacyMark(FALSE, tvb, offset, pinfo, tree, hf_x411_privacy_mark);
+}
+
+
+
+static int
+dissect_x411_OBJECT_IDENTIFIER(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_private_extension_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OBJECT_IDENTIFIER(TRUE, tvb, offset, pinfo, tree, hf_x411_private_extension);
+}
+static int dissect_category_type_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OBJECT_IDENTIFIER(TRUE, tvb, offset, pinfo, tree, hf_x411_category_type);
+}
+
+
+
+static int
+dissect_x411_CategoryValue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+
+       offset = dissect_unknown_ber(pinfo, tvb, offset, tree);
+
+
+  return offset;
+}
+static int dissect_category_value_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_CategoryValue(TRUE, tvb, offset, pinfo, tree, hf_x411_category_value);
+}
+
+
+static const ber_sequence_t SecurityCategory_sequence[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_category_type_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_category_value_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_SecurityCategory(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   SecurityCategory_sequence, hf_index, ett_x411_SecurityCategory);
+
+  return offset;
+}
+static int dissect_SecurityCategories_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityCategory(FALSE, tvb, offset, pinfo, tree, hf_x411_SecurityCategories_item);
+}
+
+
+static const ber_sequence_t SecurityCategories_set_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_SecurityCategories_item },
+};
+
+static int
+dissect_x411_SecurityCategories(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
+                                 SecurityCategories_set_of, hf_index, ett_x411_SecurityCategories);
+
+  return offset;
+}
+static int dissect_security_categories(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityCategories(FALSE, tvb, offset, pinfo, tree, hf_x411_security_categories);
+}
+
+
+static const ber_sequence_t SecurityLabel_set[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_security_policy_identifier },
+  { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_security_classification },
+  { BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_privacy_mark },
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_security_categories },
+  { 0, 0, 0, NULL }
+};
+
+int
+dissect_x411_SecurityLabel(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              SecurityLabel_set, hf_index, ett_x411_SecurityLabel);
+
+  return offset;
+}
+static int dissect_SecurityContext_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityLabel(FALSE, tvb, offset, pinfo, tree, hf_x411_SecurityContext_item);
+}
+
+
+static const ber_sequence_t SecurityContext_set_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_SecurityContext_item },
+};
+
+static int
+dissect_x411_SecurityContext(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
+                                 SecurityContext_set_of, hf_index, ett_x411_SecurityContext);
+
+  return offset;
+}
+static int dissect_security_context_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityContext(TRUE, tvb, offset, pinfo, tree, hf_x411_security_context);
+}
+static int dissect_permissible_security_context_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityContext(TRUE, tvb, offset, pinfo, tree, hf_x411_permissible_security_context);
+}
+static int dissect_security_labels_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SecurityContext(TRUE, tvb, offset, pinfo, tree, hf_x411_security_labels);
+}
+
+
+static const ber_sequence_t AuthenticatedArgument_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_authenticated_initiator_name_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_initiator_credentials_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_security_context_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_AuthenticatedArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              AuthenticatedArgument_set, hf_index, ett_x411_AuthenticatedArgument);
+
+  return offset;
+}
+static int dissect_authenticated_argument_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_AuthenticatedArgument(TRUE, tvb, offset, pinfo, tree, hf_x411_authenticated_argument);
+}
+
+
+static const value_string x411_MTABindArgument_vals[] = {
+  {   0, "unauthenticated" },
+  {   1, "authenticated" },
+  { 0, NULL }
+};
+
+static const ber_choice_t MTABindArgument_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_unauthenticated },
+  {   1, BER_CLASS_CON, 1, 0, dissect_authenticated_argument_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MTABindArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 MTABindArgument_choice, hf_index, ett_x411_MTABindArgument,
+                                 NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_ResponderCredentials(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Credentials(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_responder_credentials_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ResponderCredentials(TRUE, tvb, offset, pinfo, tree, hf_x411_responder_credentials);
+}
+
+
+static const ber_sequence_t AuthenticatedResult_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_authenticated_responder_name_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_responder_credentials_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_AuthenticatedResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              AuthenticatedResult_set, hf_index, ett_x411_AuthenticatedResult);
+
+  return offset;
+}
+static int dissect_authenticated_result_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_AuthenticatedResult(TRUE, tvb, offset, pinfo, tree, hf_x411_authenticated_result);
+}
+
+
+static const value_string x411_MTABindResult_vals[] = {
+  {   0, "unauthenticated" },
+  {   1, "authenticated" },
+  { 0, NULL }
+};
+
+static const ber_choice_t MTABindResult_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_unauthenticated },
+  {   1, BER_CLASS_CON, 1, 0, dissect_authenticated_result_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MTABindResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 MTABindResult_choice, hf_index, ett_x411_MTABindResult,
+                                 NULL);
+
+  return offset;
+}
+
+
+static const value_string x411_MTABindError_vals[] = {
+  {   0, "busy" },
+  {   2, "authentication-error" },
+  {   3, "unacceptable-dialogue-mode" },
+  {   4, "unacceptable-security-context" },
+  {   5, "inadequate-association-confidentiality" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_MTABindError(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_NumericString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_NumericString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_x121_address(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NumericString(FALSE, tvb, offset, pinfo, tree, hf_x411_x121_address);
+}
+static int dissect_numeric(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NumericString(FALSE, tvb, offset, pinfo, tree, hf_x411_numeric);
+}
+static int dissect_x121_dcc_code(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NumericString(FALSE, tvb, offset, pinfo, tree, hf_x411_x121_dcc_code);
+}
+static int dissect_numeric_code(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NumericString(FALSE, tvb, offset, pinfo, tree, hf_x411_numeric_code);
+}
+static int dissect_number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NumericString(TRUE, tvb, offset, pinfo, tree, hf_x411_number);
+}
+static int dissect_sub_address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NumericString(TRUE, tvb, offset, pinfo, tree, hf_x411_sub_address);
+}
+
+
+
+static int
+dissect_x411_PrintableString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_PrintableString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_tsap_id(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(FALSE, tvb, offset, pinfo, tree, hf_x411_tsap_id);
+}
+static int dissect_printable(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(FALSE, tvb, offset, pinfo, tree, hf_x411_printable);
+}
+static int dissect_iso_3166_alpha2_code(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(FALSE, tvb, offset, pinfo, tree, hf_x411_iso_3166_alpha2_code);
+}
+static int dissect_printable_surname_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(TRUE, tvb, offset, pinfo, tree, hf_x411_printable_surname);
+}
+static int dissect_printable_given_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(TRUE, tvb, offset, pinfo, tree, hf_x411_printable_given_name);
+}
+static int dissect_printable_initials_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(TRUE, tvb, offset, pinfo, tree, hf_x411_printable_initials);
+}
+static int dissect_printable_generation_qualifier_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(TRUE, tvb, offset, pinfo, tree, hf_x411_printable_generation_qualifier);
+}
+static int dissect_printable_type(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(FALSE, tvb, offset, pinfo, tree, hf_x411_printable_type);
+}
+static int dissect_printable_value(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(FALSE, tvb, offset, pinfo, tree, hf_x411_printable_value);
+}
+static int dissect_iso_639_language_code(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(FALSE, tvb, offset, pinfo, tree, hf_x411_iso_639_language_code);
+}
+static int dissect_printable_code(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(FALSE, tvb, offset, pinfo, tree, hf_x411_printable_code);
+}
+static int dissect_printable_address_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(FALSE, tvb, offset, pinfo, tree, hf_x411_printable_address_item);
+}
+static int dissect_printable_string(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrintableString(FALSE, tvb, offset, pinfo, tree, hf_x411_printable_string);
+}
+
+
+static const value_string x411_CountryName_vals[] = {
+  {   0, "x121-dcc-code" },
+  {   1, "iso-3166-alpha2-code" },
+  { 0, NULL }
+};
+
+static const ber_choice_t CountryName_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_NumericString, BER_FLAGS_NOOWNTAG, dissect_x121_dcc_code },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_iso_3166_alpha2_code },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_CountryName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+ gint8 class;
+ gboolean pc, ind_field;
+ gint32 tag;
+ gint32 len1;
+
+ if(!implicit_tag){
+   /* XXX  asn2eth can not yet handle tagged assignment yes so this
+    * XXX is some conformance file magic to work around that bug
+    */
+    offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
+    offset = get_ber_length(tree, tvb, offset, &len1, &ind_field);
+ }
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                              CountryName_choice, hf_index, ett_x411_CountryName, NULL);
+
+
+  return offset;
+}
+static int dissect_country_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_CountryName(FALSE, tvb, offset, pinfo, tree, hf_x411_country_name);
+}
+
+
+static const value_string x411_AdministrationDomainName_vals[] = {
+  {   0, "numeric" },
+  {   1, "printable" },
+  { 0, NULL }
+};
+
+static const ber_choice_t AdministrationDomainName_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_NumericString, BER_FLAGS_NOOWNTAG, dissect_numeric },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_printable },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_AdministrationDomainName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+ gint8 class;
+ gboolean pc, ind_field;
+ gint32 tag;
+ gint32 len1;
+
+ if(!implicit_tag){
+   /* XXX  asn2eth can not yet handle tagged assignment yes so this
+    * XXX is some conformance file magic to work around that bug
+    */
+    offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
+    offset = get_ber_length(tree, tvb, offset, &len1, &ind_field);
+ }
+
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                              AdministrationDomainName_choice, hf_index, ett_x411_AdministrationDomainName, NULL);
+
+
+  return offset;
+}
+static int dissect_administration_domain_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_AdministrationDomainName(FALSE, tvb, offset, pinfo, tree, hf_x411_administration_domain_name);
+}
+static int dissect_administration_domain_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_AdministrationDomainName(TRUE, tvb, offset, pinfo, tree, hf_x411_administration_domain_name);
+}
+
+
+static const value_string x411_PrivateDomainIdentifier_vals[] = {
+  {   0, "numeric" },
+  {   1, "printable" },
+  { 0, NULL }
+};
+
+static const ber_choice_t PrivateDomainIdentifier_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_NumericString, BER_FLAGS_NOOWNTAG, dissect_numeric },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_printable },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_PrivateDomainIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 PrivateDomainIdentifier_choice, hf_index, ett_x411_PrivateDomainIdentifier,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_private_domain_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrivateDomainIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_private_domain_identifier);
+}
+static int dissect_private_domain_identifier_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrivateDomainIdentifier(TRUE, tvb, offset, pinfo, tree, hf_x411_private_domain_identifier);
+}
+
+
+static const ber_sequence_t GlobalDomainIdentifier_sequence[] = {
+  { BER_CLASS_APP, 1, BER_FLAGS_NOOWNTAG, dissect_country_name },
+  { BER_CLASS_APP, 2, BER_FLAGS_NOOWNTAG, dissect_administration_domain_name },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_private_domain_identifier },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_GlobalDomainIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   GlobalDomainIdentifier_sequence, hf_index, ett_x411_GlobalDomainIdentifier);
+
+  return offset;
+}
+static int dissect_global_domain_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_GlobalDomainIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_global_domain_identifier);
+}
+static int dissect_domain(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_GlobalDomainIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_domain);
+}
+static int dissect_attempted_domain(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_GlobalDomainIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_attempted_domain);
+}
+
+
+
+static int
+dissect_x411_LocalIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_IA5String,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_local_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_LocalIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_local_identifier);
+}
+
+
+static const ber_sequence_t MTSIdentifier_sequence[] = {
+  { BER_CLASS_APP, 3, BER_FLAGS_NOOWNTAG, dissect_global_domain_identifier },
+  { BER_CLASS_UNI, BER_UNI_TAG_IA5String, BER_FLAGS_NOOWNTAG, dissect_local_identifier },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MTSIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   MTSIdentifier_sequence, hf_index, ett_x411_MTSIdentifier);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_MessageIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MTSIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_message_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MessageIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_message_identifier);
+}
+
+
+
+static int
+dissect_x411_X121Address(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_NumericString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_NetworkAddress(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_X121Address(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_network_address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NetworkAddress(TRUE, tvb, offset, pinfo, tree, hf_x411_network_address);
+}
+
+
+
+static int
+dissect_x411_TerminalIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_PrintableString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_terminal_identifier_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TerminalIdentifier(TRUE, tvb, offset, pinfo, tree, hf_x411_terminal_identifier);
+}
+
+
+static const value_string x411_PrivateDomainName_vals[] = {
+  {   0, "numeric" },
+  {   1, "printable" },
+  { 0, NULL }
+};
+
+static const ber_choice_t PrivateDomainName_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_NumericString, BER_FLAGS_NOOWNTAG, dissect_numeric },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_printable },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_PrivateDomainName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 PrivateDomainName_choice, hf_index, ett_x411_PrivateDomainName,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_private_domain_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PrivateDomainName(TRUE, tvb, offset, pinfo, tree, hf_x411_private_domain_name);
+}
+
+
+
+static int
+dissect_x411_OrganizationName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_PrintableString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_organization_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OrganizationName(TRUE, tvb, offset, pinfo, tree, hf_x411_organization_name);
+}
+
+
+
+static int
+dissect_x411_NumericUserIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_NumericString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_numeric_user_identifier_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NumericUserIdentifier(TRUE, tvb, offset, pinfo, tree, hf_x411_numeric_user_identifier);
+}
+
+
+static const ber_sequence_t PersonalName_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_printable_surname_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_printable_given_name_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_printable_initials_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_printable_generation_qualifier_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_PersonalName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              PersonalName_set, hf_index, ett_x411_PersonalName);
+
+  return offset;
+}
+static int dissect_personal_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PersonalName(TRUE, tvb, offset, pinfo, tree, hf_x411_personal_name);
+}
+
+
+
+static int
+dissect_x411_OrganizationalUnitName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_PrintableString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_OrganizationalUnitNames_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OrganizationalUnitName(FALSE, tvb, offset, pinfo, tree, hf_x411_OrganizationalUnitNames_item);
+}
+
+
+static const ber_sequence_t OrganizationalUnitNames_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_OrganizationalUnitNames_item },
+};
+
+static int
+dissect_x411_OrganizationalUnitNames(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      OrganizationalUnitNames_sequence_of, hf_index, ett_x411_OrganizationalUnitNames);
+
+  return offset;
+}
+static int dissect_organizational_unit_names_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OrganizationalUnitNames(TRUE, tvb, offset, pinfo, tree, hf_x411_organizational_unit_names);
+}
+
+
+static const ber_sequence_t BuiltInStandardAttributes_sequence[] = {
+  { BER_CLASS_APP, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_country_name },
+  { BER_CLASS_APP, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_administration_domain_name },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_network_address_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_terminal_identifier_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_private_domain_name_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_organization_name_impl },
+  { BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_numeric_user_identifier_impl },
+  { BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_personal_name_impl },
+  { BER_CLASS_CON, 6, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_organizational_unit_names_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_BuiltInStandardAttributes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   BuiltInStandardAttributes_sequence, hf_index, ett_x411_BuiltInStandardAttributes);
+
+  return offset;
+}
+static int dissect_built_in_standard_attributes(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_BuiltInStandardAttributes(FALSE, tvb, offset, pinfo, tree, hf_x411_built_in_standard_attributes);
+}
+
+
+static const ber_sequence_t BuiltInDomainDefinedAttribute_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_printable_type },
+  { BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_printable_value },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_BuiltInDomainDefinedAttribute(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   BuiltInDomainDefinedAttribute_sequence, hf_index, ett_x411_BuiltInDomainDefinedAttribute);
+
+  return offset;
+}
+static int dissect_BuiltInDomainDefinedAttributes_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_BuiltInDomainDefinedAttribute(FALSE, tvb, offset, pinfo, tree, hf_x411_BuiltInDomainDefinedAttributes_item);
+}
+
+
+static const ber_sequence_t BuiltInDomainDefinedAttributes_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_BuiltInDomainDefinedAttributes_item },
+};
+
+static int
+dissect_x411_BuiltInDomainDefinedAttributes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      BuiltInDomainDefinedAttributes_sequence_of, hf_index, ett_x411_BuiltInDomainDefinedAttributes);
+
+  return offset;
+}
+static int dissect_built_in_domain_defined_attributes(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_BuiltInDomainDefinedAttributes(FALSE, tvb, offset, pinfo, tree, hf_x411_built_in_domain_defined_attributes);
+}
+
+
+
+static int
+dissect_x411_INTEGER(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  &extension_id);
+
+
+  return offset;
+}
+static int dissect_messages_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_x411_messages);
+}
+static int dissect_delivery_queue_octets_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_x411_delivery_queue_octets);
+}
+static int dissect_standard_extension_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_x411_standard_extension);
+}
+static int dissect_extension_attribute_type_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_x411_extension_attribute_type);
+}
+
+
+
+static int
+dissect_x411_T_extension_attribute_value(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+
+       offset=call_x411_oid_callback("x411.extension-attribute", tvb, offset, pinfo, tree);
+
+
+  return offset;
+}
+static int dissect_extension_attribute_value_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_extension_attribute_value(TRUE, tvb, offset, pinfo, tree, hf_x411_extension_attribute_value);
+}
+
+
+static const ber_sequence_t ExtensionAttribute_sequence[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_extension_attribute_type_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_extension_attribute_value_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ExtensionAttribute(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ExtensionAttribute_sequence, hf_index, ett_x411_ExtensionAttribute);
+
+  return offset;
+}
+static int dissect_ExtensionAttributes_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExtensionAttribute(FALSE, tvb, offset, pinfo, tree, hf_x411_ExtensionAttributes_item);
+}
+
+
+static const ber_sequence_t ExtensionAttributes_set_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_ExtensionAttributes_item },
+};
+
+static int
+dissect_x411_ExtensionAttributes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
+                                 ExtensionAttributes_set_of, hf_index, ett_x411_ExtensionAttributes);
+
+  return offset;
+}
+static int dissect_extension_attributes(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExtensionAttributes(FALSE, tvb, offset, pinfo, tree, hf_x411_extension_attributes);
+}
+
+
+static const ber_sequence_t ORName_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_built_in_standard_attributes },
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_built_in_domain_defined_attributes },
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extension_attributes },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_directory_name_impl },
+  { 0, 0, 0, NULL }
+};
+
+int
+dissect_x411_ORName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ORName_sequence, hf_index, ett_x411_ORName);
+
+  return offset;
+}
+static int dissect_exact_match_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ORName(TRUE, tvb, offset, pinfo, tree, hf_x411_exact_match);
+}
+static int dissect_pattern_match_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ORName(TRUE, tvb, offset, pinfo, tree, hf_x411_pattern_match);
+}
+
+
+
+static int
+dissect_x411_ORAddressAndOptionalDirectoryName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_user_agent(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ORAddressAndOptionalDirectoryName(FALSE, tvb, offset, pinfo, tree, hf_x411_user_agent);
+}
+static int dissect_message_store_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ORAddressAndOptionalDirectoryName(TRUE, tvb, offset, pinfo, tree, hf_x411_message_store);
+}
+static int dissect_intended_recipient(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ORAddressAndOptionalDirectoryName(FALSE, tvb, offset, pinfo, tree, hf_x411_intended_recipient);
+}
+static int dissect_dl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ORAddressAndOptionalDirectoryName(FALSE, tvb, offset, pinfo, tree, hf_x411_dl);
+}
+static int dissect_originator_or_dl_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ORAddressAndOptionalDirectoryName(FALSE, tvb, offset, pinfo, tree, hf_x411_originator_or_dl_name);
+}
+
+
+
+static int
+dissect_x411_MTAOriginatorName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_mta_originator_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTAOriginatorName(FALSE, tvb, offset, pinfo, tree, hf_x411_mta_originator_name);
+}
+
+
+static const asn_namedbit BuiltInEncodedInformationTypes_bits[] = {
+  {  0, &hf_x411_BuiltInEncodedInformationTypes_unknown, -1, -1, "unknown", NULL },
+  {  2, &hf_x411_BuiltInEncodedInformationTypes_ia5_text, -1, -1, "ia5-text", NULL },
+  {  3, &hf_x411_BuiltInEncodedInformationTypes_g3_facsimile, -1, -1, "g3-facsimile", NULL },
+  {  4, &hf_x411_BuiltInEncodedInformationTypes_g4_class_1, -1, -1, "g4-class-1", NULL },
+  {  5, &hf_x411_BuiltInEncodedInformationTypes_teletex, -1, -1, "teletex", NULL },
+  {  6, &hf_x411_BuiltInEncodedInformationTypes_videotex, -1, -1, "videotex", NULL },
+  {  7, &hf_x411_BuiltInEncodedInformationTypes_voice, -1, -1, "voice", NULL },
+  {  8, &hf_x411_BuiltInEncodedInformationTypes_sfd, -1, -1, "sfd", NULL },
+  {  9, &hf_x411_BuiltInEncodedInformationTypes_mixed_mode, -1, -1, "mixed-mode", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_BuiltInEncodedInformationTypes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    BuiltInEncodedInformationTypes_bits, hf_index, ett_x411_BuiltInEncodedInformationTypes,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_built_in_encoded_information_types_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_BuiltInEncodedInformationTypes(TRUE, tvb, offset, pinfo, tree, hf_x411_built_in_encoded_information_types);
+}
+
+
+static const asn_namedbit G3FacsimileNonBasicParameters_bits[] = {
+  {  8, &hf_x411_G3FacsimileNonBasicParameters_two_dimensional, -1, -1, "two-dimensional", NULL },
+  {  9, &hf_x411_G3FacsimileNonBasicParameters_fine_resolution, -1, -1, "fine-resolution", NULL },
+  { 20, &hf_x411_G3FacsimileNonBasicParameters_unlimited_length, -1, -1, "unlimited-length", NULL },
+  { 21, &hf_x411_G3FacsimileNonBasicParameters_b4_length, -1, -1, "b4-length", NULL },
+  { 22, &hf_x411_G3FacsimileNonBasicParameters_a3_width, -1, -1, "a3-width", NULL },
+  { 23, &hf_x411_G3FacsimileNonBasicParameters_b4_width, -1, -1, "b4-width", NULL },
+  { 25, &hf_x411_G3FacsimileNonBasicParameters_t6_coding, -1, -1, "t6-coding", NULL },
+  { 30, &hf_x411_G3FacsimileNonBasicParameters_uncompressed, -1, -1, "uncompressed", NULL },
+  { 37, &hf_x411_G3FacsimileNonBasicParameters_width_middle_864_of_1728, -1, -1, "width-middle-864-of-1728", NULL },
+  { 38, &hf_x411_G3FacsimileNonBasicParameters_width_middle_1216_of_1728, -1, -1, "width-middle-1216-of-1728", NULL },
+  { 44, &hf_x411_G3FacsimileNonBasicParameters_resolution_type, -1, -1, "resolution-type", NULL },
+  { 45, &hf_x411_G3FacsimileNonBasicParameters_resolution_400x400, -1, -1, "resolution-400x400", NULL },
+  { 46, &hf_x411_G3FacsimileNonBasicParameters_resolution_300x300, -1, -1, "resolution-300x300", NULL },
+  { 47, &hf_x411_G3FacsimileNonBasicParameters_resolution_8x15, -1, -1, "resolution-8x15", NULL },
+  { 49, &hf_x411_G3FacsimileNonBasicParameters_edi, -1, -1, "edi", NULL },
+  { 50, &hf_x411_G3FacsimileNonBasicParameters_dtm, -1, -1, "dtm", NULL },
+  { 51, &hf_x411_G3FacsimileNonBasicParameters_bft, -1, -1, "bft", NULL },
+  { 58, &hf_x411_G3FacsimileNonBasicParameters_mixed_mode, -1, -1, "mixed-mode", NULL },
+  { 60, &hf_x411_G3FacsimileNonBasicParameters_character_mode, -1, -1, "character-mode", NULL },
+  { 65, &hf_x411_G3FacsimileNonBasicParameters_twelve_bits, -1, -1, "twelve-bits", NULL },
+  { 66, &hf_x411_G3FacsimileNonBasicParameters_preferred_huffmann, -1, -1, "preferred-huffmann", NULL },
+  { 67, &hf_x411_G3FacsimileNonBasicParameters_full_colour, -1, -1, "full-colour", NULL },
+  { 68, &hf_x411_G3FacsimileNonBasicParameters_jpeg, -1, -1, "jpeg", NULL },
+  { 71, &hf_x411_G3FacsimileNonBasicParameters_processable_mode_26, -1, -1, "processable-mode-26", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+int
+dissect_x411_G3FacsimileNonBasicParameters(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    G3FacsimileNonBasicParameters_bits, hf_index, ett_x411_G3FacsimileNonBasicParameters,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_g3_facsimile_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_G3FacsimileNonBasicParameters(TRUE, tvb, offset, pinfo, tree, hf_x411_g3_facsimile);
+}
+
+
+
+static int
+dissect_x411_TeletexString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_TeletexString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_teletex_surname_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TeletexString(TRUE, tvb, offset, pinfo, tree, hf_x411_teletex_surname);
+}
+static int dissect_teletex_given_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TeletexString(TRUE, tvb, offset, pinfo, tree, hf_x411_teletex_given_name);
+}
+static int dissect_teletex_initials_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TeletexString(TRUE, tvb, offset, pinfo, tree, hf_x411_teletex_initials);
+}
+static int dissect_teletex_generation_qualifier_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TeletexString(TRUE, tvb, offset, pinfo, tree, hf_x411_teletex_generation_qualifier);
+}
+static int dissect_teletex_string(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TeletexString(FALSE, tvb, offset, pinfo, tree, hf_x411_teletex_string);
+}
+static int dissect_type(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TeletexString(FALSE, tvb, offset, pinfo, tree, hf_x411_type);
+}
+static int dissect_teletex_value(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TeletexString(FALSE, tvb, offset, pinfo, tree, hf_x411_teletex_value);
+}
+static int dissect_graphic_character_sets_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TeletexString(TRUE, tvb, offset, pinfo, tree, hf_x411_graphic_character_sets);
+}
+static int dissect_control_character_sets_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TeletexString(TRUE, tvb, offset, pinfo, tree, hf_x411_control_character_sets);
+}
+static int dissect_miscellaneous_terminal_capabilities_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TeletexString(TRUE, tvb, offset, pinfo, tree, hf_x411_miscellaneous_terminal_capabilities);
+}
+
+
+static const ber_sequence_t TeletexNonBasicParameters_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_graphic_character_sets_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_control_character_sets_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_page_formats_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_miscellaneous_terminal_capabilities_impl },
+  { BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_private_use_impl },
+  { 0, 0, 0, NULL }
+};
+
+int
+dissect_x411_TeletexNonBasicParameters(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              TeletexNonBasicParameters_set, hf_index, ett_x411_TeletexNonBasicParameters);
+
+  return offset;
+}
+static int dissect_teletex_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TeletexNonBasicParameters(TRUE, tvb, offset, pinfo, tree, hf_x411_teletex);
+}
+
+
+
+static int
+dissect_x411_ExtendedEncodedInformationType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_ExtendedEncodedInformationTypes_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExtendedEncodedInformationType(FALSE, tvb, offset, pinfo, tree, hf_x411_ExtendedEncodedInformationTypes_item);
+}
+
+
+static const ber_sequence_t ExtendedEncodedInformationTypes_set_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_ExtendedEncodedInformationTypes_item },
+};
+
+static int
+dissect_x411_ExtendedEncodedInformationTypes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
+                                 ExtendedEncodedInformationTypes_set_of, hf_index, ett_x411_ExtendedEncodedInformationTypes);
+
+  return offset;
+}
+static int dissect_unacceptable_eits_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExtendedEncodedInformationTypes(TRUE, tvb, offset, pinfo, tree, hf_x411_unacceptable_eits);
+}
+static int dissect_acceptable_eits_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExtendedEncodedInformationTypes(TRUE, tvb, offset, pinfo, tree, hf_x411_acceptable_eits);
+}
+static int dissect_exclusively_acceptable_eits_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExtendedEncodedInformationTypes(TRUE, tvb, offset, pinfo, tree, hf_x411_exclusively_acceptable_eits);
+}
+static int dissect_extended_encoded_information_types_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExtendedEncodedInformationTypes(TRUE, tvb, offset, pinfo, tree, hf_x411_extended_encoded_information_types);
+}
+
+
+static const ber_sequence_t EncodedInformationTypes_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_built_in_encoded_information_types_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_g3_facsimile_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_teletex_impl },
+  { BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extended_encoded_information_types_impl },
+  { 0, 0, 0, NULL }
+};
+
+int
+dissect_x411_EncodedInformationTypes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              EncodedInformationTypes_set, hf_index, ett_x411_EncodedInformationTypes);
+
+  return offset;
+}
+static int dissect_waiting_encoded_information_types(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_EncodedInformationTypes(FALSE, tvb, offset, pinfo, tree, hf_x411_waiting_encoded_information_types);
+}
+
+
+
+static int
+dissect_x411_OriginalEncodedInformationTypes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_EncodedInformationTypes(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_original_encoded_information_types(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OriginalEncodedInformationTypes(FALSE, tvb, offset, pinfo, tree, hf_x411_original_encoded_information_types);
+}
+static int dissect_original_encoded_information_types_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OriginalEncodedInformationTypes(TRUE, tvb, offset, pinfo, tree, hf_x411_original_encoded_information_types);
+}
+
+
+static const value_string x411_BuiltInContentType_vals[] = {
+  {   0, "unidentified" },
+  {   1, "external" },
+  {   2, "interpersonal-messaging-1984" },
+  {  22, "interpersonal-messaging-1988" },
+  {  35, "edi-messaging" },
+  {  40, "voice-messaging" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_BuiltInContentType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  guint32      ict = -1;       
+
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  &ict);
+
+  /* convert integer content type to oid for dispatch when the content is found */
+  switch(ict) {
+       case 2:
+       strcpy(object_identifier_id, "2.6.1.10.0");
+       break;
+       case 22:
+       strcpy(object_identifier_id, "2.6.1.10.1");
+       break;
+       default:
+       break;
+       }
+
+
+  return offset;
+}
+static int dissect_built_in(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_BuiltInContentType(FALSE, tvb, offset, pinfo, tree, hf_x411_built_in);
+}
+static int dissect_built_in_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_BuiltInContentType(TRUE, tvb, offset, pinfo, tree, hf_x411_built_in);
+}
+
+
+
+static int
+dissect_x411_ExtendedContentType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset,
+                                         hf_index, object_identifier_id);
+
+
+
+  return offset;
+}
+static int dissect_extended(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExtendedContentType(FALSE, tvb, offset, pinfo, tree, hf_x411_extended);
+}
+
+
+static const value_string x411_ContentType_vals[] = {
+  {   0, "built-in" },
+  {   1, "extended" },
+  { 0, NULL }
+};
+
+static const ber_choice_t ContentType_choice[] = {
+  {   0, BER_CLASS_APP, 6, BER_FLAGS_NOOWNTAG, dissect_built_in },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_extended },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ContentType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 ContentType_choice, hf_index, ett_x411_ContentType,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_content_type(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ContentType(FALSE, tvb, offset, pinfo, tree, hf_x411_content_type);
+}
+static int dissect_waiting_content_types_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ContentType(FALSE, tvb, offset, pinfo, tree, hf_x411_waiting_content_types_item);
+}
+static int dissect_ContentTypes_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ContentType(FALSE, tvb, offset, pinfo, tree, hf_x411_ContentTypes_item);
+}
+
+
+
+static int
+dissect_x411_ContentIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+ gint8 class;
+ gboolean pc, ind_field;
+ gint32 tag;
+ gint32 len1;
+
+ if(!implicit_tag){
+   /* XXX  asn2eth can not yet handle tagged assignment yes so this
+    * XXX is some conformance file magic to work around that bug
+    */
+    offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
+    offset = get_ber_length(tree, tvb, offset, &len1, &ind_field);
+ }
+
+  /* this is magic I haven't seen used before - I've stripped the tag - but now I'm going to say it is IMPLICIT! */
+  offset = dissect_ber_restricted_string(TRUE, BER_UNI_TAG_PrintableString,
+                                         pinfo, tree, tvb, offset, hf_index,
+                                         NULL);
+
+
+
+  return offset;
+}
+static int dissect_content_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ContentIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_content_identifier);
+}
+static int dissect_content_identifier_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ContentIdentifier(TRUE, tvb, offset, pinfo, tree, hf_x411_content_identifier);
+}
+
+
+static const value_string x411_Priority_vals[] = {
+  {   0, "normal" },
+  {   1, "non-urgent" },
+  {   2, "urgent" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_Priority(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_priority(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Priority(FALSE, tvb, offset, pinfo, tree, hf_x411_priority);
+}
+static int dissect_permissible_lowest_priority(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Priority(FALSE, tvb, offset, pinfo, tree, hf_x411_permissible_lowest_priority);
+}
+static int dissect_priority_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Priority(FALSE, tvb, offset, pinfo, tree, hf_x411_priority_item);
+}
+
+
+static const asn_namedbit PerMessageIndicators_bits[] = {
+  {  0, &hf_x411_PerMessageIndicators_disclosure_of_other_recipients, -1, -1, "disclosure-of-other-recipients", NULL },
+  {  1, &hf_x411_PerMessageIndicators_implicit_conversion_prohibited, -1, -1, "implicit-conversion-prohibited", NULL },
+  {  2, &hf_x411_PerMessageIndicators_alternate_recipient_allowed, -1, -1, "alternate-recipient-allowed", NULL },
+  {  3, &hf_x411_PerMessageIndicators_content_return_request, -1, -1, "content-return-request", NULL },
+  {  4, &hf_x411_PerMessageIndicators_reserved, -1, -1, "reserved", NULL },
+  {  5, &hf_x411_PerMessageIndicators_bit_5, -1, -1, "bit-5", NULL },
+  {  6, &hf_x411_PerMessageIndicators_bit_6, -1, -1, "bit-6", NULL },
+  {  7, &hf_x411_PerMessageIndicators_service_message, -1, -1, "service-message", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_PerMessageIndicators(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    PerMessageIndicators_bits, hf_index, ett_x411_PerMessageIndicators,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_per_message_indicators(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PerMessageIndicators(FALSE, tvb, offset, pinfo, tree, hf_x411_per_message_indicators);
+}
+
+
+
+static int
+dissect_x411_Time(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_UTCTime,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_redirection_time(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Time(FALSE, tvb, offset, pinfo, tree, hf_x411_redirection_time);
+}
+static int dissect_dl_expansion_time(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Time(FALSE, tvb, offset, pinfo, tree, hf_x411_dl_expansion_time);
+}
+static int dissect_origination_or_expansion_time(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Time(FALSE, tvb, offset, pinfo, tree, hf_x411_origination_or_expansion_time);
+}
+
+
+
+static int
+dissect_x411_DeferredDeliveryTime(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Time(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_deferred_delivery_time_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DeferredDeliveryTime(TRUE, tvb, offset, pinfo, tree, hf_x411_deferred_delivery_time);
+}
+
+
+static const ber_sequence_t T_private_domain_sequence[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_administration_domain_name_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_private_domain_identifier_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_T_private_domain(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   T_private_domain_sequence, hf_index, ett_x411_T_private_domain);
+
+  return offset;
+}
+static int dissect_private_domain(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_private_domain(FALSE, tvb, offset, pinfo, tree, hf_x411_private_domain);
+}
+
+
+static const value_string x411_T_domain_vals[] = {
+  {   0, "administration-domain-name" },
+  {   1, "private-domain" },
+  { 0, NULL }
+};
+
+static const ber_choice_t T_domain_choice[] = {
+  {   0, BER_CLASS_APP, 2, BER_FLAGS_NOOWNTAG, dissect_administration_domain_name },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_private_domain },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_T_domain(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 T_domain_choice, hf_index, ett_x411_T_domain,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_bilateral_domain(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_domain(FALSE, tvb, offset, pinfo, tree, hf_x411_bilateral_domain);
+}
+
+
+static const ber_sequence_t PerDomainBilateralInformation_sequence[] = {
+  { BER_CLASS_APP, 1, BER_FLAGS_NOOWNTAG, dissect_country_name },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_bilateral_domain },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_PerDomainBilateralInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   PerDomainBilateralInformation_sequence, hf_index, ett_x411_PerDomainBilateralInformation);
+
+  return offset;
+}
+static int dissect_per_domain_bilateral_information_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PerDomainBilateralInformation(FALSE, tvb, offset, pinfo, tree, hf_x411_per_domain_bilateral_information_item);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_PerDomainBilateralInformation_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_per_domain_bilateral_information_item },
+};
+
+static int
+dissect_x411_SEQUENCE_OF_PerDomainBilateralInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_PerDomainBilateralInformation_sequence_of, hf_index, ett_x411_SEQUENCE_OF_PerDomainBilateralInformation);
+
+  return offset;
+}
+static int dissect_per_domain_bilateral_information_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SEQUENCE_OF_PerDomainBilateralInformation(TRUE, tvb, offset, pinfo, tree, hf_x411_per_domain_bilateral_information);
+}
+
+
+
+static int
+dissect_x411_ArrivalTime(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Time(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_arrival_time_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ArrivalTime(TRUE, tvb, offset, pinfo, tree, hf_x411_arrival_time);
+}
+
+
+static const value_string x411_RoutingAction_vals[] = {
+  {   0, "relayed" },
+  {   1, "rerouted" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_RoutingAction(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_routing_action_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RoutingAction(TRUE, tvb, offset, pinfo, tree, hf_x411_routing_action);
+}
+
+
+
+static int
+dissect_x411_DeferredTime(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Time(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_deferred_time_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DeferredTime(TRUE, tvb, offset, pinfo, tree, hf_x411_deferred_time);
+}
+
+
+
+static int
+dissect_x411_ConvertedEncodedInformationTypes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_EncodedInformationTypes(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_converted_encoded_information_types(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ConvertedEncodedInformationTypes(FALSE, tvb, offset, pinfo, tree, hf_x411_converted_encoded_information_types);
+}
+static int dissect_converted_encoded_information_types_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ConvertedEncodedInformationTypes(TRUE, tvb, offset, pinfo, tree, hf_x411_converted_encoded_information_types);
+}
+
+
+static const asn_namedbit OtherActions_bits[] = {
+  {  0, &hf_x411_OtherActions_redirected, -1, -1, "redirected", NULL },
+  {  1, &hf_x411_OtherActions_dl_operation, -1, -1, "dl-operation", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_OtherActions(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    OtherActions_bits, hf_index, ett_x411_OtherActions,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_other_actions_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OtherActions(TRUE, tvb, offset, pinfo, tree, hf_x411_other_actions);
+}
+
+
+static const ber_sequence_t DomainSuppliedInformation_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_arrival_time_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_routing_action_impl },
+  { BER_CLASS_APP, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_attempted_domain },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_deferred_time_impl },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_converted_encoded_information_types },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_other_actions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_DomainSuppliedInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              DomainSuppliedInformation_set, hf_index, ett_x411_DomainSuppliedInformation);
+
+  return offset;
+}
+static int dissect_domain_supplied_information(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DomainSuppliedInformation(FALSE, tvb, offset, pinfo, tree, hf_x411_domain_supplied_information);
+}
+
+
+static const ber_sequence_t TraceInformationElement_sequence[] = {
+  { BER_CLASS_APP, 3, BER_FLAGS_NOOWNTAG, dissect_global_domain_identifier },
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_domain_supplied_information },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_TraceInformationElement(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   TraceInformationElement_sequence, hf_index, ett_x411_TraceInformationElement);
+
+  return offset;
+}
+static int dissect_TraceInformation_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TraceInformationElement(FALSE, tvb, offset, pinfo, tree, hf_x411_TraceInformation_item);
+}
+
+
+static const ber_sequence_t TraceInformation_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_TraceInformation_item },
+};
+
+static int
+dissect_x411_TraceInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      TraceInformation_sequence_of, hf_index, ett_x411_TraceInformation);
+
+  return offset;
+}
+static int dissect_trace_information(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TraceInformation(FALSE, tvb, offset, pinfo, tree, hf_x411_trace_information);
+}
+
+
+static const value_string x411_ExtensionType_vals[] = {
+  {   0, "standard-extension" },
+  {   3, "private-extension" },
+  { 0, NULL }
+};
+
+static const ber_choice_t ExtensionType_choice[] = {
+  {   0, BER_CLASS_CON, 0, 0, dissect_standard_extension_impl },
+  {   3, BER_CLASS_CON, 3, 0, dissect_private_extension_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ExtensionType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 ExtensionType_choice, hf_index, ett_x411_ExtensionType,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_extension_type(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExtensionType(FALSE, tvb, offset, pinfo, tree, hf_x411_extension_type);
+}
+
+
+static const asn_namedbit Criticality_bits[] = {
+  {  0, &hf_x411_Criticality_for_submission, -1, -1, "for-submission", NULL },
+  {  1, &hf_x411_Criticality_for_transfer, -1, -1, "for-transfer", NULL },
+  {  2, &hf_x411_Criticality_for_delivery, -1, -1, "for-delivery", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_Criticality(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    Criticality_bits, hf_index, ett_x411_Criticality,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_criticality_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Criticality(TRUE, tvb, offset, pinfo, tree, hf_x411_criticality);
+}
+
+
+
+static int
+dissect_x411_ExtensionValue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+
+       offset=call_x411_oid_callback("x411.extension", tvb, offset, pinfo, tree);
+
+
+  return offset;
+}
+static int dissect_extension_value_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExtensionValue(TRUE, tvb, offset, pinfo, tree, hf_x411_extension_value);
+}
+
+
+static const ber_sequence_t ExtensionField_sequence[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_extension_type },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_criticality_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_extension_value_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ExtensionField(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ExtensionField_sequence, hf_index, ett_x411_ExtensionField);
+
+  return offset;
+}
+static int dissect_extensions_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExtensionField(FALSE, tvb, offset, pinfo, tree, hf_x411_extensions_item);
+}
+
+
+static const ber_sequence_t SET_OF_ExtensionField_set_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_extensions_item },
+};
+
+static int
+dissect_x411_SET_OF_ExtensionField(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
+                                 SET_OF_ExtensionField_set_of, hf_index, ett_x411_SET_OF_ExtensionField);
+
+  return offset;
+}
+static int dissect_extensions(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SET_OF_ExtensionField(FALSE, tvb, offset, pinfo, tree, hf_x411_extensions);
+}
+static int dissect_extensions_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SET_OF_ExtensionField(TRUE, tvb, offset, pinfo, tree, hf_x411_extensions);
+}
+
+
+
+static int
+dissect_x411_MTARecipientName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_recipient_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTARecipientName(FALSE, tvb, offset, pinfo, tree, hf_x411_recipient_name);
+}
+
+
+
+static int
+dissect_x411_OriginallySpecifiedRecipientNumber(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_originally_specified_recipient_number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OriginallySpecifiedRecipientNumber(TRUE, tvb, offset, pinfo, tree, hf_x411_originally_specified_recipient_number);
+}
+
+
+static const asn_namedbit PerRecipientIndicators_bits[] = {
+  {  0, &hf_x411_PerRecipientIndicators_responsibility, -1, -1, "responsibility", NULL },
+  {  1, &hf_x411_PerRecipientIndicators_originating_MTA_report, -1, -1, "originating-MTA-report", NULL },
+  {  2, &hf_x411_PerRecipientIndicators_originating_MTA_non_delivery_report, -1, -1, "originating-MTA-non-delivery-report", NULL },
+  {  3, &hf_x411_PerRecipientIndicators_originator_report, -1, -1, "originator-report", NULL },
+  {  4, &hf_x411_PerRecipientIndicators_originator_non_delivery_report, -1, -1, "originator-non-delivery-report", NULL },
+  {  5, &hf_x411_PerRecipientIndicators_reserved_5, -1, -1, "reserved-5", NULL },
+  {  6, &hf_x411_PerRecipientIndicators_reserved_6, -1, -1, "reserved-6", NULL },
+  {  7, &hf_x411_PerRecipientIndicators_reserved_7, -1, -1, "reserved-7", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_PerRecipientIndicators(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    PerRecipientIndicators_bits, hf_index, ett_x411_PerRecipientIndicators,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_per_recipient_indicators_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PerRecipientIndicators(TRUE, tvb, offset, pinfo, tree, hf_x411_per_recipient_indicators);
+}
+
+
+static const value_string x411_ExplicitConversion_vals[] = {
+  {   0, "ia5-text-to-teletex" },
+  {   8, "ia5-text-to-g3-facsimile" },
+  {   9, "ia5-text-to-g4-class-1" },
+  {  10, "ia5-text-to-videotex" },
+  {  11, "teletex-to-ia5-text" },
+  {  12, "teletex-to-g3-facsimile" },
+  {  13, "teletex-to-g4-class-1" },
+  {  14, "teletex-to-videotex" },
+  {  16, "videotex-to-ia5-text" },
+  {  17, "videotex-to-teletex" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_ExplicitConversion(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_explicit_conversion_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExplicitConversion(TRUE, tvb, offset, pinfo, tree, hf_x411_explicit_conversion);
+}
+
+
+static const ber_sequence_t PerRecipientMessageTransferFields_set[] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_recipient_name },
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_originally_specified_recipient_number_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_per_recipient_indicators_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_explicit_conversion_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_PerRecipientMessageTransferFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              PerRecipientMessageTransferFields_set, hf_index, ett_x411_PerRecipientMessageTransferFields);
+
+  return offset;
+}
+static int dissect_per_recipient_message_fields_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PerRecipientMessageTransferFields(FALSE, tvb, offset, pinfo, tree, hf_x411_per_recipient_message_fields_item);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_PerRecipientMessageTransferFields_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_per_recipient_message_fields_item },
+};
+
+static int
+dissect_x411_SEQUENCE_OF_PerRecipientMessageTransferFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_PerRecipientMessageTransferFields_sequence_of, hf_index, ett_x411_SEQUENCE_OF_PerRecipientMessageTransferFields);
+
+  return offset;
+}
+static int dissect_per_recipient_message_fields_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SEQUENCE_OF_PerRecipientMessageTransferFields(TRUE, tvb, offset, pinfo, tree, hf_x411_per_recipient_message_fields);
+}
+
+
+static const ber_sequence_t MessageTransferEnvelope_set[] = {
+  { BER_CLASS_APP, 4, BER_FLAGS_NOOWNTAG, dissect_message_identifier },
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_mta_originator_name },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_original_encoded_information_types },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_content_type },
+  { BER_CLASS_APP, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_content_identifier },
+  { BER_CLASS_APP, 7, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_priority },
+  { BER_CLASS_APP, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_per_message_indicators },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_deferred_delivery_time_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_per_domain_bilateral_information_impl },
+  { BER_CLASS_APP, 9, BER_FLAGS_NOOWNTAG, dissect_trace_information },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_per_recipient_message_fields_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MessageTransferEnvelope(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              MessageTransferEnvelope_set, hf_index, ett_x411_MessageTransferEnvelope);
+
+  return offset;
+}
+static int dissect_message_envelope(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MessageTransferEnvelope(FALSE, tvb, offset, pinfo, tree, hf_x411_message_envelope);
+}
+
+
+
+static int
+dissect_x411_Content(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  tvbuff_t *next_tvb;
+
+  /* we can do this now constructed octet strings are supported */
+  offset = dissect_ber_octet_string(FALSE, pinfo, tree, tvb, offset, hf_index, &next_tvb);
+
+  (void) call_ber_oid_callback(object_identifier_id, next_tvb, 0, pinfo, tree);
+
+
+  return offset;
+}
+static int dissect_content(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Content(FALSE, tvb, offset, pinfo, tree, hf_x411_content);
+}
+static int dissect_returned_content_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Content(TRUE, tvb, offset, pinfo, tree, hf_x411_returned_content);
+}
+
+
+static const ber_sequence_t Message_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_message_envelope },
+  { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_content },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_Message(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   Message_sequence, hf_index, ett_x411_Message);
+
+  return offset;
+}
+static int dissect_message_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Message(TRUE, tvb, offset, pinfo, tree, hf_x411_message);
+}
+
+
+
+static int
+dissect_x411_ProbeIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MTSIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_probe_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ProbeIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_probe_identifier);
+}
+
+
+
+static int
+dissect_x411_ContentLength(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_content_length_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ContentLength(TRUE, tvb, offset, pinfo, tree, hf_x411_content_length);
+}
+static int dissect_permissible_maximum_content_length_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ContentLength(TRUE, tvb, offset, pinfo, tree, hf_x411_permissible_maximum_content_length);
+}
+static int dissect_maximum_content_length_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ContentLength(TRUE, tvb, offset, pinfo, tree, hf_x411_maximum_content_length);
+}
+
+
+static const ber_sequence_t PerRecipientProbeTransferFields_set[] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_recipient_name },
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_originally_specified_recipient_number_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_per_recipient_indicators_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_explicit_conversion_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_PerRecipientProbeTransferFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              PerRecipientProbeTransferFields_set, hf_index, ett_x411_PerRecipientProbeTransferFields);
+
+  return offset;
+}
+static int dissect_per_recipient_probe_transfer_fields_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PerRecipientProbeTransferFields(FALSE, tvb, offset, pinfo, tree, hf_x411_per_recipient_probe_transfer_fields_item);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_PerRecipientProbeTransferFields_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_per_recipient_probe_transfer_fields_item },
+};
+
+static int
+dissect_x411_SEQUENCE_OF_PerRecipientProbeTransferFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_PerRecipientProbeTransferFields_sequence_of, hf_index, ett_x411_SEQUENCE_OF_PerRecipientProbeTransferFields);
+
+  return offset;
+}
+static int dissect_per_recipient_probe_transfer_fields_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SEQUENCE_OF_PerRecipientProbeTransferFields(TRUE, tvb, offset, pinfo, tree, hf_x411_per_recipient_probe_transfer_fields);
+}
+
+
+static const ber_sequence_t ProbeTransferEnvelope_set[] = {
+  { BER_CLASS_APP, 4, BER_FLAGS_NOOWNTAG, dissect_probe_identifier },
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_mta_originator_name },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_original_encoded_information_types },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_content_type },
+  { BER_CLASS_APP, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_content_identifier },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_content_length_impl },
+  { BER_CLASS_APP, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_per_message_indicators },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_per_domain_bilateral_information_impl },
+  { BER_CLASS_APP, 9, BER_FLAGS_NOOWNTAG, dissect_trace_information },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_per_recipient_probe_transfer_fields_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ProbeTransferEnvelope(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              ProbeTransferEnvelope_set, hf_index, ett_x411_ProbeTransferEnvelope);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_Probe(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ProbeTransferEnvelope(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_probe_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Probe(TRUE, tvb, offset, pinfo, tree, hf_x411_probe);
+}
+
+
+
+static int
+dissect_x411_ReportIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MTSIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_report_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ReportIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_report_identifier);
+}
+
+
+
+static int
+dissect_x411_ReportDestinationName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_report_destination_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ReportDestinationName(FALSE, tvb, offset, pinfo, tree, hf_x411_report_destination_name);
+}
+
+
+static const ber_sequence_t ReportTransferEnvelope_set[] = {
+  { BER_CLASS_APP, 4, BER_FLAGS_NOOWNTAG, dissect_report_identifier },
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_report_destination_name },
+  { BER_CLASS_APP, 9, BER_FLAGS_NOOWNTAG, dissect_trace_information },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ReportTransferEnvelope(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              ReportTransferEnvelope_set, hf_index, ett_x411_ReportTransferEnvelope);
+
+  return offset;
+}
+static int dissect_report_envelope(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ReportTransferEnvelope(FALSE, tvb, offset, pinfo, tree, hf_x411_report_envelope);
+}
+
+
+
+static int
+dissect_x411_MessageOrProbeIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MTSIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_SubjectIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MessageOrProbeIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_subject_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SubjectIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_subject_identifier);
+}
+
+
+
+static int
+dissect_x411_SubjectIntermediateTraceInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_TraceInformation(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_subject_intermediate_trace_information(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SubjectIntermediateTraceInformation(FALSE, tvb, offset, pinfo, tree, hf_x411_subject_intermediate_trace_information);
+}
+
+
+
+static int
+dissect_x411_AdditionalInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+/*XXX not implemented yet */
+
+
+  return offset;
+}
+static int dissect_additional_information_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_AdditionalInformation(TRUE, tvb, offset, pinfo, tree, hf_x411_additional_information);
+}
+
+
+
+static int
+dissect_x411_MTAActualRecipientName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_mta_actual_recipient_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTAActualRecipientName(TRUE, tvb, offset, pinfo, tree, hf_x411_mta_actual_recipient_name);
+}
+
+
+
+int
+dissect_x411_MessageDeliveryTime(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Time(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_message_delivery_time(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MessageDeliveryTime(FALSE, tvb, offset, pinfo, tree, hf_x411_message_delivery_time);
+}
+static int dissect_message_delivery_time_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MessageDeliveryTime(TRUE, tvb, offset, pinfo, tree, hf_x411_message_delivery_time);
+}
+
+
+static const value_string x411_TypeOfMTSUser_vals[] = {
+  {   0, "public" },
+  {   1, "private" },
+  {   2, "ms" },
+  {   3, "dl" },
+  {   4, "pdau" },
+  {   5, "physical-recipient" },
+  {   6, "other" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_TypeOfMTSUser(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_type_of_MTS_user(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TypeOfMTSUser(FALSE, tvb, offset, pinfo, tree, hf_x411_type_of_MTS_user);
+}
+static int dissect_type_of_MTS_user_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_TypeOfMTSUser(TRUE, tvb, offset, pinfo, tree, hf_x411_type_of_MTS_user);
+}
+
+
+static const ber_sequence_t DeliveryReport_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_message_delivery_time_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_type_of_MTS_user_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_DeliveryReport(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              DeliveryReport_set, hf_index, ett_x411_DeliveryReport);
+
+  return offset;
+}
+static int dissect_delivery_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DeliveryReport(TRUE, tvb, offset, pinfo, tree, hf_x411_delivery);
+}
+
+
+static const value_string x411_NonDeliveryReasonCode_vals[] = {
+  {   0, "transfer-failure" },
+  {   1, "unable-to-transfer" },
+  {   2, "conversion-not-performed" },
+  {   3, "physical-rendition-not-performed" },
+  {   4, "physical-delivery-not-performed" },
+  {   5, "restricted-delivery" },
+  {   6, "directory-operation-unsuccessful" },
+  {   7, "deferred-delivery-not-performed" },
+  {   8, "transfer-failure-for-security-reason" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_NonDeliveryReasonCode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_non_delivery_reason_code(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NonDeliveryReasonCode(FALSE, tvb, offset, pinfo, tree, hf_x411_non_delivery_reason_code);
+}
+static int dissect_non_delivery_reason_code_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NonDeliveryReasonCode(TRUE, tvb, offset, pinfo, tree, hf_x411_non_delivery_reason_code);
+}
+
+
+static const value_string x411_NonDeliveryDiagnosticCode_vals[] = {
+  {   0, "unrecognised-OR-name" },
+  {   1, "ambiguous-OR-name" },
+  {   2, "mts-congestion" },
+  {   3, "loop-detected" },
+  {   4, "recipient-unavailable" },
+  {   5, "maximum-time-expired" },
+  {   6, "encoded-information-types-unsupported" },
+  {   7, "content-too-long" },
+  {   8, "conversion-impractical" },
+  {   9, "implicit-conversion-prohibited" },
+  {  10, "implicit-conversion-not-subscribed" },
+  {  11, "invalid-arguments" },
+  {  12, "content-syntax-error" },
+  {  13, "size-constraint-violation" },
+  {  14, "protocol-violation" },
+  {  15, "content-type-not-supported" },
+  {  16, "too-many-recipients" },
+  {  17, "no-bilateral-agreement" },
+  {  18, "unsupported-critical-function" },
+  {  19, "conversion-with-loss-prohibited" },
+  {  20, "line-too-long" },
+  {  21, "page-split" },
+  {  22, "pictorial-symbol-loss" },
+  {  23, "punctuation-symbol-loss" },
+  {  24, "alphabetic-character-loss" },
+  {  25, "multiple-information-loss" },
+  {  26, "recipient-reassignment-prohibited" },
+  {  27, "redirection-loop-detected" },
+  {  28, "dl-expansion-prohibited" },
+  {  29, "no-dl-submit-permission" },
+  {  30, "dl-expansion-failure" },
+  {  31, "physical-rendition-attributes-not-supported" },
+  {  32, "undeliverable-mail-physical-delivery-address-incorrect" },
+  {  33, "undeliverable-mail-physical-delivery-office-incorrect-or-invalid" },
+  {  34, "undeliverable-mail-physical-delivery-address-incomplete" },
+  {  35, "undeliverable-mail-recipient-unknown" },
+  {  36, "undeliverable-mail-recipient-deceased" },
+  {  37, "undeliverable-mail-organization-expired" },
+  {  38, "undeliverable-mail-recipient-refused-to-accept" },
+  {  39, "undeliverable-mail-recipient-did-not-claim" },
+  {  40, "undeliverable-mail-recipient-changed-address-permanently" },
+  {  41, "undeliverable-mail-recipient-changed-address-temporarily" },
+  {  42, "undeliverable-mail-recipient-changed-temporary-address" },
+  {  43, "undeliverable-mail-new-address-unknown" },
+  {  44, "undeliverable-mail-recipient-did-not-want-forwarding" },
+  {  45, "undeliverable-mail-originator-prohibited-forwarding" },
+  {  46, "secure-messaging-error" },
+  {  47, "unable-to-downgrade" },
+  {  48, "unable-to-complete-transfer" },
+  {  49, "transfer-attempts-limit-reached" },
+  {  50, "incorrect-notification-type" },
+  {  51, "dl-expansion-prohibited-by-security-policy" },
+  {  52, "forbidden-alternate-recipient" },
+  {  53, "security-policy-violation" },
+  {  54, "security-services-refusal" },
+  {  55, "unauthorised-dl-member" },
+  {  56, "unauthorised-dl-name" },
+  {  57, "unauthorised-originally-intended-recipient-name" },
+  {  58, "unauthorised-originator-name" },
+  {  59, "unauthorised-recipient-name" },
+  {  60, "unreliable-system" },
+  {  61, "authentication-failure-on-subject-message" },
+  {  62, "decryption-failed" },
+  {  63, "decryption-key-unobtainable" },
+  {  64, "double-envelope-creation-failure" },
+  {  65, "double-enveloping-message-restoring-failure" },
+  {  66, "failure-of-proof-of-message" },
+  {  67, "integrity-failure-on-subject-message" },
+  {  68, "invalid-security-label" },
+  {  69, "key-failure" },
+  {  70, "mandatory-parameter-absence" },
+  {  71, "operation-security-failure" },
+  {  72, "repudiation-failure-of-message" },
+  {  73, "security-context-failure" },
+  {  74, "token-decryption-failed" },
+  {  75, "token-error" },
+  {  76, "unknown-security-label" },
+  {  77, "unsupported-algorithm-identifier" },
+  {  78, "unsupported-security-policy" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_NonDeliveryDiagnosticCode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_non_delivery_diagnostic_code(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NonDeliveryDiagnosticCode(FALSE, tvb, offset, pinfo, tree, hf_x411_non_delivery_diagnostic_code);
+}
+static int dissect_non_delivery_diagnostic_code_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NonDeliveryDiagnosticCode(TRUE, tvb, offset, pinfo, tree, hf_x411_non_delivery_diagnostic_code);
+}
+
+
+static const ber_sequence_t NonDeliveryReport_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_non_delivery_reason_code_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_non_delivery_diagnostic_code_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_NonDeliveryReport(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              NonDeliveryReport_set, hf_index, ett_x411_NonDeliveryReport);
+
+  return offset;
+}
+static int dissect_non_delivery_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_NonDeliveryReport(TRUE, tvb, offset, pinfo, tree, hf_x411_non_delivery);
+}
+
+
+static const value_string x411_ReportType_vals[] = {
+  {   0, "delivery" },
+  {   1, "non-delivery" },
+  { 0, NULL }
+};
+
+static const ber_choice_t ReportType_choice[] = {
+  {   0, BER_CLASS_CON, 0, 0, dissect_delivery_impl },
+  {   1, BER_CLASS_CON, 1, 0, dissect_non_delivery_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ReportType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 ReportType_choice, hf_index, ett_x411_ReportType,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_trace_report_type_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ReportType(TRUE, tvb, offset, pinfo, tree, hf_x411_trace_report_type);
+}
+static int dissect_delivery_report_type_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ReportType(TRUE, tvb, offset, pinfo, tree, hf_x411_delivery_report_type);
+}
+
+
+static const ber_sequence_t LastTraceInformation_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_arrival_time_impl },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_converted_encoded_information_types },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_trace_report_type_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_LastTraceInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              LastTraceInformation_set, hf_index, ett_x411_LastTraceInformation);
+
+  return offset;
+}
+static int dissect_last_trace_information_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_LastTraceInformation(TRUE, tvb, offset, pinfo, tree, hf_x411_last_trace_information);
+}
+
+
+
+static int
+dissect_x411_MTAOriginallyIntendedRecipientName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_report_originally_intended_recipient_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTAOriginallyIntendedRecipientName(TRUE, tvb, offset, pinfo, tree, hf_x411_report_originally_intended_recipient_name);
+}
+
+
+
+int
+dissect_x411_SupplementaryInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_PrintableString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+static int dissect_supplementary_information_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SupplementaryInformation(TRUE, tvb, offset, pinfo, tree, hf_x411_supplementary_information);
+}
+
+
+static const ber_sequence_t PerRecipientReportTransferFields_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_mta_actual_recipient_name_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_originally_specified_recipient_number_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_per_recipient_indicators_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_last_trace_information_impl },
+  { BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_report_originally_intended_recipient_name_impl },
+  { BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_supplementary_information_impl },
+  { BER_CLASS_CON, 6, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_PerRecipientReportTransferFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              PerRecipientReportTransferFields_set, hf_index, ett_x411_PerRecipientReportTransferFields);
+
+  return offset;
+}
+static int dissect_per_recipient_fields_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PerRecipientReportTransferFields(FALSE, tvb, offset, pinfo, tree, hf_x411_per_recipient_fields_item);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_PerRecipientReportTransferFields_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_per_recipient_fields_item },
+};
+
+static int
+dissect_x411_SEQUENCE_OF_PerRecipientReportTransferFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_PerRecipientReportTransferFields_sequence_of, hf_index, ett_x411_SEQUENCE_OF_PerRecipientReportTransferFields);
+
+  return offset;
+}
+static int dissect_per_recipient_report_fields_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SEQUENCE_OF_PerRecipientReportTransferFields(TRUE, tvb, offset, pinfo, tree, hf_x411_per_recipient_report_fields);
+}
+
+
+static const ber_sequence_t ReportTransferContent_set[] = {
+  { BER_CLASS_APP, 4, BER_FLAGS_NOOWNTAG, dissect_subject_identifier },
+  { BER_CLASS_APP, 9, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_subject_intermediate_trace_information },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_original_encoded_information_types },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_content_type },
+  { BER_CLASS_APP, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_content_identifier },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_returned_content_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_additional_information_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_per_recipient_report_fields_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ReportTransferContent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              ReportTransferContent_set, hf_index, ett_x411_ReportTransferContent);
+
+  return offset;
+}
+static int dissect_report_content(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ReportTransferContent(FALSE, tvb, offset, pinfo, tree, hf_x411_report_content);
+}
+
+
+static const ber_sequence_t Report_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_report_envelope },
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_report_content },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_Report(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   Report_sequence, hf_index, ett_x411_Report);
+
+  return offset;
+}
+static int dissect_report_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Report(TRUE, tvb, offset, pinfo, tree, hf_x411_report);
+}
+
+
+static const value_string x411_MTS_APDU_vals[] = {
+  {   0, "message" },
+  {   2, "probe" },
+  {   1, "report" },
+  { 0, NULL }
+};
+
+static const ber_choice_t MTS_APDU_choice[] = {
+  {   0, BER_CLASS_CON, 0, 0, dissect_message_impl },
+  {   2, BER_CLASS_CON, 2, 0, dissect_probe_impl },
+  {   1, BER_CLASS_CON, 1, 0, dissect_report_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MTS_APDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 MTS_APDU_choice, hf_index, ett_x411_MTS_APDU,
+                                 NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_MTAOriginatorRequestedAlternateRecipient(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+static const value_string x411_T_attempted_vals[] = {
+  {   0, "mta" },
+  {   1, "domain" },
+  { 0, NULL }
+};
+
+static const ber_choice_t T_attempted_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_IA5String, BER_FLAGS_NOOWNTAG, dissect_mta },
+  {   1, BER_CLASS_APP, 3, BER_FLAGS_NOOWNTAG, dissect_domain },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_T_attempted(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 T_attempted_choice, hf_index, ett_x411_T_attempted,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_attempted(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_attempted(FALSE, tvb, offset, pinfo, tree, hf_x411_attempted);
+}
+
+
+static const ber_sequence_t MTASuppliedInformation_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_arrival_time_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_routing_action_impl },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_attempted },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_deferred_time_impl },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_converted_encoded_information_types },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_other_actions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MTASuppliedInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              MTASuppliedInformation_set, hf_index, ett_x411_MTASuppliedInformation);
+
+  return offset;
+}
+static int dissect_mta_supplied_information(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTASuppliedInformation(FALSE, tvb, offset, pinfo, tree, hf_x411_mta_supplied_information);
+}
+
+
+static const ber_sequence_t InternalTraceInformationElement_sequence[] = {
+  { BER_CLASS_APP, 3, BER_FLAGS_NOOWNTAG, dissect_global_domain_identifier },
+  { BER_CLASS_UNI, BER_UNI_TAG_IA5String, BER_FLAGS_NOOWNTAG, dissect_mta_name },
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_mta_supplied_information },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_InternalTraceInformationElement(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   InternalTraceInformationElement_sequence, hf_index, ett_x411_InternalTraceInformationElement);
+
+  return offset;
+}
+static int dissect_InternalTraceInformation_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_InternalTraceInformationElement(FALSE, tvb, offset, pinfo, tree, hf_x411_InternalTraceInformation_item);
+}
+
+
+static const ber_sequence_t InternalTraceInformation_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_InternalTraceInformation_item },
+};
+
+static int
+dissect_x411_InternalTraceInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      InternalTraceInformation_sequence_of, hf_index, ett_x411_InternalTraceInformation);
+
+  return offset;
+}
+
+
+static const value_string x411_ObjectName_vals[] = {
+  {   0, "user-agent" },
+  {   1, "mTA" },
+  {   2, "message-store" },
+  { 0, NULL }
+};
+
+static const ber_choice_t ObjectName_choice[] = {
+  {   0, BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_user_agent },
+  {   1, BER_CLASS_CON, 0, 0, dissect_mTA_impl },
+  {   2, BER_CLASS_CON, 4, 0, dissect_message_store_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ObjectName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 ObjectName_choice, hf_index, ett_x411_ObjectName,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_initiator_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ObjectName(FALSE, tvb, offset, pinfo, tree, hf_x411_initiator_name);
+}
+static int dissect_responder_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ObjectName(FALSE, tvb, offset, pinfo, tree, hf_x411_responder_name);
+}
+
+
+static const ber_sequence_t DeliveryQueue_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_messages_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_delivery_queue_octets_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_DeliveryQueue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              DeliveryQueue_set, hf_index, ett_x411_DeliveryQueue);
+
+  return offset;
+}
+static int dissect_urgent_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DeliveryQueue(TRUE, tvb, offset, pinfo, tree, hf_x411_urgent);
+}
+static int dissect_normal_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DeliveryQueue(TRUE, tvb, offset, pinfo, tree, hf_x411_normal);
+}
+static int dissect_non_urgent_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DeliveryQueue(TRUE, tvb, offset, pinfo, tree, hf_x411_non_urgent);
+}
+
+
+static const ber_sequence_t MessagesWaiting_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_urgent_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_normal_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_non_urgent_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MessagesWaiting(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              MessagesWaiting_set, hf_index, ett_x411_MessagesWaiting);
+
+  return offset;
+}
+static int dissect_messages_waiting(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MessagesWaiting(FALSE, tvb, offset, pinfo, tree, hf_x411_messages_waiting);
+}
+
+
+static const ber_sequence_t MTSBindArgument_set[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_initiator_name },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL, dissect_messages_waiting },
+  { BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_initiator_credentials_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_security_context_impl },
+  { BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MTSBindArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              MTSBindArgument_set, hf_index, ett_x411_MTSBindArgument);
+
+  return offset;
+}
+
+
+static const ber_sequence_t MTSBindResult_set[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_responder_name },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL, dissect_messages_waiting },
+  { BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_responder_credentials_impl },
+  { BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MTSBindResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              MTSBindResult_set, hf_index, ett_x411_MTSBindResult);
+
+  return offset;
+}
+
+
+static const value_string x411_MTSBindError_vals[] = {
+  {   0, "busy" },
+  {   2, "authentication-error" },
+  {   3, "unacceptable-dialogue-mode" },
+  {   4, "unacceptable-security-context" },
+  {   5, "inadequate-association-confidentiality" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_MTSBindError(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_ORAddressAndOrDirectoryName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_DLExemptedRecipients_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ORAddressAndOrDirectoryName(FALSE, tvb, offset, pinfo, tree, hf_x411_DLExemptedRecipients_item);
+}
+
+
+
+static int
+dissect_x411_MTSOriginatorName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOrDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_mts_originator_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTSOriginatorName(FALSE, tvb, offset, pinfo, tree, hf_x411_mts_originator_name);
+}
+
+
+
+static int
+dissect_x411_MTSRecipientName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOrDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_ImproperlySpecifiedRecipients_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTSRecipientName(FALSE, tvb, offset, pinfo, tree, hf_x411_ImproperlySpecifiedRecipients_item);
+}
+static int dissect_submission_recipient_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTSRecipientName(FALSE, tvb, offset, pinfo, tree, hf_x411_submission_recipient_name);
+}
+static int dissect_probe_recipient_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTSRecipientName(FALSE, tvb, offset, pinfo, tree, hf_x411_probe_recipient_name);
+}
+
+
+static const asn_namedbit OriginatorReportRequest_bits[] = {
+  {  3, &hf_x411_OriginatorReportRequest_report, -1, -1, "report", NULL },
+  {  4, &hf_x411_OriginatorReportRequest_non_delivery_report, -1, -1, "non-delivery-report", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_OriginatorReportRequest(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    OriginatorReportRequest_bits, hf_index, ett_x411_OriginatorReportRequest,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_originator_report_request_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OriginatorReportRequest(TRUE, tvb, offset, pinfo, tree, hf_x411_originator_report_request);
+}
+
+
+static const ber_sequence_t PerRecipientMessageSubmissionFields_set[] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_submission_recipient_name },
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_originator_report_request_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_explicit_conversion_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_PerRecipientMessageSubmissionFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              PerRecipientMessageSubmissionFields_set, hf_index, ett_x411_PerRecipientMessageSubmissionFields);
+
+  return offset;
+}
+static int dissect_per_recipient_message_submission_fields_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PerRecipientMessageSubmissionFields(FALSE, tvb, offset, pinfo, tree, hf_x411_per_recipient_message_submission_fields_item);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_PerRecipientMessageSubmissionFields_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_per_recipient_message_submission_fields_item },
+};
+
+static int
+dissect_x411_SEQUENCE_OF_PerRecipientMessageSubmissionFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_PerRecipientMessageSubmissionFields_sequence_of, hf_index, ett_x411_SEQUENCE_OF_PerRecipientMessageSubmissionFields);
+
+  return offset;
+}
+static int dissect_per_recipient_message_submission_fields_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SEQUENCE_OF_PerRecipientMessageSubmissionFields(TRUE, tvb, offset, pinfo, tree, hf_x411_per_recipient_message_submission_fields);
+}
+
+
+static const ber_sequence_t MessageSubmissionEnvelope_set[] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_mts_originator_name },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_original_encoded_information_types },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_content_type },
+  { BER_CLASS_APP, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_content_identifier },
+  { BER_CLASS_APP, 7, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_priority },
+  { BER_CLASS_APP, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_per_message_indicators },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_deferred_delivery_time_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_per_recipient_message_submission_fields_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MessageSubmissionEnvelope(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              MessageSubmissionEnvelope_set, hf_index, ett_x411_MessageSubmissionEnvelope);
+
+  return offset;
+}
+static int dissect_message_submission_envelope(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MessageSubmissionEnvelope(FALSE, tvb, offset, pinfo, tree, hf_x411_message_submission_envelope);
+}
+
+
+static const ber_sequence_t MessageSubmissionArgument_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_message_submission_envelope },
+  { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_content },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MessageSubmissionArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   MessageSubmissionArgument_sequence, hf_index, ett_x411_MessageSubmissionArgument);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_MessageSubmissionIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MTSIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_message_submission_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MessageSubmissionIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_message_submission_identifier);
+}
+
+
+
+static int
+dissect_x411_MessageSubmissionTime(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Time(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_message_submission_time_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MessageSubmissionTime(TRUE, tvb, offset, pinfo, tree, hf_x411_message_submission_time);
+}
+
+
+static const ber_sequence_t MessageSubmissionResult_set[] = {
+  { BER_CLASS_APP, 4, BER_FLAGS_NOOWNTAG, dissect_message_submission_identifier },
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_message_submission_time_impl },
+  { BER_CLASS_APP, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_content_identifier },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MessageSubmissionResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              MessageSubmissionResult_set, hf_index, ett_x411_MessageSubmissionResult);
+
+  return offset;
+}
+
+
+static const ber_sequence_t PerRecipientProbeSubmissionFields_set[] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_probe_recipient_name },
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_originator_report_request_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_explicit_conversion_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_PerRecipientProbeSubmissionFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              PerRecipientProbeSubmissionFields_set, hf_index, ett_x411_PerRecipientProbeSubmissionFields);
+
+  return offset;
+}
+static int dissect_per_recipient_probe_submission_fields_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PerRecipientProbeSubmissionFields(FALSE, tvb, offset, pinfo, tree, hf_x411_per_recipient_probe_submission_fields_item);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_PerRecipientProbeSubmissionFields_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_per_recipient_probe_submission_fields_item },
+};
+
+static int
+dissect_x411_SEQUENCE_OF_PerRecipientProbeSubmissionFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_PerRecipientProbeSubmissionFields_sequence_of, hf_index, ett_x411_SEQUENCE_OF_PerRecipientProbeSubmissionFields);
+
+  return offset;
+}
+static int dissect_per_recipient_probe_submission_fields_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SEQUENCE_OF_PerRecipientProbeSubmissionFields(TRUE, tvb, offset, pinfo, tree, hf_x411_per_recipient_probe_submission_fields);
+}
+
+
+static const ber_sequence_t ProbeSubmissionEnvelope_set[] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_mts_originator_name },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_original_encoded_information_types },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_content_type },
+  { BER_CLASS_APP, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_content_identifier },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_content_length_impl },
+  { BER_CLASS_APP, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_per_message_indicators },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_per_recipient_probe_submission_fields_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ProbeSubmissionEnvelope(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              ProbeSubmissionEnvelope_set, hf_index, ett_x411_ProbeSubmissionEnvelope);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_ProbeSubmissionArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ProbeSubmissionEnvelope(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_ProbeSubmissionIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MTSIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_probe_submission_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ProbeSubmissionIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_probe_submission_identifier);
+}
+
+
+
+static int
+dissect_x411_ProbeSubmissionTime(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Time(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_probe_submission_time_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ProbeSubmissionTime(TRUE, tvb, offset, pinfo, tree, hf_x411_probe_submission_time);
+}
+
+
+static const ber_sequence_t ProbeSubmissionResult_set[] = {
+  { BER_CLASS_APP, 4, BER_FLAGS_NOOWNTAG, dissect_probe_submission_identifier },
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_probe_submission_time_impl },
+  { BER_CLASS_APP, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_content_identifier },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ProbeSubmissionResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              ProbeSubmissionResult_set, hf_index, ett_x411_ProbeSubmissionResult);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_CancelDeferredDeliveryArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MessageSubmissionIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_CancelDeferredDeliveryResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_null(implicit_tag, pinfo, tree, tvb, offset, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_BOOLEAN(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_boolean(implicit_tag, pinfo, tree, tvb, offset, hf_index);
+
+  return offset;
+}
+static int dissect_restrict_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_BOOLEAN(TRUE, tvb, offset, pinfo, tree, hf_x411_restrict);
+}
+static int dissect_permitted(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_BOOLEAN(FALSE, tvb, offset, pinfo, tree, hf_x411_permitted);
+}
+
+
+static const asn_namedbit Operations_bits[] = {
+  {  0, &hf_x411_Operations_probe_submission_or_report_delivery, -1, -1, "probe-submission-or-report-delivery", NULL },
+  {  1, &hf_x411_Operations_message_submission_or_message_delivery, -1, -1, "message-submission-or-message-delivery", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_Operations(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    Operations_bits, hf_index, ett_x411_Operations,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_waiting_operations_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Operations(TRUE, tvb, offset, pinfo, tree, hf_x411_waiting_operations);
+}
+static int dissect_permissible_operations_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Operations(TRUE, tvb, offset, pinfo, tree, hf_x411_permissible_operations);
+}
+
+
+static const ber_sequence_t ContentTypes_set_of[1] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ContentTypes_item },
+};
+
+static int
+dissect_x411_ContentTypes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
+                                 ContentTypes_set_of, hf_index, ett_x411_ContentTypes);
+
+  return offset;
+}
+static int dissect_permissible_content_types_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ContentTypes(TRUE, tvb, offset, pinfo, tree, hf_x411_permissible_content_types);
+}
+static int dissect_content_types_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ContentTypes(TRUE, tvb, offset, pinfo, tree, hf_x411_content_types);
+}
+
+
+static const ber_sequence_t EncodedInformationTypesConstraints_sequence[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_unacceptable_eits_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acceptable_eits_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_exclusively_acceptable_eits_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_EncodedInformationTypesConstraints(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   EncodedInformationTypesConstraints_sequence, hf_index, ett_x411_EncodedInformationTypesConstraints);
+
+  return offset;
+}
+static int dissect_encoded_information_types_constraints_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_EncodedInformationTypesConstraints(TRUE, tvb, offset, pinfo, tree, hf_x411_encoded_information_types_constraints);
+}
+
+
+
+static int
+dissect_x411_PermissibleEncodedInformationTypes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_EncodedInformationTypesConstraints(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_permissible_encoded_information_types(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PermissibleEncodedInformationTypes(FALSE, tvb, offset, pinfo, tree, hf_x411_permissible_encoded_information_types);
+}
+
+
+static const ber_sequence_t Controls_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_restrict_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_permissible_operations_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_permissible_maximum_content_length_impl },
+  { BER_CLASS_APP, 7, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_permissible_lowest_priority },
+  { BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_permissible_content_types_impl },
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_permissible_encoded_information_types },
+  { BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_permissible_security_context_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_Controls(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              Controls_set, hf_index, ett_x411_Controls);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_SubmissionControls(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Controls(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_SubmissionControlArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_SubmissionControls(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+static const asn_namedbit WaitingMessages_bits[] = {
+  {  0, &hf_x411_WaitingMessages_long_content, -1, -1, "long-content", NULL },
+  {  1, &hf_x411_WaitingMessages_low_priority, -1, -1, "low-priority", NULL },
+  {  2, &hf_x411_WaitingMessages_other_security_labels, -1, -1, "other-security-labels", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_WaitingMessages(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    WaitingMessages_bits, hf_index, ett_x411_WaitingMessages,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_waiting_messages_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_WaitingMessages(TRUE, tvb, offset, pinfo, tree, hf_x411_waiting_messages);
+}
+
+
+static const ber_sequence_t SET_OF_ContentType_set_of[1] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_waiting_content_types_item },
+};
+
+static int
+dissect_x411_SET_OF_ContentType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
+                                 SET_OF_ContentType_set_of, hf_index, ett_x411_SET_OF_ContentType);
+
+  return offset;
+}
+static int dissect_waiting_content_types_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SET_OF_ContentType(TRUE, tvb, offset, pinfo, tree, hf_x411_waiting_content_types);
+}
+
+
+static const ber_sequence_t Waiting_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_waiting_operations_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_waiting_messages_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_waiting_content_types_impl },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_waiting_encoded_information_types },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_Waiting(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              Waiting_set, hf_index, ett_x411_Waiting);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_SubmissionControlResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Waiting(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+static const ber_sequence_t ImproperlySpecifiedRecipients_sequence_of[1] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_ImproperlySpecifiedRecipients_item },
+};
+
+static int
+dissect_x411_ImproperlySpecifiedRecipients(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      ImproperlySpecifiedRecipients_sequence_of, hf_index, ett_x411_ImproperlySpecifiedRecipients);
+
+  return offset;
+}
+
+
+static const value_string x411_SecurityProblem_vals[] = {
+  {   0, "assemby-instructions-conflict-with-security-services" },
+  {   1, "authentication-problem" },
+  {   2, "authentication-failure-on-subject-message" },
+  {   3, "confidentiality-association-problem" },
+  {   4, "decryption-failed" },
+  {   5, "decryption-key-unobtainable" },
+  {   6, "failure-of-proof-of-message" },
+  {   7, "forbidden-user-security-label-register" },
+  {   8, "incompatible-change-with-original-security-context" },
+  {   9, "integrity-failure-on-subject-message" },
+  {  10, "invalid-security-label" },
+  {  11, "invalid-security-label-update" },
+  {  12, "key-failure" },
+  {  13, "mandatory-parameter-absence" },
+  {  14, "operation-security-failure" },
+  {  15, "redirection-prohibited" },
+  {  16, "refused-alternate-recipient-name" },
+  {  17, "repudiation-failure-of-message" },
+  {  18, "responder-credentials-checking-problem" },
+  {  19, "security-context-failure" },
+  {  20, "security-context-problem" },
+  {  21, "security-policy-violation" },
+  {  22, "security-services-refusal" },
+  {  23, "token-decryption-failed" },
+  {  24, "token-error" },
+  {  25, "unable-to-aggregate-security-labels" },
+  {  26, "unauthorised-dl-name" },
+  {  27, "unauthorised-entry-class" },
+  {  28, "unauthorised-originally-intended-recipient-name" },
+  {  29, "unauthorised-originator-name" },
+  {  30, "unauthorised-recipient-name" },
+  {  31, "unauthorised-security-label-update" },
+  {  32, "unauthorised-user-name" },
+  {  33, "unknown-security-label" },
+  {  34, "unsupported-algorithm-identifier" },
+  {  35, "unsupported-security-policy" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_SecurityProblem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_MessageDeliveryIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MTSIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_message_delivery_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MessageDeliveryIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_message_delivery_identifier);
+}
+
+
+static const value_string x411_DeliveredContentType_vals[] = {
+  {   0, "built-in" },
+  {   1, "extended" },
+  { 0, NULL }
+};
+
+static const ber_choice_t DeliveredContentType_choice[] = {
+  {   0, BER_CLASS_CON, 0, 0, dissect_built_in_impl },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_extended },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_DeliveredContentType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 DeliveredContentType_choice, hf_index, ett_x411_DeliveredContentType,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_delivered_content_type(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DeliveredContentType(FALSE, tvb, offset, pinfo, tree, hf_x411_delivered_content_type);
+}
+
+
+
+static int
+dissect_x411_DeliveredOriginatorName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_originator_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DeliveredOriginatorName(FALSE, tvb, offset, pinfo, tree, hf_x411_originator_name);
+}
+
+
+static const asn_namedbit DeliveryFlags_bits[] = {
+  {  1, &hf_x411_DeliveryFlags_implicit_conversion_prohibited, -1, -1, "implicit-conversion-prohibited", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_DeliveryFlags(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    DeliveryFlags_bits, hf_index, ett_x411_DeliveryFlags,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_delivery_flags_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DeliveryFlags(TRUE, tvb, offset, pinfo, tree, hf_x411_delivery_flags);
+}
+
+
+
+static int
+dissect_x411_OtherRecipientName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_OtherRecipientNames_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OtherRecipientName(FALSE, tvb, offset, pinfo, tree, hf_x411_OtherRecipientNames_item);
+}
+
+
+static const ber_sequence_t OtherRecipientNames_sequence_of[1] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_OtherRecipientNames_item },
+};
+
+static int
+dissect_x411_OtherRecipientNames(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      OtherRecipientNames_sequence_of, hf_index, ett_x411_OtherRecipientNames);
+
+  return offset;
+}
+static int dissect_other_recipient_names_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OtherRecipientNames(TRUE, tvb, offset, pinfo, tree, hf_x411_other_recipient_names);
+}
+
+
+
+static int
+dissect_x411_ThisRecipientName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_this_recipient_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ThisRecipientName(TRUE, tvb, offset, pinfo, tree, hf_x411_this_recipient_name);
+}
+
+
+
+static int
+dissect_x411_MTSOriginallyIntendedRecipientName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_originally_intended_recipient_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTSOriginallyIntendedRecipientName(FALSE, tvb, offset, pinfo, tree, hf_x411_originally_intended_recipient_name);
+}
+static int dissect_originally_intended_recipient_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTSOriginallyIntendedRecipientName(TRUE, tvb, offset, pinfo, tree, hf_x411_originally_intended_recipient_name);
+}
+
+
+static const ber_sequence_t OtherMessageDeliveryFields_set[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_delivered_content_type },
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_originator_name },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_original_encoded_information_types_impl },
+  { BER_CLASS_APP, 7, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_priority },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_delivery_flags_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_other_recipient_names_impl },
+  { BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_this_recipient_name_impl },
+  { BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_originally_intended_recipient_name_impl },
+  { BER_CLASS_CON, 6, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_converted_encoded_information_types_impl },
+  { BER_CLASS_CON, 7, BER_FLAGS_IMPLTAG, dissect_message_submission_time_impl },
+  { BER_CLASS_CON, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_content_identifier_impl },
+  { BER_CLASS_CON, 9, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+int
+dissect_x411_OtherMessageDeliveryFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              OtherMessageDeliveryFields_set, hf_index, ett_x411_OtherMessageDeliveryFields);
+
+  return offset;
+}
+static int dissect_other_fields(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OtherMessageDeliveryFields(FALSE, tvb, offset, pinfo, tree, hf_x411_other_fields);
+}
+
+
+static const ber_sequence_t MessageDeliveryArgument_sequence[] = {
+  { BER_CLASS_APP, 4, BER_FLAGS_NOOWNTAG, dissect_message_delivery_identifier },
+  { BER_CLASS_UNI, BER_UNI_TAG_UTCTime, BER_FLAGS_NOOWNTAG, dissect_message_delivery_time },
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_other_fields },
+  { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_content },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MessageDeliveryArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   MessageDeliveryArgument_sequence, hf_index, ett_x411_MessageDeliveryArgument);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_RecipientCertificate(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x509af_Certificates(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_recipient_certificate_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RecipientCertificate(TRUE, tvb, offset, pinfo, tree, hf_x411_recipient_certificate);
+}
+
+
+static const ber_sequence_t MessageDeliveryResult_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_recipient_certificate_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MessageDeliveryResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              MessageDeliveryResult_set, hf_index, ett_x411_MessageDeliveryResult);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_SubjectSubmissionIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MTSIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_subject_submission_identifier(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SubjectSubmissionIdentifier(FALSE, tvb, offset, pinfo, tree, hf_x411_subject_submission_identifier);
+}
+
+
+
+static int
+dissect_x411_MTSActualRecipientName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOrDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_actual_recipient_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTSActualRecipientName(FALSE, tvb, offset, pinfo, tree, hf_x411_actual_recipient_name);
+}
+static int dissect_actual_recipient_name_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_MTSActualRecipientName(TRUE, tvb, offset, pinfo, tree, hf_x411_actual_recipient_name);
+}
+
+
+static const ber_sequence_t PerRecipientReportDeliveryFields_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_actual_recipient_name_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_delivery_report_type_impl },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_converted_encoded_information_types },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_originally_intended_recipient_name_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_supplementary_information_impl },
+  { BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_PerRecipientReportDeliveryFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              PerRecipientReportDeliveryFields_set, hf_index, ett_x411_PerRecipientReportDeliveryFields);
+
+  return offset;
+}
+static int dissect_per_recipient_report_delivery_fields_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PerRecipientReportDeliveryFields(FALSE, tvb, offset, pinfo, tree, hf_x411_per_recipient_report_delivery_fields_item);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_PerRecipientReportDeliveryFields_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_per_recipient_report_delivery_fields_item },
+};
+
+static int
+dissect_x411_SEQUENCE_OF_PerRecipientReportDeliveryFields(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_PerRecipientReportDeliveryFields_sequence_of, hf_index, ett_x411_SEQUENCE_OF_PerRecipientReportDeliveryFields);
+
+  return offset;
+}
+static int dissect_per_recipient_report_delivery_fields(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SEQUENCE_OF_PerRecipientReportDeliveryFields(FALSE, tvb, offset, pinfo, tree, hf_x411_per_recipient_report_delivery_fields);
+}
+
+
+static const ber_sequence_t ReportDeliveryArgument_set[] = {
+  { BER_CLASS_APP, 4, BER_FLAGS_NOOWNTAG, dissect_subject_submission_identifier },
+  { BER_CLASS_APP, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_content_identifier },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_content_type },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_original_encoded_information_types },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_per_recipient_report_delivery_fields },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_returned_content_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ReportDeliveryArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              ReportDeliveryArgument_set, hf_index, ett_x411_ReportDeliveryArgument);
+
+  return offset;
+}
+
+
+static const value_string x411_ReportDeliveryResult_vals[] = {
+  {   0, "empty-result" },
+  {   1, "extensions" },
+  {   2, "extensions" },
+  { 0, NULL }
+};
+
+static const ber_choice_t ReportDeliveryResult_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_empty_result },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_extensions },
+  {   2, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_extensions },
+  {   3, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_extensions },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ReportDeliveryResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 ReportDeliveryResult_choice, hf_index, ett_x411_ReportDeliveryResult,
+                                 NULL);
+
+  return offset;
+}
+
+
+static const ber_sequence_t DeliveryControlArgument_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_restrict_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_permissible_operations_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_permissible_maximum_content_length_impl },
+  { BER_CLASS_APP, 7, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_permissible_lowest_priority },
+  { BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_permissible_content_types_impl },
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_permissible_encoded_information_types },
+  { BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_permissible_security_context_impl },
+  { BER_CLASS_CON, 6, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_DeliveryControlArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              DeliveryControlArgument_set, hf_index, ett_x411_DeliveryControlArgument);
+
+  return offset;
+}
+
+
+static const ber_sequence_t DeliveryControlResult_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_waiting_operations_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_waiting_messages_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_waiting_content_types_impl },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_waiting_encoded_information_types },
+  { BER_CLASS_CON, 6, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_DeliveryControlResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              DeliveryControlResult_set, hf_index, ett_x411_DeliveryControlResult);
+
+  return offset;
+}
+
+
+static const value_string x411_RefusedArgument_vals[] = {
+  {   0, "user-name" },
+  {   1, "user-address" },
+  {   2, "deliverable-content-types" },
+  {   3, "deliverable-maximum-content-length" },
+  {   4, "deliverable-encoded-information-types-constraints" },
+  {   5, "deliverable-security-labels" },
+  {   6, "recipient-assigned-redirections" },
+  {   7, "restricted-delivery" },
+  {   8, "retrieve-registrations" },
+  {  10, "restrict" },
+  {  11, "permissible-operations" },
+  {  12, "permissible-lowest-priority" },
+  {  13, "permissible-encoded-information-types" },
+  {  14, "permissible-content-types" },
+  {  15, "permissible-maximum-content-length" },
+  {  16, "permissible-security-context" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_RefusedArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_built_in_argument_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RefusedArgument(TRUE, tvb, offset, pinfo, tree, hf_x411_built_in_argument);
+}
+
+
+
+static int
+dissect_x411_T_refused_extension(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+/*XXX not implemented yet */
+
+
+  return offset;
+}
+static int dissect_refused_extension(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_refused_extension(FALSE, tvb, offset, pinfo, tree, hf_x411_refused_extension);
+}
+
+
+static const value_string x411_T_refused_argument_vals[] = {
+  {   0, "built-in-argument" },
+  {   1, "refused-extension" },
+  { 0, NULL }
+};
+
+static const ber_choice_t T_refused_argument_choice[] = {
+  {   0, BER_CLASS_CON, 1, 0, dissect_built_in_argument_impl },
+  {   1, BER_CLASS_ANY, 0, BER_FLAGS_NOOWNTAG, dissect_refused_extension },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_T_refused_argument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 T_refused_argument_choice, hf_index, ett_x411_T_refused_argument,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_refused_argument(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_refused_argument(FALSE, tvb, offset, pinfo, tree, hf_x411_refused_argument);
+}
+
+
+static const value_string x411_RefusalReason_vals[] = {
+  {   0, "facility-unavailable" },
+  {   1, "facility-not-subscribed" },
+  {   2, "parameter-unacceptable" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_RefusalReason(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_refusal_reason_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RefusalReason(TRUE, tvb, offset, pinfo, tree, hf_x411_refusal_reason);
+}
+
+
+static const ber_sequence_t RefusedOperation_set[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_refused_argument },
+  { BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_refusal_reason_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_RefusedOperation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              RefusedOperation_set, hf_index, ett_x411_RefusedOperation);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_ProofOfDeliveryAlgorithmIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x509af_AlgorithmIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_DeliveryControls(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Controls(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_UserName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_user_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_UserName(FALSE, tvb, offset, pinfo, tree, hf_x411_user_name);
+}
+
+
+static const ber_sequence_t T_x121_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_NumericString, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_x121_address },
+  { BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_tsap_id },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_T_x121(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   T_x121_sequence, hf_index, ett_x411_T_x121);
+
+  return offset;
+}
+static int dissect_x121_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_x121(TRUE, tvb, offset, pinfo, tree, hf_x411_x121);
+}
+
+
+
+static int
+dissect_x411_PSAPAddress(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x509sat_PresentationAddress(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_presentation_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_PSAPAddress(TRUE, tvb, offset, pinfo, tree, hf_x411_presentation);
+}
+
+
+static const value_string x411_UserAddress_vals[] = {
+  {   0, "x121" },
+  {   1, "presentation" },
+  { 0, NULL }
+};
+
+static const ber_choice_t UserAddress_choice[] = {
+  {   0, BER_CLASS_CON, 0, 0, dissect_x121_impl },
+  {   1, BER_CLASS_CON, 1, 0, dissect_presentation_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_UserAddress(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 UserAddress_choice, hf_index, ett_x411_UserAddress,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_user_address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_UserAddress(TRUE, tvb, offset, pinfo, tree, hf_x411_user_address);
+}
+
+
+static const ber_sequence_t SET_OF_Priority_set_of[1] = {
+  { BER_CLASS_APP, 7, BER_FLAGS_NOOWNTAG, dissect_priority_item },
+};
+
+static int
+dissect_x411_SET_OF_Priority(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
+                                 SET_OF_Priority_set_of, hf_index, ett_x411_SET_OF_Priority);
+
+  return offset;
+}
+static int dissect_class_priority_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SET_OF_Priority(TRUE, tvb, offset, pinfo, tree, hf_x411_class_priority);
+}
+
+
+static const value_string x411_T_objects_vals[] = {
+  {   0, "messages" },
+  {   1, "reports" },
+  {   2, "both" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_T_objects(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_objects_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_objects(TRUE, tvb, offset, pinfo, tree, hf_x411_objects);
+}
+
+
+static const asn_namedbit T_source_type_bits[] = {
+  {  0, &hf_x411_T_source_type_originated_by, -1, -1, "originated-by", NULL },
+  {  1, &hf_x411_T_source_type_redirected_by, -1, -1, "redirected-by", NULL },
+  {  2, &hf_x411_T_source_type_dl_expanded_by, -1, -1, "dl-expanded-by", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_T_source_type(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    T_source_type_bits, hf_index, ett_x411_T_source_type,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_source_type(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_source_type(FALSE, tvb, offset, pinfo, tree, hf_x411_source_type);
+}
+
+
+static const value_string x411_ExactOrPattern_vals[] = {
+  {   0, "exact-match" },
+  {   1, "pattern-match" },
+  { 0, NULL }
+};
+
+static const ber_choice_t ExactOrPattern_choice[] = {
+  {   0, BER_CLASS_CON, 0, 0, dissect_exact_match_impl },
+  {   1, BER_CLASS_CON, 1, 0, dissect_pattern_match_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ExactOrPattern(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 ExactOrPattern_choice, hf_index, ett_x411_ExactOrPattern,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_source_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_ExactOrPattern(FALSE, tvb, offset, pinfo, tree, hf_x411_source_name);
+}
+
+
+static const ber_sequence_t Restriction_set[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_BOOLEAN, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_permitted },
+  { BER_CLASS_UNI, BER_UNI_TAG_BITSTRING, BER_FLAGS_NOOWNTAG, dissect_source_type },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_source_name },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_Restriction(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              Restriction_set, hf_index, ett_x411_Restriction);
+
+  return offset;
+}
+static int dissect_applies_only_to_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Restriction(FALSE, tvb, offset, pinfo, tree, hf_x411_applies_only_to_item);
+}
+static int dissect_RestrictedDelivery_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Restriction(FALSE, tvb, offset, pinfo, tree, hf_x411_RestrictedDelivery_item);
+}
+
+
+static const ber_sequence_t SEQUENCE_OF_Restriction_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_applies_only_to_item },
+};
+
+static int
+dissect_x411_SEQUENCE_OF_Restriction(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      SEQUENCE_OF_Restriction_sequence_of, hf_index, ett_x411_SEQUENCE_OF_Restriction);
+
+  return offset;
+}
+static int dissect_applies_only_to_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SEQUENCE_OF_Restriction(TRUE, tvb, offset, pinfo, tree, hf_x411_applies_only_to);
+}
+
+
+static const ber_sequence_t MessageClass_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_content_types_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_maximum_content_length_impl },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_encoded_information_types_constraints_impl },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_security_labels_impl },
+  { BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_class_priority_impl },
+  { BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_objects_impl },
+  { BER_CLASS_CON, 6, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_applies_only_to_impl },
+  { BER_CLASS_CON, 7, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MessageClass(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              MessageClass_set, hf_index, ett_x411_MessageClass);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_DeliverableClass(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MessageClass(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_deliverable_class_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DeliverableClass(FALSE, tvb, offset, pinfo, tree, hf_x411_deliverable_class_item);
+}
+
+
+static const ber_sequence_t SET_OF_DeliverableClass_set_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_deliverable_class_item },
+};
+
+static int
+dissect_x411_SET_OF_DeliverableClass(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
+                                 SET_OF_DeliverableClass_set_of, hf_index, ett_x411_SET_OF_DeliverableClass);
+
+  return offset;
+}
+static int dissect_deliverable_class(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SET_OF_DeliverableClass(FALSE, tvb, offset, pinfo, tree, hf_x411_deliverable_class);
+}
+
+
+
+static int
+dissect_x411_DefaultDeliveryControls(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Controls(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_default_delivery_controls(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DefaultDeliveryControls(FALSE, tvb, offset, pinfo, tree, hf_x411_default_delivery_controls);
+}
+
+
+
+static int
+dissect_x411_RedirectionClass(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_MessageClass(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_redirection_classes_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RedirectionClass(FALSE, tvb, offset, pinfo, tree, hf_x411_redirection_classes_item);
+}
+
+
+static const ber_sequence_t SET_OF_RedirectionClass_set_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_redirection_classes_item },
+};
+
+static int
+dissect_x411_SET_OF_RedirectionClass(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
+                                 SET_OF_RedirectionClass_set_of, hf_index, ett_x411_SET_OF_RedirectionClass);
+
+  return offset;
+}
+static int dissect_redirection_classes_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_SET_OF_RedirectionClass(TRUE, tvb, offset, pinfo, tree, hf_x411_redirection_classes);
+}
+
+
+
+static int
+dissect_x411_RecipientAssignedAlternateRecipient(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOrDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+static int dissect_recipient_assigned_alternate_recipient_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RecipientAssignedAlternateRecipient(TRUE, tvb, offset, pinfo, tree, hf_x411_recipient_assigned_alternate_recipient);
+}
+
+
+static const ber_sequence_t RecipientRedirection_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_redirection_classes_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_recipient_assigned_alternate_recipient_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_RecipientRedirection(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              RecipientRedirection_set, hf_index, ett_x411_RecipientRedirection);
+
+  return offset;
+}
+static int dissect_Redirections_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RecipientRedirection(FALSE, tvb, offset, pinfo, tree, hf_x411_Redirections_item);
+}
+
+
+static const ber_sequence_t Redirections_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_Redirections_item },
+};
+
+static int
+dissect_x411_Redirections(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      Redirections_sequence_of, hf_index, ett_x411_Redirections);
+
+  return offset;
+}
+static int dissect_redirections_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Redirections(TRUE, tvb, offset, pinfo, tree, hf_x411_redirections);
+}
+
+
+static const ber_sequence_t RestrictedDelivery_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_RestrictedDelivery_item },
+};
+
+static int
+dissect_x411_RestrictedDelivery(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      RestrictedDelivery_sequence_of, hf_index, ett_x411_RestrictedDelivery);
+
+  return offset;
+}
+static int dissect_restricted_delivery_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RestrictedDelivery(TRUE, tvb, offset, pinfo, tree, hf_x411_restricted_delivery);
+}
+
+
+static const asn_namedbit T_standard_parameters_bits[] = {
+  {  0, &hf_x411_T_standard_parameters_user_name, -1, -1, "user-name", NULL },
+  {  1, &hf_x411_T_standard_parameters_user_address, -1, -1, "user-address", NULL },
+  {  2, &hf_x411_T_standard_parameters_deliverable_class, -1, -1, "deliverable-class", NULL },
+  {  3, &hf_x411_T_standard_parameters_default_delivery_controls, -1, -1, "default-delivery-controls", NULL },
+  {  4, &hf_x411_T_standard_parameters_redirections, -1, -1, "redirections", NULL },
+  {  5, &hf_x411_T_standard_parameters_restricted_delivery, -1, -1, "restricted-delivery", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_T_standard_parameters(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    T_standard_parameters_bits, hf_index, ett_x411_T_standard_parameters,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_standard_parameters_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_standard_parameters(TRUE, tvb, offset, pinfo, tree, hf_x411_standard_parameters);
+}
+
+
+
+static int
+dissect_x411_T_extensions_item(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+/*XXX not implemented yet */
+
+
+  return offset;
+}
+static int dissect_type_extensions_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_extensions_item(FALSE, tvb, offset, pinfo, tree, hf_x411_type_extensions_item);
+}
+
+
+static const ber_sequence_t T_extensions_set_of[1] = {
+  { BER_CLASS_ANY, 0, BER_FLAGS_NOOWNTAG, dissect_type_extensions_item },
+};
+
+static int
+dissect_x411_T_extensions(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
+                                 T_extensions_set_of, hf_index, ett_x411_T_extensions);
+
+  return offset;
+}
+static int dissect_type_extensions_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_extensions(TRUE, tvb, offset, pinfo, tree, hf_x411_type_extensions);
+}
+
+
+static const ber_sequence_t RegistrationTypes_sequence[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_standard_parameters_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_type_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_RegistrationTypes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   RegistrationTypes_sequence, hf_index, ett_x411_RegistrationTypes);
+
+  return offset;
+}
+static int dissect_retrieve_registrations_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RegistrationTypes(TRUE, tvb, offset, pinfo, tree, hf_x411_retrieve_registrations);
+}
+
+
+static const ber_sequence_t RegisterArgument_set[] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_user_name },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_user_address_impl },
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_deliverable_class },
+  { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL, dissect_default_delivery_controls },
+  { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_redirections_impl },
+  { BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_restricted_delivery_impl },
+  { BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_retrieve_registrations_impl },
+  { BER_CLASS_CON, 6, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_RegisterArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              RegisterArgument_set, hf_index, ett_x411_RegisterArgument);
+
+  return offset;
+}
+static int dissect_registered_information_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RegisterArgument(TRUE, tvb, offset, pinfo, tree, hf_x411_registered_information);
+}
+
+
+static const ber_sequence_t T_non_empty_result_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_registered_information_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_T_non_empty_result(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              T_non_empty_result_set, hf_index, ett_x411_T_non_empty_result);
+
+  return offset;
+}
+static int dissect_non_empty_result(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_T_non_empty_result(FALSE, tvb, offset, pinfo, tree, hf_x411_non_empty_result);
+}
+
+
+static const value_string x411_RegisterResult_vals[] = {
+  {   0, "empty-result" },
+  {   1, "non-empty-result" },
+  { 0, NULL }
+};
+
+static const ber_choice_t RegisterResult_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_empty_result },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_non_empty_result },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_RegisterResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 RegisterResult_choice, hf_index, ett_x411_RegisterResult,
+                                 NULL);
+
+  return offset;
+}
+
+
+static const ber_sequence_t ChangeCredentialsArgument_set[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_old_credentials_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_new_credentials_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ChangeCredentialsArgument(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              ChangeCredentialsArgument_set, hf_index, ett_x411_ChangeCredentialsArgument);
+
+  return offset;
+}
+
+
+static const ber_sequence_t MessageDeliveryEnvelope_sequence[] = {
+  { BER_CLASS_APP, 4, BER_FLAGS_NOOWNTAG, dissect_message_delivery_identifier },
+  { BER_CLASS_UNI, BER_UNI_TAG_UTCTime, BER_FLAGS_NOOWNTAG, dissect_message_delivery_time },
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_other_fields },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_MessageDeliveryEnvelope(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   MessageDeliveryEnvelope_sequence, hf_index, ett_x411_MessageDeliveryEnvelope);
+
+  return offset;
+}
+
+
+static const ber_sequence_t ReportDeliveryEnvelope_set[] = {
+  { BER_CLASS_APP, 4, BER_FLAGS_NOOWNTAG, dissect_subject_submission_identifier },
+  { BER_CLASS_APP, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_content_identifier },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_content_type },
+  { BER_CLASS_APP, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_original_encoded_information_types },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensions_impl },
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_per_recipient_report_delivery_fields },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ReportDeliveryEnvelope(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
+                              ReportDeliveryEnvelope_set, hf_index, ett_x411_ReportDeliveryEnvelope);
+
+  return offset;
+}
+
+
+static const value_string x411_RecipientReassignmentProhibited_vals[] = {
+  {   0, "recipient-reassignment-allowed" },
+  {   1, "recipient-reassignment-prohibited" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_RecipientReassignmentProhibited(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_MTSOriginatorRequestedAlternateRecipient(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOrDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+static const value_string x411_DLExpansionProhibited_vals[] = {
+  {   0, "dl-expansion-allowed" },
+  {   1, "dl-expansion-prohibited" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_DLExpansionProhibited(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+static const value_string x411_ConversionWithLossProhibited_vals[] = {
+  {   0, "conversion-with-loss-allowed" },
+  {   1, "conversion-with-loss-prohibited" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_ConversionWithLossProhibited(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_LatestDeliveryTime(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_Time(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+static const value_string x411_RequestedDeliveryMethod_item_vals[] = {
+  {   0, "any-delivery-method" },
+  {   1, "mhs-delivery" },
+  {   2, "physical-delivery" },
+  {   3, "telex-delivery" },
+  {   4, "teletex-delivery" },
+  {   5, "g3-facsimile-delivery" },
+  {   6, "g4-facsimile-delivery" },
+  {   7, "ia5-terminal-delivery" },
+  {   8, "videotex-delivery" },
+  {   9, "telephone-delivery" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_RequestedDeliveryMethod_item(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_RequestedDeliveryMethod_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RequestedDeliveryMethod_item(FALSE, tvb, offset, pinfo, tree, hf_x411_RequestedDeliveryMethod_item);
+}
+
+
+static const ber_sequence_t RequestedDeliveryMethod_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_RequestedDeliveryMethod_item },
+};
+
+static int
+dissect_x411_RequestedDeliveryMethod(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      RequestedDeliveryMethod_sequence_of, hf_index, ett_x411_RequestedDeliveryMethod);
+
+  return offset;
+}
+
+
+static const value_string x411_PhysicalForwardingProhibited_vals[] = {
+  {   0, "physical-forwarding-allowed" },
+  {   1, "physical-forwarding-prohibited" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_PhysicalForwardingProhibited(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+static const value_string x411_PhysicalForwardingAddressRequest_vals[] = {
+  {   0, "physical-forwarding-address-not-requested" },
+  {   1, "physical-forwarding-address-requested" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_PhysicalForwardingAddressRequest(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+static const asn_namedbit PhysicalDeliveryModes_bits[] = {
+  {  0, &hf_x411_PhysicalDeliveryModes_ordinary_mail, -1, -1, "ordinary-mail", NULL },
+  {  1, &hf_x411_PhysicalDeliveryModes_special_delivery, -1, -1, "special-delivery", NULL },
+  {  2, &hf_x411_PhysicalDeliveryModes_express_mail, -1, -1, "express-mail", NULL },
+  {  3, &hf_x411_PhysicalDeliveryModes_counter_collection, -1, -1, "counter-collection", NULL },
+  {  4, &hf_x411_PhysicalDeliveryModes_counter_collection_with_telephone_advice, -1, -1, "counter-collection-with-telephone-advice", NULL },
+  {  5, &hf_x411_PhysicalDeliveryModes_counter_collection_with_telex_advice, -1, -1, "counter-collection-with-telex-advice", NULL },
+  {  6, &hf_x411_PhysicalDeliveryModes_counter_collection_with_teletex_advice, -1, -1, "counter-collection-with-teletex-advice", NULL },
+  {  7, &hf_x411_PhysicalDeliveryModes_bureau_fax_delivery, -1, -1, "bureau-fax-delivery", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+static int
+dissect_x411_PhysicalDeliveryModes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    PhysicalDeliveryModes_bits, hf_index, ett_x411_PhysicalDeliveryModes,
+                                    NULL);
+
+  return offset;
+}
+
+
+static const value_string x411_RegisteredMailType_vals[] = {
+  {   0, "non-registered-mail" },
+  {   1, "registered-mail" },
+  {   2, "registered-mail-to-addressee-in-person" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_RegisteredMailType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_RecipientNumberForAdvice(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_TeletexString,
+                                            pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_PhysicalRenditionAttributes(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                            NULL);
+
+  return offset;
+}
+
+
+static const ber_sequence_t ORAddress_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_built_in_standard_attributes },
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_built_in_domain_defined_attributes },
+  { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extension_attributes },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ORAddress(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ORAddress_sequence, hf_index, ett_x411_ORAddress);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_OriginatorReturnAddress(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddress(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+static const value_string x411_PhysicalDeliveryReportRequest_vals[] = {
+  {   0, "return-of-undeliverable-mail-by-PDS" },
+  {   1, "return-of-notification-by-PDS" },
+  {   2, "return-of-notification-by-MHS" },
+  {   3, "return-of-notification-by-MHS-and-PDS" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_PhysicalDeliveryReportRequest(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_OriginatorCertificate(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x509af_Certificates(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_ContentConfidentialityAlgorithmIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x509af_AlgorithmIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_ContentIntegrityAlgorithmIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x509af_AlgorithmIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_MessageOriginAuthenticationAlgorithmIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x509af_AlgorithmIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_MessageSecurityLabel(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_SecurityLabel(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+static const value_string x411_ProofOfSubmissionRequest_vals[] = {
+  {   0, "proof-of-submission-not-requested" },
+  {   1, "proof-of-submission-requested" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_ProofOfSubmissionRequest(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+static const value_string x411_ProofOfDeliveryRequest_vals[] = {
+  {   0, "proof-of-delivery-not-requested" },
+  {   1, "proof-of-delivery-requested" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_ProofOfDeliveryRequest(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+
+
+static const value_string x411_ContentCorrelator_vals[] = {
+  {   0, "ia5text" },
+  {   1, "octets" },
+  { 0, NULL }
+};
+
+static const ber_choice_t ContentCorrelator_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_IA5String, BER_FLAGS_NOOWNTAG, dissect_ia5text },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_octets },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_ContentCorrelator(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 ContentCorrelator_choice, hf_index, ett_x411_ContentCorrelator,
+                                 NULL);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_ProbeOriginAuthenticationAlgorithmIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x509af_AlgorithmIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+static const ber_sequence_t IntendedRecipientName_sequence[] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_intended_recipient },
+  { BER_CLASS_UNI, BER_UNI_TAG_UTCTime, BER_FLAGS_NOOWNTAG, dissect_redirection_time },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_IntendedRecipientName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   IntendedRecipientName_sequence, hf_index, ett_x411_IntendedRecipientName);
+
+  return offset;
+}
+static int dissect_intended_recipient_name(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_IntendedRecipientName(FALSE, tvb, offset, pinfo, tree, hf_x411_intended_recipient_name);
+}
+
+
+static const value_string x411_RedirectionReason_vals[] = {
+  {   0, "recipient-assigned-alternate-recipient" },
+  {   1, "originator-requested-alternate-recipient" },
+  {   2, "recipient-MD-assigned-alternate-recipient" },
+  {   3, "directory-look-up" },
+  {   4, "alias" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_x411_RedirectionReason(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_redirection_reason(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_RedirectionReason(FALSE, tvb, offset, pinfo, tree, hf_x411_redirection_reason);
+}
+
+
+static const ber_sequence_t Redirection_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_intended_recipient_name },
+  { BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_NOOWNTAG, dissect_redirection_reason },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_Redirection(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   Redirection_sequence, hf_index, ett_x411_Redirection);
+
+  return offset;
+}
+static int dissect_RedirectionHistory_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_Redirection(FALSE, tvb, offset, pinfo, tree, hf_x411_RedirectionHistory_item);
+}
+
+
+static const ber_sequence_t RedirectionHistory_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_RedirectionHistory_item },
+};
+
+static int
+dissect_x411_RedirectionHistory(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      RedirectionHistory_sequence_of, hf_index, ett_x411_RedirectionHistory);
+
+  return offset;
+}
+
+
+static const ber_sequence_t DLExpansion_sequence[] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_dl },
+  { BER_CLASS_UNI, BER_UNI_TAG_UTCTime, BER_FLAGS_NOOWNTAG, dissect_dl_expansion_time },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_DLExpansion(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   DLExpansion_sequence, hf_index, ett_x411_DLExpansion);
+
+  return offset;
+}
+static int dissect_DLExpansionHistory_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_DLExpansion(FALSE, tvb, offset, pinfo, tree, hf_x411_DLExpansionHistory_item);
+}
+
+
+static const ber_sequence_t DLExpansionHistory_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_DLExpansionHistory_item },
+};
+
+static int
+dissect_x411_DLExpansionHistory(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      DLExpansionHistory_sequence_of, hf_index, ett_x411_DLExpansionHistory);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_PhysicalForwardingAddress(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+static const ber_sequence_t OriginatorAndDLExpansion_sequence[] = {
+  { BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_originator_or_dl_name },
+  { BER_CLASS_UNI, BER_UNI_TAG_UTCTime, BER_FLAGS_NOOWNTAG, dissect_origination_or_expansion_time },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_x411_OriginatorAndDLExpansion(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   OriginatorAndDLExpansion_sequence, hf_index, ett_x411_OriginatorAndDLExpansion);
+
+  return offset;
+}
+static int dissect_OriginatorAndDLExpansionHistory_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_x411_OriginatorAndDLExpansion(FALSE, tvb, offset, pinfo, tree, hf_x411_OriginatorAndDLExpansionHistory_item);
+}
+
+
+static const ber_sequence_t OriginatorAndDLExpansionHistory_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_OriginatorAndDLExpansionHistory_item },
+};
+
+static int
+dissect_x411_OriginatorAndDLExpansionHistory(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      OriginatorAndDLExpansionHistory_sequence_of, hf_index, ett_x411_OriginatorAndDLExpansionHistory);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_ReportingDLName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x411_ORAddressAndOptionalDirectoryName(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+
+
+
+static int
+dissect_x411_ReportingMTACertificate(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_x509af_Certificates(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+  return offset;
+}
+