Ethereal-dev: Re: [ethereal-dev] plugins support
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Guy Harris <gharris@xxxxxxxxxxxx>
Date: Mon, 15 Nov 1999 02:17:54 -0800
> Dynamically allocating ETT_xxx values would not only be good for
> plugins, it'd be good for compiled-in dissectors - it'd obviate the need
> to add ETT_xxx values to "packet.h" if you add a new protocol with
> subtrees, or add a new subtree to an existing protocol.
Well, I now have some code that does that.
I added a "proto_register_subtree_array()" routine, which takes as
arguments a pointer to an array of "gint *"s, and a count of elements in
that array, and stores in each of the "gint"s pointed to by the elements
of that array a unique positive integer, which is an index into the
now-dynamic "tree_is_expanded" array.
A protocol would declare a number of static "gint" "ett_XXX" variables
(and initialize them to -1, so as to catch ett_XXX values not
registered), and, in its register routine, would declare an array of
"gint *"s that point to its "ett_XXX" variables, and call
"proto_register_subtree_array()" on that array.
It'd use the "ett_XXX" variables, rather than the "ETT_xxx" enum values;
the enum in question no longer exists.
We could, perhaps, register the protocol's "ett_XXX" variable in the
call that registers the protocol itself, and *if* a subtree is under a
protocol tree entry added with a call other than
"proto_tree_add_text()", we could perhaps register its "ett_XXX" value
when we register the field. However, not all protocol tree entries with
subtrees have fields associated with them.
Here's a context diff of the non-dissector changes, and of
"packet-arp.c" (this changes every dissector that uses ETT_ values,
which means it changes every dissector, so I'm just sending one, as an
example):
Index: proto.c
===================================================================
RCS file: /usr/local/cvsroot/ethereal/proto.c,v
retrieving revision 1.48
diff -c -r1.48 proto.c
*** proto.c 1999/11/15 06:32:14 1.48
--- proto.c 1999/11/15 10:12:06
***************
*** 121,126 ****
--- 121,134 ----
/* List which stores protocols and fields that have been registered */
GPtrArray *gpa_hfinfo = NULL;
+ /* 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. */
+ gboolean *tree_is_expanded;
+
+ /* Number of elements in that array. */
+ int num_tree_types;
+
/* 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.
***************
*** 145,150 ****
--- 153,160 ----
g_mem_chunk_destroy(gmc_item_labels);
if (gpa_hfinfo)
g_ptr_array_free(gpa_hfinfo, FALSE);
+ if (tree_is_expanded != NULL)
+ g_free(tree_is_expanded);
gmc_hfinfo = g_mem_chunk_new("gmc_hfinfo",
sizeof(struct header_field_info), 50 * sizeof(struct
***************
*** 157,162 ****
--- 167,178 ----
G_ALLOC_AND_FREE);
gpa_hfinfo = g_ptr_array_new();
+ /* Allocate "tree_is_expanded", with one element for ETT_NONE,
+ and initialize that element to FALSE. */
+ tree_is_expanded = g_malloc(sizeof (gint));
+ tree_is_expanded[0] = FALSE;
+ num_tree_types = 1;
+
/* Have each dissector register its protocols and fields. */
register_all_protocols();
***************
*** 164,169 ****
--- 180,190 ----
converting ethereal to new-style proto_tree. These fields
are merely strings on the GUI tree; they are not filterable */
proto_register_field_array(-1, hf, array_length(hf));
+
+ /* We've assigned all the subtree type values; allocate the array
+ for them, and zero it out. */
+ tree_is_expanded = g_malloc(num_tree_types*sizeof (gint *));
+ memset(tree_is_expanded, '\0', num_tree_types*sizeof (gint *));
}
void
***************
*** 413,418 ****
--- 434,440 ----
proto_tree*
proto_item_add_subtree(proto_item *pi, gint idx) {
field_info *fi = (field_info*) (((GNode*)pi)->data);
+ g_assert(idx >= 0 && idx < num_tree_types);
fi->tree_type = idx;
return (proto_tree*) pi;
}
***************
*** 478,483 ****
--- 500,530 ----
g_ptr_array_add(gpa_hfinfo, hfinfo);
hfinfo->id = gpa_hfinfo->len - 1;
return hfinfo->id;
+ }
+
+ void
+ proto_register_subtree_array(gint **indices, int num_indices)
+ {
+ int i;
+ gint **ptr = indices;
+
+ /*
+ * Add "num_indices" elements to "tree_is_expanded".
+ */
+ tree_is_expanded = g_realloc(tree_is_expanded,
+ (num_tree_types + num_indices)*sizeof (gint));
+
+ /*
+ * Assign "num_indices" subtree numbers starting at "num_tree_types",
+ * returning the indices through the pointers in the array whose
+ * first element is pointed to by "indices", set to FALSE the
+ * elements to which those subtree numbers refer, and update
+ * "num_tree_types" appropriately.
+ */
+ for (i = 0; i < num_indices; i++, ptr++, num_tree_types++) {
+ tree_is_expanded[num_tree_types] = FALSE;
+ **ptr = num_tree_types;
+ }
}
void
Index: proto.h
===================================================================
RCS file: /usr/local/cvsroot/ethereal/proto.h,v
retrieving revision 1.19
diff -c -r1.19 proto.h
*** proto.h 1999/11/15 06:32:15 1.19
--- proto.h 1999/11/15 10:12:06
***************
*** 173,178 ****
--- 173,181 ----
void
proto_register_field_array(int parent, hf_register_info *hf, int num_records);
+ void
+ proto_register_subtree_array(gint **indices, int num_indices);
+
proto_item *
proto_tree_add_item(proto_tree *tree, int hfindex, gint start,
gint length, ...);
***************
*** 237,241 ****
--- 240,255 ----
* having to call vsnprintf and copy strings around.
*/
extern gboolean proto_tree_is_visible;
+
+ /* 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;
#endif /* proto.h */
Index: packet.c
===================================================================
RCS file: /usr/local/cvsroot/ethereal/packet.c,v
retrieving revision 1.53
diff -c -r1.53 packet.c
*** packet.c 1999/11/11 05:36:05 1.53
--- packet.c 1999/11/15 10:12:08
***************
*** 67,80 ****
extern capture_file cf;
! gboolean tree_is_expanded[NUM_TREE_TYPES];
! int proto_frame = -1;
! int hf_frame_arrival_time = -1;
! int hf_frame_time_delta = -1;
! int hf_frame_number = -1;
! int hf_frame_packet_len = -1;
! int hf_frame_capture_len = -1;
gchar *
ether_to_str(const guint8 *ad) {
--- 67,80 ----
extern capture_file cf;
! static int proto_frame = -1;
! static int hf_frame_arrival_time = -1;
! static int hf_frame_time_delta = -1;
! static int hf_frame_number = -1;
! static int hf_frame_packet_len = -1;
! static int hf_frame_capture_len = -1;
! static gint ett_frame = -1;
gchar *
ether_to_str(const guint8 *ad) {
***************
*** 735,741 ****
ti = proto_tree_add_item_format(tree, proto_frame, 0, fd->cap_len,
NULL, "Frame (%d on wire, %d captured)", fd->pkt_len, fd->cap_len);
! fh_tree = proto_item_add_subtree(ti, ETT_FRAME);
tv.tv_sec = fd->abs_secs;
tv.tv_usec = fd->abs_usecs;
--- 735,741 ----
ti = proto_tree_add_item_format(tree, proto_frame, 0, fd->cap_len,
NULL, "Frame (%d on wire, %d captured)", fd->pkt_len, fd->cap_len);
! fh_tree = proto_item_add_subtree(ti, ett_frame);
tv.tv_sec = fd->abs_secs;
tv.tv_usec = fd->abs_usecs;
***************
*** 834,840 ****
--- 834,844 ----
{ "Capture Frame Length", "frame.cap_len", FT_UINT32, BASE_DEC, NULL, 0x0,
"" }},
};
+ static gint *ett[] = {
+ &ett_frame,
+ };
proto_frame = proto_register_protocol("Frame", "frame");
proto_register_field_array(proto_frame, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
}
Index: packet.h
===================================================================
RCS file: /usr/local/cvsroot/ethereal/packet.h,v
retrieving revision 1.140
diff -c -r1.140 packet.h
*** packet.h 1999/11/14 20:44:52 1.140
--- packet.h 1999/11/15 10:12:09
***************
*** 206,478 ****
int dport;
} tcp_extra_data;
- /* Tree types. Each dissect_* routine should have one for each
- add_subtree() call. */
-
- enum {
- ETT_NONE,
- ETT_FRAME,
- ETT_IEEE8023,
- ETT_ETHER2,
- ETT_LLC,
- ETT_TOKEN_RING,
- ETT_TOKEN_RING_AC,
- ETT_TOKEN_RING_FC,
- ETT_TR_IERR_CNT,
- ETT_TR_NERR_CNT,
- ETT_TR_MAC,
- ETT_PPP,
- ETT_ARP,
- ETT_BPDU,
- ETT_FDDI,
- ETT_NULL,
- ETT_IP,
- ETT_IP_OPTIONS,
- ETT_IP_OPTION_SEC,
- ETT_IP_OPTION_ROUTE,
- ETT_IP_OPTION_TIMESTAMP,
- ETT_IP_TOS,
- ETT_IP_OFF,
- ETT_UDP,
- ETT_TCP,
- ETT_TCP_OPTIONS,
- ETT_TCP_OPTION_SACK,
- ETT_TCP_FLAGS,
- ETT_ICMP,
- ETT_IGMP,
- ETT_IPX,
- ETT_SPX,
- ETT_NCP,
- ETT_NCP_REQUEST_FIELDS,
- ETT_NCP_REPLY_FIELDS,
- ETT_DNS,
- ETT_DNS_FLAGS,
- ETT_DNS_QRY,
- ETT_DNS_QD,
- ETT_DNS_ANS,
- ETT_DNS_RR,
- ETT_EIGRP,
- ETT_ICQ,
- ETT_ICQ_DECODE,
- ETT_ICQ_HEADER,
- ETT_ICQ_BODY,
- ETT_ICQ_BODY_PARTS,
- ETT_ISAKMP,
- ETT_ISAKMP_FLAGS,
- ETT_ISAKMP_PAYLOAD,
- ETT_RIP,
- ETT_RIP_VEC,
- ETT_RIPNG,
- ETT_RIPNG_ADDR,
- ETT_PIM,
- ETT_OSPF,
- ETT_OSPF_HDR,
- ETT_OSPF_HELLO,
- ETT_OSPF_DESC,
- ETT_OSPF_LSR,
- ETT_OSPF_LSA_UPD,
- ETT_OSPF_LSA,
- ETT_LPD,
- ETT_RAW,
- ETT_CLIP,
- ETT_BOOTP,
- ETT_BOOTP_OPTION,
- ETT_BOOTPARAMS,
- ETT_IPv6,
- ETT_BGP,
- ETT_BGP_OPEN,
- ETT_BGP_UPDATE,
- ETT_BGP_NOTIFICATION,
- ETT_BGP_ATTRS,
- ETT_BGP_ATTR,
- ETT_BGP_ATTR_FLAGS,
- ETT_BGP_UNFEAS,
- ETT_BGP_NLRI,
- ETT_BGP_MP_REACH_NLRI,
- ETT_BGP_MP_UNREACH_NLRI,
- ETT_CLNP,
- ETT_COTP,
- ETT_VINES_FRP,
- ETT_VINES,
- ETT_VINES_ARP,
- ETT_VINES_ICP,
- ETT_VINES_IPC,
- ETT_VINES_RTP,
- ETT_VINES_SPP,
- ETT_VLAN,
- ETT_IPXRIP,
- ETT_IPXSAP,
- ETT_IPXSAP_SERVER,
- ETT_NBNS,
- ETT_NBNS_FLAGS,
- ETT_NBNS_NB_FLAGS,
- ETT_NBNS_NAME_FLAGS,
- ETT_NBNS_QRY,
- ETT_NBNS_QD,
- ETT_NETB,
- ETT_NETB_FLAGS,
- ETT_NETB_STATUS,
- ETT_NETB_NAME,
- ETT_NBNS_ANS,
- ETT_NBNS_RR,
- ETT_NBIPX,
- ETT_NBIPX_NAME_TYPE_FLAGS,
- ETT_AARP,
- ETT_GIOP,
- ETT_NBDGM,
- ETT_CDP,
- ETT_CDP_TLV,
- ETT_HTTP,
- ETT_TFTP,
- ETT_AH,
- ETT_ESP,
- ETT_IPCOMP,
- ETT_ICMPv6,
- ETT_ICMPv6OPT,
- ETT_ICMPv6FLAG,
- ETT_POP,
- ETT_IMAP,
- ETT_MAPI,
- ETT_FTP,
- ETT_TELNET,
- ETT_TELNET_SUBOPT,
- ETT_NNTP,
- ETT_NTP,
- ETT_NTP_FLAGS,
- ETT_SNMP,
- ETT_NBSS,
- ETT_NBSS_FLAGS,
- ETT_RX,
- ETT_RX_FLAGS,
- ETT_AFS,
- ETT_AFS_OP,
- ETT_AFS_FID,
- ETT_AFS_ACL,
- ETT_AFS_CALLBACK,
- ETT_AFS_UBIKVER,
- ETT_SMB,
- ETT_SMB_FLAGS,
- ETT_SMB_FLAGS2,
- ETT_SMB_DIALECTS,
- ETT_SMB_MODE,
- ETT_SMB_CAPABILITIES,
- ETT_SMB_RAWMODE,
- ETT_SMB_AFLAGS,
- ETT_SMB_DESIREDACCESS,
- ETT_SMB_SEARCH,
- ETT_SMB_FILE,
- ETT_SMB_OPENFUNCTION,
- ETT_SMB_FILEATTRIBUTES,
- ETT_SMB_FILETYPE,
- ETT_SMB_ACTION,
- ETT_SMB_WRITEMODE,
- ETT_SMB_LOCK_TYPE,
- ETT_BROWSE,
- ETT_BROWSE_FLAGS,
- ETT_PPTP,
- ETT_GRE,
- ETT_GRE_FLAGS,
- ETT_ICP,
- ETT_ICP_PAYLOAD,
- ETT_PPPOED,
- ETT_PPPOED_TAGS,
- ETT_PPPOES,
- ETT_LCP,
- ETT_LCP_OPTIONS,
- ETT_LCP_MRU_OPT,
- ETT_LCP_ASYNC_MAP_OPT,
- ETT_LCP_AUTHPROT_OPT,
- ETT_LCP_QUALPROT_OPT,
- ETT_LCP_MAGICNUM_OPT,
- ETT_LCP_FCS_ALTERNATIVES_OPT,
- ETT_LCP_NUMBERED_MODE_OPT,
- ETT_LCP_CALLBACK_OPT,
- ETT_LCP_MULTILINK_EP_DISC_OPT,
- ETT_LCP_INTERNATIONALIZATION_OPT,
- ETT_IPCP,
- ETT_IPCP_OPTIONS,
- ETT_IPCP_IPADDRS_OPT,
- ETT_IPCP_COMPRESSPROT_OPT,
- ETT_RSVP,
- ETT_RSVP_UNKNOWN_CLASS,
- ETT_RSVP_HDR,
- ETT_RSVP_SESSION,
- ETT_RSVP_SGROUP,
- ETT_RSVP_HOP,
- ETT_RSVP_INTEGRITY,
- ETT_RSVP_TIME_VALUES,
- ETT_RSVP_ERROR,
- ETT_RSVP_SCOPE,
- ETT_RSVP_STYLE,
- ETT_RSVP_FLOWSPEC,
- ETT_RSVP_FILTER_SPEC,
- ETT_RSVP_SENDER_TEMPLATE,
- ETT_RSVP_SENDER_TSPEC,
- ETT_RSVP_ADSPEC,
- ETT_RSVP_POLICY,
- ETT_RSVP_CONFIRM,
- ETT_RSVP_ADSPEC_SUBTREE1,
- ETT_RSVP_ADSPEC_SUBTREE2,
- ETT_RSVP_ADSPEC_SUBTREE3,
- ETT_RTSP,
- ETT_SDP,
- ETT_RADIUS,
- ETT_RADIUS_AVP,
- ETT_LAPB,
- ETT_LAPD,
- ETT_LAPD_ADDRESS,
- ETT_X25,
- ETT_XDLC_CONTROL,
- ETT_Q931,
- ETT_Q931_IE,
- ETT_ATM,
- ETT_ATM_LANE,
- ETT_ATM_LANE_LC_FLAGS,
- ETT_ATM_LANE_LC_LAN_DEST,
- ETT_ATM_LANE_LC_LAN_DEST_RD,
- ETT_MP,
- ETT_MP_FLAGS,
- ETT_IPP,
- ETT_IPP_AS,
- ETT_IPP_ATTR,
- ETT_SNA,
- ETT_SNA_TH,
- ETT_SNA_TH_FID,
- ETT_SNA_RH,
- ETT_SNA_RH_0,
- ETT_SNA_RH_1,
- ETT_SNA_RH_2,
- ETT_SNA_RU,
- ETT_YHOO,
- ETT_RPC,
- ETT_RPC_STRING,
- ETT_RPC_CRED,
- ETT_RPC_VERF,
- ETT_RPC_GIDS,
- ETT_MOUNT,
- ETT_NFS,
- ETT_NFS_FHANDLE,
- ETT_NFS_TIMEVAL,
- ETT_NFS_MODE,
- ETT_NFS_FATTR,
- ETT_NFS_MODE3,
- ETT_NFS_SPECDATA3,
- ETT_NFS_FH3,
- ETT_NFS_NFSTIME3,
- ETT_NFS_FATTR3,
- ETT_NLM,
- ETT_PORTMAP,
- ETT_STAT,
- ETT_YPBIND,
- ETT_YPSERV,
- ETT_YPXFR,
- ETT_DDP,
- NUM_TREE_TYPES /* last item number plus one */
- };
-
- /* TRUE if subtrees of an item of the specified type are to be expanded. */
- extern gboolean tree_is_expanded[NUM_TREE_TYPES];
-
/* Utility routines used by packet*.c */
gchar* ether_to_str(const guint8 *);
gchar* ip_to_str(const guint8 *);
--- 206,211 ----
Index: packet-arp.c
===================================================================
RCS file: /usr/local/cvsroot/ethereal/packet-arp.c,v
retrieving revision 1.21
diff -c -r1.21 packet-arp.c
*** packet-arp.c 1999/11/04 08:15:38 1.21
--- packet-arp.c 1999/11/15 10:12:10
***************
*** 46,51 ****
--- 46,53 ----
static int hf_arp_dst_ether = -1;
static int hf_arp_dst_proto = -1;
+ static gint ett_arp = -1;
+
/* Definitions taken from Linux "linux/if_arp.h" header file, and from
http://www.isi.edu/in-notes/iana/assignments/arp-parameters
***************
*** 254,260 ****
MIN_ARP_HEADER_SIZE + 2*ar_hln +
2*ar_pln, NULL,
"Unknown ARP (opcode 0x%04x)", ar_op);
! arp_tree = proto_item_add_subtree(ti, ETT_ARP);
proto_tree_add_item(arp_tree, hf_arp_hard_type, offset + AR_HRD, 2,
ar_hrd);
proto_tree_add_item(arp_tree, hf_arp_proto_type, offset + AR_PRO, 2,
--- 256,262 ----
MIN_ARP_HEADER_SIZE + 2*ar_hln +
2*ar_pln, NULL,
"Unknown ARP (opcode 0x%04x)", ar_op);
! arp_tree = proto_item_add_subtree(ti, ett_arp);
proto_tree_add_item(arp_tree, hf_arp_hard_type, offset + AR_HRD, 2,
ar_hrd);
proto_tree_add_item(arp_tree, hf_arp_proto_type, offset + AR_PRO, 2,
***************
*** 329,335 ****
--- 331,341 ----
FT_BYTES, BASE_NONE, NULL, 0x0,
"" }}
};
+ static gint *ett[] = {
+ &ett_arp,
+ };
proto_arp = proto_register_protocol("Address Resolution Protocol", "arp");
proto_register_field_array(proto_arp, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
}
Index: gtk/proto_draw.c
===================================================================
RCS file: /usr/local/cvsroot/ethereal/gtk/proto_draw.c,v
retrieving revision 1.3
diff -c -r1.3 proto_draw.c
*** proto_draw.c 1999/09/12 20:23:43 1.3
--- proto_draw.c 1999/11/15 10:14:46
***************
*** 121,127 ****
void expand_all_tree(proto_tree *protocol_tree, GtkWidget *tree_view) {
int i;
! for(i=0; i < NUM_TREE_TYPES; i++) {
tree_is_expanded[i] = TRUE;
}
gtk_tree_clear_items(GTK_TREE(tree_view), 0, -1);
--- 121,127 ----
void expand_all_tree(proto_tree *protocol_tree, GtkWidget *tree_view) {
int i;
! for(i=0; i < num_tree_types; i++) {
tree_is_expanded[i] = TRUE;
}
gtk_tree_clear_items(GTK_TREE(tree_view), 0, -1);
***************
*** 130,136 ****
void collapse_all_tree(proto_tree *protocol_tree, GtkWidget *tree_view) {
int i;
! for(i=0; i < NUM_TREE_TYPES; i++) {
tree_is_expanded[i] = FALSE;
}
gtk_tree_clear_items(GTK_TREE(tree_view), 0, -1);
--- 130,136 ----
void collapse_all_tree(proto_tree *protocol_tree, GtkWidget *tree_view) {
int i;
! for(i=0; i < num_tree_types; i++) {
tree_is_expanded[i] = FALSE;
}
gtk_tree_clear_items(GTK_TREE(tree_view), 0, -1);
- Follow-Ups:
- Re: [ethereal-dev] plugins support
- From: Guy Harris
- Re: [ethereal-dev] plugins support
- References:
- [ethereal-dev] plugins support
- From: Olivier Abad
- Re: [ethereal-dev] plugins support
- From: Olivier Abad
- Re: [ethereal-dev] plugins support
- From: Guy Harris
- [ethereal-dev] plugins support
- Prev by Date: [ethereal-dev] NFS dissector continuation
- Next by Date: Re: [ethereal-dev] follow tcp stream alters which packets are displayed
- Previous by thread: Re: [ethereal-dev] plugins support
- Next by thread: Re: [ethereal-dev] plugins support
- Index(es):





