wireshark/epan/dissectors/packet-rtse.c
Anders Broman 483ec5bd05 From Graeme Lunt:
* DOP - This has now been successfully tested and so is now enabled by default and workaround code removed. 
Also now uses the correct EXPORTs from the other modules/dissectors.

* X509SAT - Most of the selected attributes are now supported in addition to the DirectoryString syntax attributes. This includes restoring the correct DirectoryString syntax and also providing the basic syntaxes (e.g. OBJECT IDENTIFIER, PrintableString). The latter requires a sed line in the Makefile which I assume should be OK? Not all the SAT can be defined in x509sat - so some have been included in x509if and x509af - though x509sat.cnf contains the master list and references the other dissectors where appropriate.

(I still prefer a syntax registration approach but I don't think that is going to be agreed in the short term.)

* X509IF - a mechanism to register some formating, based upon the hf_index, that is used in the cnf file.

* A couple of fixes identified by Stig.

svn path=/trunk/; revision=16814
2005-12-16 06:47:22 +00:00

1086 lines
38 KiB
C

/* 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 */
#line 1 "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];
static gboolean open_request=FALSE;
/* 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 dissector_handle_t rtse_handle = NULL;
static dissector_handle_t ros_handle = NULL;
/*--- Included file: packet-rtse-hf.c ---*/
#line 1 "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 ---*/
#line 65 "packet-rtse-template.c"
/* Initialize the subtree pointers */
static gint ett_rtse = -1;
/*--- Included file: packet-rtse-ett.c ---*/
#line 1 "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 ---*/
#line 69 "packet-rtse-template.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, gboolean uses_ros)
{
/* save the name - but not used */
g_hash_table_insert(oid_table, (gpointer)oid, (gpointer)name);
/* register RTSE with the BER (ACSE) */
register_ber_oid_dissector_handle(oid, rtse_handle, proto, name);
if(uses_ros) {
/* make sure we call ROS ... */
dissector_add_string("rtse.oid", oid, ros_handle);
/* and then tell ROS how to dissect the AS*/
register_ros_oid_dissector_handle(oid, dissector, proto, name, TRUE);
} else {
/* otherwise we just remember how to dissect the AS */
dissector_add_string("rtse.oid", oid, dissector);
}
}
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 ---*/
#line 1 "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_) {
#line 53 "rtse.cnf"
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_) {
#line 143 "rtse.cnf"
tvbuff_t *string = NULL;
offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_TeletexString,
pinfo, tree, tvb, offset, hf_index,
&string);
if(open_request && string && check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, " %s", tvb_format_text(string, 0, tvb_length(string)));
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_) {
#line 159 "rtse.cnf"
tvbuff_t *string = NULL;
offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
&string);
if(open_request && string && check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, " %s", tvb_format_text(string, 0, tvb_length(string)));
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_) {
#line 151 "rtse.cnf"
tvbuff_t *string = NULL;
offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_UTCTime,
pinfo, tree, tvb, offset, hf_index,
&string);
if(open_request && string && check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, " %s", tvb_format_text(string, 0, tvb_length(string)));
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_) {
#line 136 "rtse.cnf"
if(open_request && check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, "Recover");
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_) {
#line 132 "rtse.cnf"
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_) {
#line 38 "rtse.cnf"
if((session = (struct SESSION_DATA_STRUCTURE*)(pinfo->private_data)) != NULL)
session->ros_op = (ROS_OP_BIND | ROS_OP_ARGUMENT);
open_request=TRUE;
offset = dissect_ber_set(implicit_tag, pinfo, tree, tvb, offset,
RTORQapdu_set, hf_index, ett_rtse_RTORQapdu);
open_request=FALSE;
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_) {
#line 46 "rtse.cnf"
if((session = (struct SESSION_DATA_STRUCTURE*)(pinfo->private_data)) != NULL)
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_) {
#line 9 "rtse.cnf"
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) {
if((session = (struct SESSION_DATA_STRUCTURE*)(pinfo->private_data)) != NULL)
session->ros_op = (ROS_OP_BIND | ROS_OP_ERROR);
offset = call_rtse_oid_callback(oid, tvb, offset, pinfo, top_tree ? top_tree : tree);
}
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_) {
#line 80 "rtse.cnf"
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_) {
#line 35 "rtse.cnf"
/*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_) {
#line 115 "rtse.cnf"
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)) != NULL) {
g_snprintf(object_identifier_id, MAX_OID_STR_LEN, "%s", 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_) {
#line 128 "rtse.cnf"
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 }
};
int
dissect_rtse_EXTERNAL(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
#line 97 "rtse.cnf"
gint8 class;
gboolean pc, ind_field;
gint32 tag;
guint32 len1;
if(!implicit_tag) {
/* 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 ---*/
#line 125 "packet-rtse-template.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 ---*/
#line 1 "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_OID, 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 ---*/
#line 182 "packet-rtse-template.c"
};
/* List of subtrees */
static gint *ett[] = {
&ett_rtse,
&ett_rtse_unknown,
/*--- Included file: packet-rtse-ettarr.c ---*/
#line 1 "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 ---*/
#line 189 "packet-rtse-template.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);
rtse_handle = find_dissector("rtse");
ros_handle = find_dissector("ros");
}
/*--- proto_reg_handoff_rtse --- */
void proto_reg_handoff_rtse(void) {
}