Wireshark-dev: [Wireshark-dev] RFC: Filterable addresses
From: Joerg Mayer <jmayer@xxxxxxxxx>
Date: Sat, 14 Jan 2012 04:53:19 +0100
Hello List,
some while ago I sent a proposal to this list to enable filtering on
IP-addresses in arp requests. Guy asked whether generalizing that would
make more sense. IMO, it does. So, as a prove of concept I tried to
make everything of type FT_IPv4 filterable - and failed. My problem
is, that I don't know how/where to add the hf_ip_addr element in proto.c.
Putting it behind hf_text_only isn't the right place, I just fail to
find the right place/way to add it.
Hints (and general comments on the rest of the implementation) are
welcome!
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 40490)
+++ 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 */
+static int hf_ip_addr = -1;
+
/* 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 */
+gboolean adding_pseudo = FALSE;
+
/* List of all protocols */
static GList *protocols = NULL;
@@ -350,6 +356,11 @@
{ &hf_text_only,
{ "Text item", "text", FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
+
+ { &hf_ip_addr,
+ { "IP Address", "ip.addr",
+ FT_IPv4, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
};
proto_cleanup();
@@ -1203,6 +1214,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 +1700,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, FALSE);
+ PROTO_ITEM_SET_HIDDEN(item);
+ default:
+ break;
+ }
return pi;
}
@@ -2088,7 +2113,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 +2124,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, FALSE);
+ PROTO_ITEM_SET_HIDDEN(item);
+
return pi;
}
Index: epan/dissectors/packet-ip.c
===================================================================
--- epan/dissectors/packet-ip.c (revision 40490)
+++ 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);
- Prev by Date: Re: [Wireshark-dev] Windows build environment
- Next by Date: Re: [Wireshark-dev] Compile warnings (Was: rev 40479)
- Previous by thread: Re: [Wireshark-dev] [Wireshark-commits] rev 40479: /trunk/epan/ /trunk/epan/dissectors/: Makefile.common /trunk/epan/: CMakeLists.txt
- Next by thread: Re: [Wireshark-dev] [Wireshark-commits] buildbot failure in Wireshark (development) on Visual-Studio-Code-Analysis
- Index(es):