summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-giop.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-giop.h
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-giop.h')
-rw-r--r--epan/dissectors/packet-giop.h615
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 */