1999-07-07 22:52:57 +00:00
|
|
|
/* proto.h
|
|
|
|
* Definitions for protocol display
|
|
|
|
*
|
2001-04-02 00:38:36 +00:00
|
|
|
* $Id: proto.h,v 1.11 2001/04/02 00:38:34 hagbard Exp $
|
1999-07-07 22:52:57 +00:00
|
|
|
*
|
|
|
|
* Ethereal - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@zing.org>
|
|
|
|
* 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 __PROTO_H__
|
|
|
|
#define __PROTO_H__
|
|
|
|
|
|
|
|
#ifdef HAVE_SYS_TIME_H
|
2000-08-11 13:37:21 +00:00
|
|
|
# include <sys/time.h>
|
1999-07-07 22:52:57 +00:00
|
|
|
#endif
|
|
|
|
|
2000-08-10 16:04:33 +00:00
|
|
|
#ifdef HAVE_STDARG_H
|
|
|
|
# include <stdarg.h>
|
|
|
|
#else
|
|
|
|
# include <varargs.h>
|
|
|
|
#endif
|
|
|
|
|
1999-07-13 02:53:26 +00:00
|
|
|
#ifdef HAVE_WINSOCK_H
|
1999-09-12 14:34:36 +00:00
|
|
|
# include <winsock.h>
|
1999-07-13 02:53:26 +00:00
|
|
|
#endif
|
|
|
|
|
1999-11-15 06:32:38 +00:00
|
|
|
#include "ipv4.h"
|
2000-05-11 08:18:09 +00:00
|
|
|
#include "tvbuff.h"
|
2001-02-01 20:21:25 +00:00
|
|
|
#include "ftypes/ftypes.h"
|
2000-05-11 08:18:09 +00:00
|
|
|
|
1999-07-07 22:52:57 +00:00
|
|
|
/* needs glib.h */
|
2000-05-30 09:52:30 +00:00
|
|
|
typedef GNode proto_tree;
|
|
|
|
typedef GNode proto_item;
|
1999-07-07 22:52:57 +00:00
|
|
|
struct value_string;
|
|
|
|
|
|
|
|
#define ITEM_LABEL_LENGTH 240
|
|
|
|
|
|
|
|
/* In order to make a const value_string[] look like a value_string*, I
|
|
|
|
* need this macro */
|
|
|
|
#define VALS(x) (struct value_string*)(x)
|
|
|
|
|
1999-10-12 06:21:15 +00:00
|
|
|
/* ... and similarly, */
|
|
|
|
#define TFS(x) (struct true_false_string*)(x)
|
1999-07-07 22:52:57 +00:00
|
|
|
|
Add the "Edit:Protocols..." feature which currently only implements
the following:
It is now possible to enable/disable a particular protocol decoding
(i.e. the protocol dissector is void or not). When a protocol
is disabled, it is displayed as Data and of course, all linked
sub-protocols are disabled as well.
Disabling a protocol could be interesting:
- in case of buggy dissectors
- in case of wrong heuristics
- for performance reasons
- to decode the data as another protocol (TODO)
Currently (if I am not wrong), all dissectors but NFS can be disabled
(and dissectors that do not register protocols :-)
I do not like the way the RPC sub-dissectors are disabled (in the
sub-dissectors) since this could be done in the RPC dissector itself,
knowing the sub-protocol hfinfo entry (this is why, I've not modified
the NFS one yet).
Two functions are added in proto.c :
gboolean proto_is_protocol_enabled(int n);
void proto_set_decoding(int n, gboolean enabled);
and two MACROs which can be used in dissectors:
OLD_CHECK_DISPLAY_AS_DATA(index, pd, offset, fd, tree)
CHECK_DISPLAY_AS_DATA(index, tvb, pinfo, tree)
See also the XXX in proto_dlg.c and proto.c around the new functions.
svn path=/trunk/; revision=2267
2000-08-13 14:09:15 +00:00
|
|
|
/* check protocol activation */
|
|
|
|
#define OLD_CHECK_DISPLAY_AS_DATA(index, pd, offset, fd, tree) {\
|
|
|
|
if (!proto_is_protocol_enabled(index)) { \
|
|
|
|
old_dissect_data(pd, offset, fd, tree); \
|
|
|
|
return; \
|
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define CHECK_DISPLAY_AS_DATA(index, tvb, pinfo, tree) { \
|
|
|
|
if (!proto_is_protocol_enabled(index)) { \
|
2000-11-16 07:35:43 +00:00
|
|
|
dissect_data(tvb, 0, pinfo, tree); \
|
Add the "Edit:Protocols..." feature which currently only implements
the following:
It is now possible to enable/disable a particular protocol decoding
(i.e. the protocol dissector is void or not). When a protocol
is disabled, it is displayed as Data and of course, all linked
sub-protocols are disabled as well.
Disabling a protocol could be interesting:
- in case of buggy dissectors
- in case of wrong heuristics
- for performance reasons
- to decode the data as another protocol (TODO)
Currently (if I am not wrong), all dissectors but NFS can be disabled
(and dissectors that do not register protocols :-)
I do not like the way the RPC sub-dissectors are disabled (in the
sub-dissectors) since this could be done in the RPC dissector itself,
knowing the sub-protocol hfinfo entry (this is why, I've not modified
the NFS one yet).
Two functions are added in proto.c :
gboolean proto_is_protocol_enabled(int n);
void proto_set_decoding(int n, gboolean enabled);
and two MACROs which can be used in dissectors:
OLD_CHECK_DISPLAY_AS_DATA(index, pd, offset, fd, tree)
CHECK_DISPLAY_AS_DATA(index, tvb, pinfo, tree)
See also the XXX in proto_dlg.c and proto.c around the new functions.
svn path=/trunk/; revision=2267
2000-08-13 14:09:15 +00:00
|
|
|
return; \
|
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
1999-10-12 06:21:15 +00:00
|
|
|
enum {
|
|
|
|
BASE_NONE,
|
|
|
|
BASE_DEC,
|
|
|
|
BASE_HEX,
|
|
|
|
BASE_OCT,
|
|
|
|
BASE_BIN
|
|
|
|
};
|
|
|
|
|
2001-02-01 20:21:25 +00:00
|
|
|
typedef struct _header_field_info header_field_info;
|
|
|
|
|
1999-07-15 15:33:52 +00:00
|
|
|
/* information describing a header field */
|
2001-02-01 20:21:25 +00:00
|
|
|
struct _header_field_info {
|
|
|
|
/* ---------- set by dissector --------- */
|
1999-07-07 22:52:57 +00:00
|
|
|
char *name;
|
|
|
|
char *abbrev;
|
|
|
|
enum ftenum type;
|
2000-03-12 04:48:32 +00:00
|
|
|
int display; /* for integers only, so far. Base */
|
1999-10-12 06:21:15 +00:00
|
|
|
void *strings; /* val_string or true_false_string */
|
|
|
|
guint32 bitmask;
|
|
|
|
char *blurb; /* Brief description of field. */
|
|
|
|
|
2001-02-01 20:21:25 +00:00
|
|
|
/* ---------- set by proto routines --------- */
|
|
|
|
int id; /* Field ID */
|
1999-10-12 06:21:15 +00:00
|
|
|
int parent; /* parent protocol */
|
|
|
|
int bitshift; /* bits to shift */
|
2001-02-13 18:34:51 +00:00
|
|
|
header_field_info *same_name_next; /* Link to next hfinfo with same abbrev*/
|
|
|
|
header_field_info *same_name_prev; /* Link to previous hfinfo with same abbrev*/
|
2001-02-01 20:21:25 +00:00
|
|
|
};
|
1999-07-07 22:52:57 +00:00
|
|
|
|
2000-04-03 09:24:12 +00:00
|
|
|
|
|
|
|
|
1999-07-07 22:52:57 +00:00
|
|
|
/* Used when registering many fields at once */
|
|
|
|
typedef struct hf_register_info {
|
|
|
|
int *p_id; /* pointer to int; written to by register() function */
|
1999-07-15 15:33:52 +00:00
|
|
|
header_field_info hfinfo;
|
1999-07-07 22:52:57 +00:00
|
|
|
} hf_register_info;
|
|
|
|
|
|
|
|
|
|
|
|
/* Info stored in each proto_item GNode */
|
|
|
|
typedef struct field_info {
|
2001-02-01 20:21:25 +00:00
|
|
|
header_field_info *hfinfo;
|
1999-07-07 22:52:57 +00:00
|
|
|
gint start;
|
|
|
|
gint length;
|
|
|
|
gint tree_type; /* ETT_* */
|
|
|
|
char *representation; /* for GUI tree */
|
|
|
|
int visible;
|
2001-02-01 20:21:25 +00:00
|
|
|
fvalue_t *value;
|
2001-03-23 14:44:04 +00:00
|
|
|
gchar *ds_name; /* data source name */
|
1999-07-07 22:52:57 +00:00
|
|
|
} field_info;
|
|
|
|
|
|
|
|
|
2000-05-11 08:18:09 +00:00
|
|
|
/* For use while converting dissectors to use tvbuff's */
|
|
|
|
#define NullTVB NULL
|
|
|
|
|
1999-08-26 06:20:50 +00:00
|
|
|
/* Sets up memory used by proto routines. Called at program startup */
|
2001-04-02 00:38:36 +00:00
|
|
|
void proto_init(const char *plugin_dir, void (register_all_protocols)(void),
|
|
|
|
void (register_all_handoffs)(void));
|
1999-08-26 06:20:50 +00:00
|
|
|
|
|
|
|
/* Frees memory used by proto routines. Called at program shutdown */
|
|
|
|
void proto_cleanup(void);
|
|
|
|
|
2000-01-22 04:59:55 +00:00
|
|
|
/* Set text of proto_item after having already been created. */
|
2000-03-07 05:54:52 +00:00
|
|
|
#if __GNUC__ == 2
|
|
|
|
void proto_item_set_text(proto_item *ti, const char *format, ...)
|
|
|
|
__attribute__((format (printf, 2, 3)));
|
|
|
|
#else
|
|
|
|
void proto_item_set_text(proto_item *ti, const char *format, ...);
|
|
|
|
#endif
|
2000-01-22 04:59:55 +00:00
|
|
|
|
1999-10-12 06:21:15 +00:00
|
|
|
/* Set length of proto_item after having already been created. */
|
1999-07-07 22:52:57 +00:00
|
|
|
void proto_item_set_len(proto_item *ti, gint length);
|
1999-10-12 06:21:15 +00:00
|
|
|
|
2000-07-27 06:41:59 +00:00
|
|
|
/* Get length of proto_item. Useful after using proto_tree_add_item()
|
|
|
|
* to add a variable-length field (e.g., FT_NSTRING_UINT8) */
|
|
|
|
int proto_item_get_len(proto_item *ti);
|
|
|
|
|
1999-10-12 06:21:15 +00:00
|
|
|
/* Creates new proto_tree root */
|
1999-07-07 22:52:57 +00:00
|
|
|
proto_tree* proto_tree_create_root(void);
|
1999-10-12 06:21:15 +00:00
|
|
|
|
|
|
|
/* Clear memory for entry proto_tree. Clears proto_tree struct also. */
|
1999-07-07 22:52:57 +00:00
|
|
|
void proto_tree_free(proto_tree *tree);
|
1999-10-12 06:21:15 +00:00
|
|
|
|
|
|
|
/* Create a subtree under an existing item; returns tree pointer */
|
1999-07-07 22:52:57 +00:00
|
|
|
proto_tree* proto_item_add_subtree(proto_item *ti, gint idx);
|
|
|
|
|
|
|
|
int
|
|
|
|
proto_register_field(char *name, char *abbrev, enum ftenum type, int parent,
|
|
|
|
struct value_string* vals);
|
|
|
|
|
|
|
|
int
|
2001-01-03 06:56:03 +00:00
|
|
|
proto_register_protocol(char *name, char *short_name, char *filter_name);
|
1999-07-07 22:52:57 +00:00
|
|
|
|
|
|
|
void
|
1999-07-15 15:33:52 +00:00
|
|
|
proto_register_field_array(int parent, hf_register_info *hf, int num_records);
|
1999-07-07 22:52:57 +00:00
|
|
|
|
1999-11-16 11:44:20 +00:00
|
|
|
void
|
|
|
|
proto_register_subtree_array(gint **indices, int num_indices);
|
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add an item to a proto_tree, using the text label registered to that item;
|
|
|
|
the item is extracted from the tvbuff handed to it. */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_item(proto_tree *tree, int hfindex, tvbuff_t *tvb,
|
|
|
|
gint start, gint length, gboolean little_endian);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_item_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb,
|
|
|
|
gint start, gint length, gboolean little_endian);
|
|
|
|
|
|
|
|
/* Add a FT_NONE to a proto_tree */
|
2000-03-12 04:48:32 +00:00
|
|
|
#if __GNUC__ == 2
|
1999-07-07 22:52:57 +00:00
|
|
|
proto_item *
|
2001-02-01 20:21:25 +00:00
|
|
|
proto_tree_add_none_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, const char *format, ...)
|
|
|
|
__attribute__((format (printf, 6, 7)));
|
|
|
|
#else
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_none_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, const char *format, ...);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Add a FT_PROTOCOL to a proto_tree */
|
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_protocol_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, const char *format, ...)
|
2000-05-11 08:18:09 +00:00
|
|
|
__attribute__((format (printf, 6, 7)));
|
2000-03-12 04:48:32 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_protocol_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, const char *format, ...);
|
|
|
|
#endif
|
1999-07-07 22:52:57 +00:00
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add a FT_BYTES to a proto_tree */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_bytes(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, const guint8* start_ptr);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_bytes_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, const guint8* start_ptr);
|
2000-03-12 04:48:32 +00:00
|
|
|
|
|
|
|
#if __GNUC__ == 2
|
2000-01-22 04:59:55 +00:00
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_bytes_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-14 06:03:26 +00:00
|
|
|
gint length, const guint8* start_ptr, const char *format, ...)
|
2000-05-11 08:18:09 +00:00
|
|
|
__attribute__((format (printf, 7, 8)));
|
2000-03-12 04:48:32 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_bytes_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-14 06:03:26 +00:00
|
|
|
gint length, const guint8* start_ptr, const char *format, ...);
|
2000-03-12 04:48:32 +00:00
|
|
|
#endif
|
2000-01-22 04:59:55 +00:00
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add a FT_*TIME to a proto_tree */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_time(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, struct timeval* value_ptr);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_time_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, struct timeval* value_ptr);
|
|
|
|
|
2000-03-12 04:48:32 +00:00
|
|
|
#if __GNUC__ == 2
|
1999-07-07 22:52:57 +00:00
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_time_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, struct timeval* value_ptr, const char *format, ...)
|
2000-05-11 08:18:09 +00:00
|
|
|
__attribute__((format (printf, 7, 8)));
|
2000-03-12 04:48:32 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_time_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, struct timeval* value_ptr, const char *format, ...);
|
|
|
|
#endif
|
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add a FT_IPXNET to a proto_tree */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_ipxnet(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, guint32 value);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_ipxnet_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, guint32 value);
|
|
|
|
|
2000-03-12 04:48:32 +00:00
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_ipxnet_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, guint32 value, const char *format, ...)
|
2000-05-11 08:18:09 +00:00
|
|
|
__attribute__((format (printf, 7, 8)));
|
2000-03-12 04:48:32 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_ipxnet_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, guint32 value, const char *format, ...);
|
|
|
|
#endif
|
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add a FT_IPv4 to a proto_tree */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_ipv4(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, guint32 value);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_ipv4_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, guint32 value);
|
|
|
|
|
2000-03-12 04:48:32 +00:00
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_ipv4_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, guint32 value, const char *format, ...)
|
2000-05-11 08:18:09 +00:00
|
|
|
__attribute__((format (printf, 7, 8)));
|
2000-03-12 04:48:32 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_ipv4_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, guint32 value, const char *format, ...);
|
|
|
|
#endif
|
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add a FT_IPv6 to a proto_tree */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_ipv6(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, const guint8* value_ptr);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_ipv6_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, const guint8* value_ptr);
|
|
|
|
|
2000-03-12 04:48:32 +00:00
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_ipv6_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-05-31 05:09:07 +00:00
|
|
|
gint length, const guint8* value_ptr, const char *format, ...)
|
2000-05-11 08:18:09 +00:00
|
|
|
__attribute__((format (printf, 7, 8)));
|
2000-03-12 04:48:32 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_ipv6_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-05-31 05:09:07 +00:00
|
|
|
gint length, const guint8* value_ptr, const char *format, ...);
|
2000-03-12 04:48:32 +00:00
|
|
|
#endif
|
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add a FT_ETHER to a proto_tree */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_ether(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, const guint8* value);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_ether_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, const guint8* value);
|
|
|
|
|
2000-03-12 04:48:32 +00:00
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_ether_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-05-31 05:09:07 +00:00
|
|
|
gint length, const guint8* value, const char *format, ...)
|
2000-05-11 08:18:09 +00:00
|
|
|
__attribute__((format (printf, 7, 8)));
|
2000-03-12 04:48:32 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_ether_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-05-31 18:32:15 +00:00
|
|
|
gint length, const guint8* value, const char *format, ...);
|
2000-03-12 04:48:32 +00:00
|
|
|
#endif
|
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add a FT_STRING to a proto_tree */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_string(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, const char* value);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_string_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, const char* value);
|
|
|
|
|
2000-03-12 04:48:32 +00:00
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_string_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-14 06:03:26 +00:00
|
|
|
gint length, const char* value, const char *format, ...)
|
2000-05-11 08:18:09 +00:00
|
|
|
__attribute__((format (printf, 7, 8)));
|
2000-03-12 04:48:32 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_string_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-14 06:03:26 +00:00
|
|
|
gint length, const char* value, const char *format, ...);
|
2000-03-12 04:48:32 +00:00
|
|
|
#endif
|
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add a FT_BOOLEAN to a proto_tree */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_boolean(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, guint32 value);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_boolean_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, guint32 value);
|
|
|
|
|
2000-03-12 04:48:32 +00:00
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_boolean_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, guint32 value, const char *format, ...)
|
2000-05-11 08:18:09 +00:00
|
|
|
__attribute__((format (printf, 7, 8)));
|
2000-03-12 04:48:32 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_boolean_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, guint32 value, const char *format, ...);
|
|
|
|
#endif
|
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add a FT_DOUBLE to a proto_tree */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_double(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, double value);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_double_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, double value);
|
|
|
|
|
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_double_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, double value, const char *format, ...)
|
|
|
|
__attribute__((format (printf, 7, 8)));
|
|
|
|
#else
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_double_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, double value, const char *format, ...);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Add any FT_UINT* to a proto_tree */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_uint(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, guint32 value);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_uint_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, guint32 value);
|
|
|
|
|
2000-03-12 04:48:32 +00:00
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_uint_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, guint32 value, const char *format, ...)
|
2000-05-11 08:18:09 +00:00
|
|
|
__attribute__((format (printf, 7, 8)));
|
2000-03-12 04:48:32 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_uint_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-03-12 04:48:32 +00:00
|
|
|
gint length, guint32 value, const char *format, ...);
|
|
|
|
#endif
|
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add any FT_INT* to a proto_tree */
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_int(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, gint32 value);
|
|
|
|
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_int_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, gint32 value);
|
|
|
|
|
2000-04-25 21:43:50 +00:00
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_int_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-04-25 21:43:50 +00:00
|
|
|
gint length, gint32 value, const char *format, ...)
|
2000-05-11 08:18:09 +00:00
|
|
|
__attribute__((format (printf, 7, 8)));
|
2000-04-25 21:43:50 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_int_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
|
2000-04-25 21:43:50 +00:00
|
|
|
gint length, gint32 value, const char *format, ...);
|
|
|
|
#endif
|
|
|
|
|
2000-03-12 04:48:32 +00:00
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add a text-only node to the proto_tree */
|
2000-03-12 04:48:32 +00:00
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_text(proto_tree *tree, tvbuff_t *tvb, gint start, gint length, const char *,
|
|
|
|
...) __attribute__((format (printf, 5, 6)));
|
2000-03-12 04:48:32 +00:00
|
|
|
#else
|
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_text(proto_tree *tree, tvbuff_t *tvb, gint start, gint length, const char *,
|
2000-03-12 04:48:32 +00:00
|
|
|
...);
|
|
|
|
#endif
|
|
|
|
|
2000-08-10 16:04:33 +00:00
|
|
|
proto_item *
|
|
|
|
proto_tree_add_text_valist(proto_tree *tree, tvbuff_t *tvb, gint start,
|
|
|
|
gint length, const char *format, va_list ap);
|
2000-03-12 04:48:32 +00:00
|
|
|
|
2000-05-31 05:09:07 +00:00
|
|
|
/* Add a node with no text */
|
2000-03-12 04:48:32 +00:00
|
|
|
proto_item *
|
2000-05-11 08:18:09 +00:00
|
|
|
proto_tree_add_notext(proto_tree *tree, tvbuff_t *tvb, gint start, gint length);
|
2000-03-12 04:48:32 +00:00
|
|
|
|
1999-07-07 22:52:57 +00:00
|
|
|
|
Convert IPX-and-friend dissectors in packet-ipx.c to use
tvbuffs.
In doing so, I realied that my recommendation for using
tvb_new_subset(pi.compat_top_tvb, -1, -1) was incorrect, because
some dissectors (ethernet!) change pi.len and pi.cap_len. So, I have
to take those two variables into account instead of using -1 and -1.
So, I provide a macro called tvb_create_from_top(offset), where
offset is the name of your offset variable. It is a wrapper around
tvb_new_subset().
I converted the lines that followed my suggestion to use
tvb_create_from_top().
In proto.c I added
proto_tree_add_debug_text(proto_tree*, const char*, ...)
It's much like proto_tree_add_text(), except that it takes no offset
or length; it's soley for temporarily putting debug text into the
proto_tree while debugging a dissector. In making sure that its
use is temporary, the funciton also prints the debug string to stdout
to remind the programmer that the debug code needs to be removed
before shipping the code.
svn path=/trunk/; revision=2068
2000-06-15 03:49:00 +00:00
|
|
|
/* Useful for quick debugging. Also sends string to STDOUT, so don't
|
|
|
|
* leave call to this function in production code. */
|
|
|
|
#if __GNUC__ == 2
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_debug_text(proto_tree *tree, const char *format, ...)
|
|
|
|
__attribute__((format (printf, 2, 3)));
|
|
|
|
#else
|
|
|
|
proto_item *
|
|
|
|
proto_tree_add_debug_text(proto_tree *tree, const char *format, ...);
|
|
|
|
#endif
|
|
|
|
|
1999-07-07 22:52:57 +00:00
|
|
|
void
|
|
|
|
proto_item_fill_label(field_info *fi, gchar *label_str);
|
|
|
|
|
1999-08-26 07:01:44 +00:00
|
|
|
/* Returns number of items (protocols or header fields) registered. */
|
1999-07-07 22:52:57 +00:00
|
|
|
int proto_registrar_n(void);
|
1999-08-26 07:01:44 +00:00
|
|
|
|
1999-11-11 16:20:25 +00:00
|
|
|
/* Returns char* to name for item # n (0-indexed) */
|
|
|
|
char* proto_registrar_get_name(int n);
|
|
|
|
|
1999-08-26 07:01:44 +00:00
|
|
|
/* Returns char* to abbrev for item # n (0-indexed) */
|
1999-07-07 22:52:57 +00:00
|
|
|
char* proto_registrar_get_abbrev(int n);
|
1999-08-26 07:01:44 +00:00
|
|
|
|
2000-04-03 09:24:12 +00:00
|
|
|
/* get the header field information based upon a field or protocol id */
|
2001-02-01 20:21:25 +00:00
|
|
|
header_field_info* proto_registrar_get_nth(int hfindex);
|
2000-04-03 09:24:12 +00:00
|
|
|
|
1999-08-26 07:01:44 +00:00
|
|
|
/* Returns enum ftenum for item # n */
|
1999-07-07 22:52:57 +00:00
|
|
|
int proto_registrar_get_ftype(int n);
|
1999-08-26 07:01:44 +00:00
|
|
|
|
|
|
|
/* Returns parent protocol for item # n.
|
|
|
|
* Returns -1 if item _is_ a protocol */
|
1999-07-07 22:52:57 +00:00
|
|
|
int proto_registrar_get_parent(int n);
|
1999-08-26 07:01:44 +00:00
|
|
|
|
|
|
|
/* Is item #n a protocol? */
|
1999-07-07 22:52:57 +00:00
|
|
|
gboolean proto_registrar_is_protocol(int n);
|
1999-08-26 07:01:44 +00:00
|
|
|
|
Add the "Edit:Protocols..." feature which currently only implements
the following:
It is now possible to enable/disable a particular protocol decoding
(i.e. the protocol dissector is void or not). When a protocol
is disabled, it is displayed as Data and of course, all linked
sub-protocols are disabled as well.
Disabling a protocol could be interesting:
- in case of buggy dissectors
- in case of wrong heuristics
- for performance reasons
- to decode the data as another protocol (TODO)
Currently (if I am not wrong), all dissectors but NFS can be disabled
(and dissectors that do not register protocols :-)
I do not like the way the RPC sub-dissectors are disabled (in the
sub-dissectors) since this could be done in the RPC dissector itself,
knowing the sub-protocol hfinfo entry (this is why, I've not modified
the NFS one yet).
Two functions are added in proto.c :
gboolean proto_is_protocol_enabled(int n);
void proto_set_decoding(int n, gboolean enabled);
and two MACROs which can be used in dissectors:
OLD_CHECK_DISPLAY_AS_DATA(index, pd, offset, fd, tree)
CHECK_DISPLAY_AS_DATA(index, tvb, pinfo, tree)
See also the XXX in proto_dlg.c and proto.c around the new functions.
svn path=/trunk/; revision=2267
2000-08-13 14:09:15 +00:00
|
|
|
/* Is item #n decoding enabled ? */
|
2001-01-03 06:56:03 +00:00
|
|
|
gboolean proto_is_protocol_enabled(int proto_id);
|
|
|
|
|
|
|
|
/* Can item #n decoding be disabled? */
|
|
|
|
gboolean proto_can_disable_protocol(int proto_id);
|
|
|
|
|
|
|
|
/* Routines to use to iterate over the protocols; they return the item
|
|
|
|
* number of the protocol in question, and keep state in "*cookie". */
|
|
|
|
int proto_get_first_protocol(void **cookie);
|
|
|
|
int proto_get_next_protocol(void **cookie);
|
|
|
|
|
2001-04-01 22:50:08 +00:00
|
|
|
/* Given a protocol's filter_name, return it's proto_id */
|
|
|
|
int proto_get_id_by_filter_name(gchar* filter_name);
|
|
|
|
|
2001-01-03 06:56:03 +00:00
|
|
|
/* Given a protocol's item number, return its name. */
|
|
|
|
char *proto_get_protocol_name(int n);
|
|
|
|
|
|
|
|
/* Given a protocol's item number, return its short name. */
|
|
|
|
char *proto_get_protocol_short_name(int proto_id);
|
|
|
|
|
|
|
|
/* Given a protocol's item number, return its filter name. */
|
|
|
|
char *proto_get_protocol_filter_name(int proto_id);
|
Add the "Edit:Protocols..." feature which currently only implements
the following:
It is now possible to enable/disable a particular protocol decoding
(i.e. the protocol dissector is void or not). When a protocol
is disabled, it is displayed as Data and of course, all linked
sub-protocols are disabled as well.
Disabling a protocol could be interesting:
- in case of buggy dissectors
- in case of wrong heuristics
- for performance reasons
- to decode the data as another protocol (TODO)
Currently (if I am not wrong), all dissectors but NFS can be disabled
(and dissectors that do not register protocols :-)
I do not like the way the RPC sub-dissectors are disabled (in the
sub-dissectors) since this could be done in the RPC dissector itself,
knowing the sub-protocol hfinfo entry (this is why, I've not modified
the NFS one yet).
Two functions are added in proto.c :
gboolean proto_is_protocol_enabled(int n);
void proto_set_decoding(int n, gboolean enabled);
and two MACROs which can be used in dissectors:
OLD_CHECK_DISPLAY_AS_DATA(index, pd, offset, fd, tree)
CHECK_DISPLAY_AS_DATA(index, tvb, pinfo, tree)
See also the XXX in proto_dlg.c and proto.c around the new functions.
svn path=/trunk/; revision=2267
2000-08-13 14:09:15 +00:00
|
|
|
|
|
|
|
/* Enable / Disable protocol */
|
2001-01-03 06:56:03 +00:00
|
|
|
void proto_set_decoding(int proto_id, gboolean enabled);
|
|
|
|
|
|
|
|
/* Disable disabling of protocol */
|
|
|
|
void proto_set_cant_disable(int proto_id);
|
Add the "Edit:Protocols..." feature which currently only implements
the following:
It is now possible to enable/disable a particular protocol decoding
(i.e. the protocol dissector is void or not). When a protocol
is disabled, it is displayed as Data and of course, all linked
sub-protocols are disabled as well.
Disabling a protocol could be interesting:
- in case of buggy dissectors
- in case of wrong heuristics
- for performance reasons
- to decode the data as another protocol (TODO)
Currently (if I am not wrong), all dissectors but NFS can be disabled
(and dissectors that do not register protocols :-)
I do not like the way the RPC sub-dissectors are disabled (in the
sub-dissectors) since this could be done in the RPC dissector itself,
knowing the sub-protocol hfinfo entry (this is why, I've not modified
the NFS one yet).
Two functions are added in proto.c :
gboolean proto_is_protocol_enabled(int n);
void proto_set_decoding(int n, gboolean enabled);
and two MACROs which can be used in dissectors:
OLD_CHECK_DISPLAY_AS_DATA(index, pd, offset, fd, tree)
CHECK_DISPLAY_AS_DATA(index, tvb, pinfo, tree)
See also the XXX in proto_dlg.c and proto.c around the new functions.
svn path=/trunk/; revision=2267
2000-08-13 14:09:15 +00:00
|
|
|
|
2001-02-01 07:34:33 +00:00
|
|
|
gpointer proto_get_protocol_dissector(int proto_id);
|
|
|
|
void proto_set_protocol_dissector(int proto_id, gpointer dissector);
|
|
|
|
|
1999-10-12 04:21:13 +00:00
|
|
|
/* Get length of registered field according to field type.
|
|
|
|
* 0 means undeterminable at registration time.
|
|
|
|
* -1 means unknown field */
|
|
|
|
gint proto_registrar_get_length(int n);
|
|
|
|
|
1999-08-29 04:06:43 +00:00
|
|
|
/* Checks for existence any protocol or field within a tree.
|
2000-07-22 15:58:54 +00:00
|
|
|
* "Protocols" are assumed to be a child of the [empty] root node.
|
1999-08-29 04:06:43 +00:00
|
|
|
* TRUE = found, FALSE = not found */
|
|
|
|
gboolean proto_check_for_protocol_or_field(proto_tree* tree, int id);
|
|
|
|
|
2000-07-22 15:58:54 +00:00
|
|
|
/* Return GPtrArray* of field_info pointers for all hfindex that appear in
|
|
|
|
* tree. Assume that a field will only appear under its registered parent's
|
|
|
|
* subtree, and that the parent's subtree is a child of the
|
|
|
|
* [empty] root node. */
|
|
|
|
GPtrArray* proto_get_finfo_ptr_array(proto_tree *tree, int hfindex);
|
1999-07-07 22:52:57 +00:00
|
|
|
|
1999-07-15 15:33:52 +00:00
|
|
|
/* Dumps a glossary of the protocol and field registrations to STDOUT */
|
|
|
|
void proto_registrar_dump(void);
|
|
|
|
|
1999-08-26 07:01:44 +00:00
|
|
|
/* Is the parsing being done for a visible proto_tree or an invisible one?
|
|
|
|
* By setting this correctly, the proto_tree creation is sped up by not
|
|
|
|
* having to call vsnprintf and copy strings around.
|
|
|
|
*/
|
|
|
|
extern gboolean proto_tree_is_visible;
|
|
|
|
|
1999-11-16 11:44:20 +00:00
|
|
|
/* Points to the first element of an array of Booleans, indexed by
|
|
|
|
a subtree item type; that array element is TRUE if subtrees of
|
|
|
|
an item of that type are to be expanded.
|
|
|
|
|
|
|
|
ETT_NONE is reserved for unregistered subtree types. */
|
|
|
|
#define ETT_NONE 0
|
|
|
|
extern gboolean *tree_is_expanded;
|
|
|
|
|
|
|
|
/* Number of elements in that array. */
|
|
|
|
extern int num_tree_types;
|
|
|
|
|
2000-07-22 15:58:54 +00:00
|
|
|
/* glib doesn't have g_ptr_array_len of all things!*/
|
|
|
|
#ifndef g_ptr_array_len
|
|
|
|
#define g_ptr_array_len(a) ((a)->len)
|
|
|
|
#endif
|
|
|
|
|
2001-02-01 20:21:25 +00:00
|
|
|
int
|
|
|
|
hfinfo_bitwidth(header_field_info *hfinfo);
|
|
|
|
|
|
|
|
char*
|
|
|
|
proto_alloc_dfilter_string(field_info *finfo, guint8 *pd);
|
2000-08-30 02:50:18 +00:00
|
|
|
|
2001-03-02 23:10:12 +00:00
|
|
|
field_info*
|
2001-03-23 14:44:04 +00:00
|
|
|
proto_find_field_from_offset(proto_tree *tree, guint offset, gchar *ds_name);
|
2001-03-02 23:10:12 +00:00
|
|
|
|
1999-07-07 22:52:57 +00:00
|
|
|
#endif /* proto.h */
|