Wireshark-dev: [Wireshark-dev] How do display filters work internally?
From: Joerg Mayer <jmayer@xxxxxxxxx>
Date: Thu, 19 Jan 2012 23:41:11 +0100
Hello List, I fail to understand how display filters work internally. I'm still trying to get my generic ip.addr filter working, but I seem to lack some understanding on how display filters work. It looks like putting an "alien" protocol filter into the hf array will work, as ip.version inside packet-ipv6.c shows: The field is shown and filterable. Putting the ip.addr field vom packet-ip.c into all uses of ipv4 addresses (everything of type FT_IPv4) will show it, but it won't be filterable (neither existence nor value). Can someone please fill in some info how display filtering works? Thanks Joerg -- Joerg Mayer <jmayer@xxxxxxxxx> We are stuck with technology when what we really want is just stuff that works. Some say that should read Microsoft instead of technology.
Index: epan/proto.c
===================================================================
--- epan/proto.c (revision 40592)
+++ epan/proto.c (working copy)
@@ -244,6 +244,9 @@
/* special-case header field used within proto.c */
int hf_text_only = -1;
+/* Handle pseudo fields */
+extern int hf_ip_addr;
+
/* Structure for information about a protocol */
struct _protocol {
const char *name; /* long description */
@@ -257,6 +260,9 @@
gboolean is_private; /* TRUE is protocol is private */
};
+/* Prevent recursion adding pseudo elements */
+static gboolean adding_pseudo = FALSE;
+
/* List of all protocols */
static GList *protocols = NULL;
@@ -1203,6 +1209,7 @@
const char *string;
nstime_t time_stamp;
GPtrArray *ptrs;
+ proto_item *item;
/* there is a possibility here that we might raise an exception
* and thus would lose track of the field_info.
@@ -1688,6 +1695,19 @@
if (ptrs)
g_ptr_array_add(ptrs, new_fi);
+ /* Add pseudo elements for some types */
+ if (adding_pseudo == TRUE) {
+ adding_pseudo = FALSE;
+ return pi;
+ }
+ switch(new_fi->hfinfo->type) {
+ case FT_IPv4:
+ adding_pseudo = TRUE;
+ item = proto_tree_add_item(tree, hf_ip_addr, tvb, start, length, ENC_BIG_ENDIAN);
+ PROTO_ITEM_SET_HIDDEN(item);
+ default:
+ break;
+ }
return pi;
}
@@ -2088,7 +2108,7 @@
proto_tree_add_ipv4(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
gint length, guint32 value)
{
- proto_item *pi;
+ proto_item *pi, *item;
field_info *new_fi;
header_field_info *hfinfo;
@@ -2099,6 +2119,14 @@
pi = proto_tree_add_pi(tree, hfindex, tvb, start, &length, &new_fi);
proto_tree_set_ipv4(new_fi, value);
+ if ( adding_pseudo == TRUE ) {
+ adding_pseudo = FALSE;
+ return pi;
+ }
+ adding_pseudo = TRUE;
+ item = proto_tree_add_item(tree, hf_ip_addr, tvb, start, length, ENC_BIG_ENDIAN);
+ PROTO_ITEM_SET_HIDDEN(item);
+
return pi;
}
Index: epan/dissectors/packet-ip.c
===================================================================
--- epan/dissectors/packet-ip.c (revision 40592)
+++ epan/dissectors/packet-ip.c (working copy)
@@ -104,7 +104,7 @@
static int hf_ip_dst_host = -1;
static int hf_ip_src = -1;
static int hf_ip_src_host = -1;
-static int hf_ip_addr = -1;
+int hf_ip_addr = -1;
static int hf_ip_host = -1;
static int hf_ip_flags = -1;
static int hf_ip_flags_sf = -1;
@@ -1035,9 +1035,6 @@
dst_host = get_hostname(addr);
proto_tree_add_ipv4(field_tree, hf_ip_dst, tvb,
offset + optoffset, 4, addr);
- item = proto_tree_add_ipv4(field_tree, hf_ip_addr, tvb,
- offset + optoffset, 4, addr);
- PROTO_ITEM_SET_HIDDEN(item);
item = proto_tree_add_string(field_tree, hf_ip_dst_host, tvb,
offset + optoffset, 4, dst_host);
PROTO_ITEM_SET_GENERATED(item);
@@ -1960,8 +1957,6 @@
ip_to_str(iph->ip_src.data));
}
proto_tree_add_ipv4(ip_tree, hf_ip_src, tvb, offset + 12, 4, addr);
- item = proto_tree_add_ipv4(ip_tree, hf_ip_addr, tvb, offset + 12, 4, addr);
- PROTO_ITEM_SET_HIDDEN(item);
item = proto_tree_add_string(ip_tree, hf_ip_src_host, tvb, offset + 12, 4,
src_host);
PROTO_ITEM_SET_GENERATED(item);
@@ -2042,9 +2037,6 @@
}
else {
proto_tree_add_ipv4(ip_tree, hf_ip_dst, tvb, offset + 16, 4, addr);
- item = proto_tree_add_ipv4(ip_tree, hf_ip_addr, tvb, offset + 16, 4,
- addr);
- PROTO_ITEM_SET_HIDDEN(item);
item = proto_tree_add_string(ip_tree, hf_ip_dst_host, tvb, offset + 16,
4, dst_host);
PROTO_ITEM_SET_GENERATED(item);
@@ -2251,7 +2243,7 @@
NULL, 0x0, NULL, HFILL }},
{ &hf_ip_addr,
- { "Source or Destination Address", "ip.addr", FT_IPv4, BASE_NONE,
+ { "IP Address", "ip.addr", FT_IPv4, BASE_NONE,
NULL, 0x0, NULL, HFILL }},
{ &hf_ip_host,
- Follow-Ups:
- Re: [Wireshark-dev] How do display filters work internally?
- From: Maynard, Chris
- Re: [Wireshark-dev] How do display filters work internally?
- Prev by Date: Re: [Wireshark-dev] Ronnie's Wireshark presentation / attaching files to the Presentations page on the wiki
- Next by Date: Re: [Wireshark-dev] Ronnie's Wireshark presentation / attaching files to the Presentations page on the wiki
- Previous by thread: Re: [Wireshark-dev] Reassembling fragmented messages
- Next by thread: Re: [Wireshark-dev] How do display filters work internally?
- Index(es):