diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
commit | e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch) | |
tree | 68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-giop.h | |
parent | Initial commit. (diff) | |
download | wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip |
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-giop.h')
-rw-r--r-- | epan/dissectors/packet-giop.h | 615 |
1 files changed, 615 insertions, 0 deletions
diff --git a/epan/dissectors/packet-giop.h b/epan/dissectors/packet-giop.h new file mode 100644 index 00000000..7b07e112 --- /dev/null +++ b/epan/dissectors/packet-giop.h @@ -0,0 +1,615 @@ +/* packet-giop.h + * Declaration of routines for GIOP/IIOP (CDR) dissection + * Copyright 2000, Frank Singleton <frank.singleton@ericsson.com> + * + * Based on CORBAv2.4.2 Chapter 15 GIOP Description. + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef PACKET_GIOP_H +#define PACKET_GIOP_H + +#include "ws_symbol_export.h" + +/* + * Useful visible data/structs + */ + +#define GIOP_HEADER_SIZE 12 +#define GIOP_MAGIC_NUMBER 0x47494F50 /* "GIOP" */ + +typedef struct Version { + guint8 major; + guint8 minor; +} Version; + + +/* + * Useful data collected from message header. Note, this + * struct encapsulates useful data from GIOP header, as well + * as request_id and reply_status for use by sub dissectors. + */ + +typedef struct MessageHeader { + + /* Common Data */ + + guint8 magic[4]; + Version GIOP_version; + guint8 flags; /* byte_order in 1.0 */ + guint8 message_type; + guint32 message_size; + + /* MSG dependent data */ + + guint32 req_id; /* request id in MSG */ + guint32 rep_status; /* reply status in MSG if available */ + gchar *exception_id; /* exception string if a USER EXCEPTION occurs */ + +} MessageHeader; + +typedef enum MsgType { + Request = 0, + Reply, + CancelRequest, + LocateRequest, + LocateReply, + CloseConnection, + MessageError, + Fragment /* GIOP 1.1 only */ + +} MsgType; + + + +/* + * Reply Status + * + */ + +typedef enum ReplyStatusType { + NO_EXCEPTION = 0, + USER_EXCEPTION, + SYSTEM_EXCEPTION, + LOCATION_FORWARD, + LOCATION_FORWARD_PERM, /* new for GIOP 1.2 */ + NEEDS_ADDRESSING_MODE /* new for GIOP 1.2 */ +} ReplyStatusType; + +/* + * Prototype for sub dissector function calls. + */ + +typedef gboolean (giop_sub_dissector_t)(tvbuff_t *, packet_info *, proto_tree *, int *, + MessageHeader *, const gchar * , gchar *); + +/* + * Generic Subdissector handle, wraps user info. + */ + +typedef struct giop_sub_handle { + giop_sub_dissector_t *sub_fn; /* ptr to sub dissector function */ + const gchar *sub_name; /* subdissector string name */ + protocol_t *sub_proto; /* protocol_t for subprotocol */ +} giop_sub_handle_t; + +/* Main GIOP entry point */ + +extern gboolean dissect_giop(tvbuff_t *, packet_info *, proto_tree *); /* new interface */ + +/* + * GIOP Users register interest via this function. + * This is for heuristic dissection + */ + +WS_DLL_PUBLIC void register_giop_user(giop_sub_dissector_t *sub, const gchar *name, + int sub_proto); + +/* + * GIOP Users remove interest via this function. + * This is for heuristic dissection + */ + +extern void delete_giop_user(giop_sub_dissector_t *sub, gchar *name); + + +/* + * GIOP Users register their module and interface names via this function. + * This is for explicit dissection. + */ + +WS_DLL_PUBLIC void register_giop_user_module(giop_sub_dissector_t *sub, const gchar *name, + const gchar *module, int sub_proto); + +/* + * GIOP Users remove their module and interface names via this function. + * This is for explicit dissection. + */ + +extern void delete_giop_user_module(giop_sub_dissector_t *sub, gchar *name, + gchar *module); + + +/* + * General CDR accessors start here. They are listed in alphabetical + * order. They may however, belong to 1 of 3 distinct CDR data types. + * + * - Primitive + * - OMG IDL Constructed Types + * - Pseudo Object Types + * + * + * Altough some of these look redundant, I have separated them + * out for all CDR types, to assist in auto generation of + * IDL dissectors later, see idl2wrs -- FS + * + */ + + +/* + * Gets data of type any. This is encoded as a TypeCode + * followed by the encoded value. + * + * Data is added to tree directly if present. + */ + +WS_DLL_PUBLIC void get_CDR_any(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, + gint *offset, gboolean stream_is_big_endian, + int boundary, MessageHeader * header); + + +/* Copy a 1 octet sequence from the tvbuff + * which represents a boolean value, and convert + * it to a boolean value. + * Offset is then incremented by 1, to indicate the 1 octet which + * has been processed. + */ + +WS_DLL_PUBLIC gboolean get_CDR_boolean(tvbuff_t *tvb, int *offset); + + +/* Copy a 1 octet sequence from the tvbuff + * which represents a char, and convert + * it to an char value. + * offset is then incremented by 1, to indicate the 1 octet which + * has been processed. + */ + +WS_DLL_PUBLIC guint8 get_CDR_char(tvbuff_t *tvb, int *offset); + + + +/* + * Floating Point Data Type double IEEE 754-1985 + * + * Copy an 8 octet sequence from the tvbuff + * which represents a double value, and convert + * it to a double value, taking into account byte order. + * offset is first incremented so that it falls on a proper alignment + * boundary for double values. + * offset is then incremented by 8, to indicate the 8 octets which + * have been processed. + */ + +WS_DLL_PUBLIC gdouble get_CDR_double(tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary); + + +/* Copy a 4 octet sequence from the tvbuff + * which represents an enum value, and convert + * it to an enum value, taking into account byte order. + * offset is first incremented so that it falls on a proper alignment + * boundary for an enum (4) + * offset is then incremented by 4, to indicate the 4 octets which + * have been processed. + * + * Enum values are encoded as unsigned long. + */ + +WS_DLL_PUBLIC guint32 get_CDR_enum(tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary); + + + +/* + * Copy an octet sequence from the tvbuff + * which represents a Fixed point decimal type, and create a string representing + * a Fixed point decimal type. There are no alignment restrictions. + * Size and scale of fixed decimal type is determined by IDL. + * + * digits - IDL specified number of "digits" for this fixed type + * scale - IDL specified "scale" for this fixed type + * + * + * eg: typedef fixed <5,2> fixed_t; + * could represent numbers like 123.45, 789.12, + * + * + * As the fixed type could be any size, I will not try to fit it into our + * simple types like gdouble or glong etc. I will just create a string buffer holding + * a representation (after scale is applied), and with a decimal point or zero padding + * inserted at the right place if necessary. The string is null terminated + * + * so string may look like + * + * + * "+1.234" or "-3456.78" or "1234567309475760377365465897891" or "-2789000000" etc + * + * According to spec, digits <= 31 + * and scale is positive (except for constants eg: 1000 has digit=1 and implied scale = -3) + * or <4,0> ? + * + */ + +WS_DLL_PUBLIC void get_CDR_fixed(tvbuff_t *tvb, packet_info *pinfo, proto_item *item, + gchar **seq, gint *offset, guint32 digits, gint32 scale); + + +/* + * Floating Point Data Type float IEEE 754-1985 + * + * Copy a 4 octet sequence from the tvbuff + * which represents a float value, and convert + * it to a float value, taking into account byte order. + * offset is first incremented so that it falls on a proper alignment + * boundary for float values. + * offset is then incremented by 4, to indicate the 4 octets which + * have been processed. + */ + +WS_DLL_PUBLIC gfloat get_CDR_float(tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary); + + +/* + * Decode an Interface type, and display it on the tree. + */ + +WS_DLL_PUBLIC void get_CDR_interface(tvbuff_t *tvb, packet_info *pinfo, + proto_tree *tree, int *offset, gboolean stream_is_big_endian, int boundary); + + +/* Copy a 4 octet sequence from the tvbuff + * which represents a signed long value, and convert + * it to an signed long vaule, taking into account byte order. + * offset is first incremented so that it falls on a proper alignment + * boundary for long values. + * offset is then incremented by 4, to indicate the 4 octets which + * have been processed. + */ + +WS_DLL_PUBLIC gint32 get_CDR_long(tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary); + + + +/* Copy a 16 octet sequence from the tvbuff + * which represents a long double value, and convert + * it to a long double value, taking into account byte order. + * offset is first incremented so that it falls on a proper alignment + * boundary for long double values. + * offset is then incremented by 16, to indicate the 16 octets which + * have been processed. + */ + +#ifdef G_HAVE_GLONG_DOUBLE + +WS_DLL_PUBLIC glong_double get_CDR_long_double(tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary); +#else + +/* FIX -- Cast long double to gdouble until I figure this out -- FS*/ + +WS_DLL_PUBLIC gdouble get_CDR_long_double(tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary); + +#endif + + +/* Copy an 8 octet sequence from the tvbuff + * which represents a signed long long value, and convert + * it to a signed long long value, taking into account byte order. + * offset is first incremented so that it falls on a proper alignment + * boundary for long long values. + * offset is then incremented by 8, to indicate the 8 octets which + * have been processed. + */ + +WS_DLL_PUBLIC gint64 get_CDR_long_long(tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary); + +/* + * Decode an Object type, and display it on the tree. + */ + +WS_DLL_PUBLIC void get_CDR_object(tvbuff_t *tvb, packet_info *pinfo, + proto_tree *tree, int *offset, gboolean stream_is_big_endian, int boundary); + + +/* Copy a 1 octet sequence from the tvbuff + * which represents a octet, and convert + * it to an octet value. + * offset is then incremented by 1, to indicate the 1 octet which + * has been processed. + */ + +WS_DLL_PUBLIC guint8 get_CDR_octet(tvbuff_t *tvb, int *offset); + + +/* Copy a sequence of octets from the tvbuff. + * Memory is allocated in packet pool and will be + * automatically freed once the packet dissection is finished. + * This function also increments offset by len. + */ + +WS_DLL_PUBLIC void get_CDR_octet_seq(tvbuff_t *tvb, const guint8 **seq, int *offset, guint32 len); + +/* Copy a 2 octet sequence from the tvbuff + * which represents a signed short value, and convert + * it to a signed short value, taking into account byte order. + * offset is first incremented so that it falls on a proper alignment + * boundary for short values. + * offset is then incremented by 2, to indicate the 2 octets which + * have been processed. + */ + +WS_DLL_PUBLIC gint16 get_CDR_short(tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary); + + +WS_DLL_PUBLIC void giop_add_CDR_string(proto_tree *tree, tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary, + int hf); + +/* Copy an octet sequence from the tvbuff + * which represents a string, and convert + * it to an string value, taking into account byte order. + * offset is first incremented so that it falls on a proper alignment + * boundary for string values. (begins with an unsigned long LI) + * + * String sequence is copied to a buffer "seq". + * Memory is allocated in packet pool and will be + * automatically freed once the packet dissection is finished. + * offset is then incremented , to indicate the octets which + * have been processed. + * + * returns number of octets in the sequence + * + * Note: This function only supports single byte encoding at the + * moment until I get a handle on multibyte encoding etc. + * + */ + +WS_DLL_PUBLIC guint32 get_CDR_string(tvbuff_t *tvb, const gchar **seq, int *offset, + gboolean stream_is_big_endian, int boundary); + + +/* Process a sequence of octets that represent the + * Pseudo Object Type "TypeCode". Typecodes are used for example, + * by "Any values". + * This function also increments offset to the correct position. + * + * It will parse the TypeCode and output data to the "tree" provided + * by the user + * + * It returns a guint32 representing a TCKind value. + */ + +WS_DLL_PUBLIC guint32 get_CDR_typeCode(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, gint *offset, + gboolean stream_is_big_endian, int boundary, MessageHeader * header ); + + +/* Copy a 4 octet sequence from the tvbuff + * which represents an unsigned long value, and convert + * it to an unsigned long value, taking into account byte order. + * offset is first incremented so that it falls on a proper alignment + * boundary for unsigned long values. + * offset is then incremented by 4, to indicate the 4 octets which + * have been processed. + */ + +WS_DLL_PUBLIC guint32 get_CDR_ulong(tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary); + + +/* Copy an 8 octet sequence from the tvbuff + * which represents an unsigned long long value, and convert + * it to an unsigned long long value, taking into account byte order. + * offset is first incremented so that it falls on a proper alignment + * boundary for unsigned long long values. + * offset is then incremented by 8, to indicate the 8 octets which + * have been processed. + */ + +WS_DLL_PUBLIC guint64 get_CDR_ulong_long(tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary); + +/* Copy a 2 octet sequence from the tvbuff + * which represents an unsigned short value, and convert + * it to an unsigned short value, taking into account byte order. + * offset is first incremented so that it falls on a proper alignment + * boundary for unsigned short values. + * offset is then incremented by 2, to indicate the 2 octets which + * have been processed. + */ + +WS_DLL_PUBLIC guint16 get_CDR_ushort(tvbuff_t *tvb, int *offset, + gboolean stream_is_big_endian, int boundary); + + +/* Copy a wchar from the tvbuff. + * Memory is allocated in packet pool and will be + * automatically freed once the packet dissection is finished. + * This function also increments offset according to + * the wchar size. + * + * For GIOP 1.1 read 2 octets and return size -2. The + * negation means there is no size element in the packet + * and therefore no size to add to the tree. + * + * For GIOP 1.2 read size of wchar and the size + * octets. size is returned as a gint8. + * + * For both GIOP versions the wchar is returned + * as a printable string. + * + */ + +/* NOTE: This is very primitive in that it just reads + * the wchar as a series of octets and returns them + * to the user. No translation is attempted based on + * byte orientation, nor on code set. I.e it only + * really reads past the wchar and increments the offset + * by the length of the octet sequence. + */ + +/* The "decoding" is done according to CORBA chapter 15. + * Wchar is not supported for GIOP 1.0. + */ + +WS_DLL_PUBLIC gint get_CDR_wchar(tvbuff_t *tvb, const gchar **seq, int *offset, + MessageHeader * header); + + +/* Copy a wstring from the tvbuff. + * Memory is allocated in packet pool and will be + * automatically freed once the packet dissection is finished. + * This function also increments offset, according to + * wstring length. length is returned as guint32 + */ + +/* NOTE: This is very primitive in that it just reads + * the wstring as a series of octets and returns them + * to the user. No translation is attempted based on + * byte orientation, nor on code set. I.e it only + * really reads past the wstring and increments the offset + * by the length of the octet sequence. + */ + +/* The "decoding" is done according to CORBA chapter 15. + * Wstring is not supported for GIOP 1.0. + */ + +WS_DLL_PUBLIC guint32 get_CDR_wstring(tvbuff_t *tvb, const gchar **seq, int *offset, + gboolean stream_is_big_endian, int boundary, MessageHeader * header); + + + +/* + * + * End of get_CDR_xxx accessors. + * + */ + + + +/* Determine the byte order from the GIOP MessageHeader */ + +WS_DLL_PUBLIC gboolean is_big_endian (MessageHeader * header); + +/* + * get_encap_info() for any encapsulation (eg:sequences) + * we come across. updates the new boundary and endianess + * and *offset, and returns the sequence length. + */ + +WS_DLL_PUBLIC guint32 get_CDR_encap_info(tvbuff_t *tvb, proto_tree *tree, gint *offset, + gboolean old_stream_is_big_endian, guint32 old_boundary, + gboolean *new_stream_is_big_endian_ptr, guint32 *new_boundary_ptr ); + +/* Take in an array of guint8 and create a new ephemeral string. + * Replace non-printable characters with periods. + * + * The array may contain \0's so don't use strdup + * The string is \0 terminated, and thus longer than + * the initial sequence. + */ + +WS_DLL_PUBLIC gchar * make_printable_string (const guint8 *in, guint32 len); + +/* + * Enums for TCkind + */ + +enum TCKind { + tk_null = 0, + tk_void, + tk_short, + tk_long, + tk_ushort, + tk_ulong, + tk_float, + tk_double, + tk_boolean, + tk_char, + tk_octet, + tk_any, + tk_TypeCode, + tk_Principal, + tk_objref, + tk_struct, + tk_union, + tk_enum, + tk_string, + tk_sequence, + tk_array, + tk_alias, + tk_except, + tk_longlong, + tk_ulonglong, + tk_longdouble, + tk_wchar, + tk_wstring, + tk_fixed, + tk_value, + tk_value_box, + tk_native, + tk_abstract_interface + + /* - none - 0xffffffff TODO */ +}; + +#define tk_none 0xffffffff + +typedef enum TCKind TCKind_t; + + +/* + * ServiceId's for ServiceContextList + * + * Chapter 13 Corba 2.4.2 + */ + +#define IOP_ServiceId_TransactionService 0 +#define IOP_ServiceId_CodeSets 1 +#define IOP_ServiceId_ChainBypassCheck 2 +#define IOP_ServiceId_ChainBypassInfo 3 +#define IOP_ServiceId_LogicalThreadId 4 +#define IOP_ServiceId_BI_DIR_IIOP 5 +#define IOP_ServiceId_SendingContextRunTime 6 +#define IOP_ServiceId_INVOCATION_POLICIES 7 +#define IOP_ServiceId_FORWARD_IDENTITY 8 +#define IOP_ServiceId_UnknownExceptionInfo 9 + +/* Used for GIOP statistics */ +typedef struct _giop_info_value_t { + guint32 framenum; + address *server_addr; + const gchar *client_host; + const gchar *service_host; + const gchar *giop_op; + const gchar *giop_resp; + time_t time_ticks; + guint time_ms; + gboolean first_pass; +} giop_info_value_t; + + +#define GIOP_TAP_NAME "giop" + +#endif /* PACKET_GIOP_H */ |