-static dissector_handle_t eth_dissector_handle;
-static dissector_handle_t ip4_dissector_handle;
-static dissector_handle_t ip6_dissector_handle;
-static dissector_handle_t udp_dissector_handle;
-
-#define foreach_node_to_dissector_handle \
-_("ip6-lookup", "ipv6", ip6_dissector_handle) \
-_("ip4-input-no-checksum", "ip", ip4_dissector_handle) \
-_("ip4-lookup", "ip", ip4_dissector_handle) \
-_("ip4-local", "ip", ip4_dissector_handle) \
-_("ip4-udp-lookup", "ip", udp_dissector_handle) \
-_("ip4-icmp-error", "ip", ip4_dissector_handle) \
-_("ip4-glean", "ip", ip4_dissector_handle) \
-_("ethernet-input", "eth_maybefcs", eth_dissector_handle)
+static dissector_table_t vpp_subdissector_table;
+
+/* List of next dissector names that we know about */
+#define foreach_next_dissector \
+_(eth_maybefcs) \
+_(ip) \
+_(ipv6) \
+_(udp)
+
+#define _(a) static dissector_handle_t a##_dissector_handle;
+foreach_next_dissector;
+#undef _
+
+/*
+ * node-name, next dissector name pairs
+ *
+ * Unfortunately, -Werror=c++-compat causes
+ * the node names "ipX-not-enabled" to throw a shoe if
+ * not explicitly quoted. Never mind that the first macro
+ * arg is [only] used as a string (#xxx).
+ */
+
+#define foreach_node_to_dissector_pair \
+_("ip6-lookup", ipv6) \
+_("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)