aboutsummaryrefslogtreecommitdiffstats
path: root/extras/wireshark/packet-vpp.c
diff options
context:
space:
mode:
Diffstat (limited to 'extras/wireshark/packet-vpp.c')
-rw-r--r--extras/wireshark/packet-vpp.c48
1 files changed, 38 insertions, 10 deletions
diff --git a/extras/wireshark/packet-vpp.c b/extras/wireshark/packet-vpp.c
index 9584e7003e2..fc568dae77d 100644
--- a/extras/wireshark/packet-vpp.c
+++ b/extras/wireshark/packet-vpp.c
@@ -95,7 +95,7 @@ static dissector_table_t vpp_subdissector_table;
_(eth_maybefcs) \
_(ip) \
_(ipv6) \
-_(udp)
+_(tcp)
#define _(a) static dissector_handle_t a##_dissector_handle;
foreach_next_dissector;
@@ -110,17 +110,28 @@ foreach_next_dissector;
* arg is [only] used as a string (#xxx).
*/
+/*
+ * Note: in addition to these direct mappings, we
+ * send traces w/ b->data[b->current_data] = 0x45 to
+ * the ip dissector, and 0x60 to the ipv6 dissector.
+ *
+ * It pays to add direct mappings for common places which
+ * may receive broken packets during development. ip4-lookup and
+ * ip6-lookup are obvious places where people send
+ * hand-crafted packets which may turn out to be broken.
+ */
#define foreach_node_to_dissector_pair \
-_("ip6-lookup", ipv6) \
+_("ethernet-input", eth_maybefcs) \
+_("ip4-glean", ip) \
+_("ip4-icmp-error", ip) \
_("ip4-input", ip) \
-_("ip4-not-enabled", ip) \
_("ip4-input-no-checksum", ip) \
-_("ip4-lookup", ip) \
_("ip4-local", ip) \
-_("ip4-udp-lookup", udp) \
-_("ip4-icmp-error", ip) \
-_("ip4-glean", ip) \
-_("ethernet-input", eth_maybefcs)
+_("ip4-lookup", ip) \
+_("ip4-udp-lookup", ip) \
+_("ip6-lookup", ipv6) \
+_("tcp4-output", tcp) \
+_("tcp6-output", tcp)
static void
add_multi_line_string_to_tree(proto_tree *tree, tvbuff_t *tvb, gint start,
@@ -756,8 +767,25 @@ dissect_vpp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
* Failing that, pretend its an ethernet packet
*/
if (!dissector_try_string (vpp_subdissector_table, name, eth_tvb,
- pinfo, tree, NULL))
- call_dissector (eth_maybefcs_dissector_handle, eth_tvb, pinfo, tree);
+ pinfo, tree, NULL)) {
+ guint8 maybe_protocol_id;
+ dissector_handle_t best_guess_dissector_handle
+ = eth_maybefcs_dissector_handle;
+
+ maybe_protocol_id = tvb_get_guint8 (tvb, offset);
+
+ switch (maybe_protocol_id) {
+ case 0x45:
+ best_guess_dissector_handle = ip_dissector_handle;
+ break;
+ case 0x60:
+ best_guess_dissector_handle = ipv6_dissector_handle;
+ break;
+ default:
+ break;
+ }
+ call_dissector (best_guess_dissector_handle, eth_tvb, pinfo, tree);
+ }
g_free (name);
return tvb_captured_length(tvb);