diff options
-rw-r--r-- | interface.h | 3 | ||||
-rw-r--r-- | netdissect.h | 4 | ||||
-rw-r--r-- | openflow.h | 3 | ||||
-rw-r--r-- | print-ether.c | 2 | ||||
-rw-r--r-- | print-openflow-1.0.c | 954 | ||||
-rw-r--r-- | print-openflow.c | 37 | ||||
-rw-r--r-- | print-slow.c | 144 | ||||
-rw-r--r-- | print-tcp.c | 4 | ||||
-rw-r--r-- | print-telnet.c | 55 |
9 files changed, 617 insertions, 589 deletions
diff --git a/interface.h b/interface.h index 400ff3b1..342cf890 100644 --- a/interface.h +++ b/interface.h @@ -163,7 +163,6 @@ extern u_int16_t create_osi_cksum(const u_int8_t *, int, int); #include <pcap.h> extern void ascii_print(const u_char *, u_int); -extern void telnet_print(const u_char *, u_int); extern void aarp_print(const u_char *, u_int); extern void aodv_print(const u_char *, u_int, int); extern void atalk_print(const u_char *, u_int); @@ -201,7 +200,6 @@ extern void nfsreq_print_noaddr(const u_char *, u_int, const u_char *); extern void ns_print(const u_char *, u_int, int); extern const u_char * ns_nprint (register const u_char *, register const u_char *); extern void ntp_print(const u_char *, u_int); -extern void openflow_print(const u_char *, const u_int); extern void ospf_print(const u_char *, u_int, const u_char *); extern void olsr_print (const u_char *, u_int, int); extern void pimv1_print(const u_char *, u_int); @@ -255,7 +253,6 @@ extern char *smb_errstr(int, int); extern const char *nt_errstr(u_int32_t); extern void print_data(const unsigned char *, int); extern void vrrp_print(const u_char *, u_int, const u_char *, int); -extern void slow_print(const u_char *, u_int); extern void sflow_print(const u_char *, u_int); extern void cfm_print(const u_char *, u_int); extern void pgm_print(const u_char *, u_int, const u_char *); diff --git a/netdissect.h b/netdissect.h index 512118cd..54ae76ef 100644 --- a/netdissect.h +++ b/netdissect.h @@ -427,13 +427,15 @@ extern void stp_print(netdissect_options *, const u_char *, u_int); extern void l2tp_print(netdissect_options *, const u_char *, u_int); extern void udp_print(netdissect_options *, const u_char *, u_int, const u_char *, int); extern void icmp_print(netdissect_options *, const u_char *, u_int, const u_char *, int); +extern void openflow_print(netdissect_options *, const u_char *, const u_int); +extern void telnet_print(netdissect_options *, const u_char *, u_int); +extern void slow_print(netdissect_options *, const u_char *, u_int); /* stuff that has not yet been rototiled */ extern const u_char * ns_nprint (register const u_char *, register const u_char *); #if 0 extern void ascii_print(netdissect_options *,u_int); -extern void telnet_print(netdissect_options *,const u_char *, u_int); extern void aarp_print(netdissect_options *,const u_char *, u_int); extern void atalk_print(netdissect_options *,const u_char *, u_int); extern void atm_if_print(u_char *,const struct pcap_pkthdr *, const u_char *); @@ -32,5 +32,6 @@ /* * Routines to print packets for various versions of OpenFlow. */ -extern const u_char *of10_header_body_print(const u_char *, const u_char *, +extern const u_char *of10_header_body_print(netdissect_options *ndo, + const u_char *, const u_char *, const uint8_t, const uint16_t, const uint32_t); diff --git a/print-ether.c b/print-ether.c index c1ebcae9..231c0728 100644 --- a/print-ether.c +++ b/print-ether.c @@ -385,7 +385,7 @@ ethertype_print(netdissect_options *ndo, return (1); case ETHERTYPE_SLOW: - slow_print(/*ndo,*/p, length); + slow_print(ndo, p, length); return (1); case ETHERTYPE_CFM: diff --git a/print-openflow-1.0.c b/print-openflow-1.0.c index 51c37386..03bb623f 100644 --- a/print-openflow-1.0.c +++ b/print-openflow-1.0.c @@ -42,6 +42,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -599,7 +600,8 @@ pcp_str(const uint8_t pcp) { } static void -of10_bitmap_print(const struct tok *t, const uint32_t v, const uint32_t u) { +of10_bitmap_print(netdissect_options *ndo, + const struct tok *t, const uint32_t v, const uint32_t u) { const char *sep = " ("; if (v == 0) @@ -607,73 +609,77 @@ of10_bitmap_print(const struct tok *t, const uint32_t v, const uint32_t u) { /* assigned bits */ for (; t->s != NULL; t++) if (v & t->v) { - printf("%s%s", sep, t->s); + ND_PRINT((ndo, "%s%s", sep, t->s)); sep = ", "; } /* unassigned bits? */ - printf(v & u ? ") (bogus)" : ")"); + ND_PRINT((ndo, v & u ? ") (bogus)" : ")")); } static const u_char * -of10_data_print(const u_char *cp, const u_char *ep, const u_int len) { +of10_data_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const u_int len) { if (len == 0) return cp; /* data */ - printf("\n\t data (%u octets)", len); - TCHECK2(*cp, len); - if (vflag >= 2) - hex_and_ascii_print(gndo, "\n\t ", cp, len); + ND_PRINT((ndo, "\n\t data (%u octets)", len)); + ND_TCHECK2(*cp, len); + if (ndo->ndo_vflag >= 2) + hex_and_ascii_print(ndo, "\n\t ", cp, len); return cp + len; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* Vendor ID is mandatory, data is optional. */ static const u_char * -of10_vendor_data_print(const u_char *cp, const u_char *ep, const u_int len) { +of10_vendor_data_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const u_int len) { if (len < 4) goto corrupt; /* vendor */ - TCHECK2(*cp, 4); - printf(", vendor 0x%08x", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, ", vendor 0x%08x", EXTRACT_32BITS(cp))); cp += 4; /* data */ - return of10_data_print(cp, ep, len - 4); + return of10_data_print(ndo, cp, ep, len - 4); corrupt: /* skip the undersized data */ - printf("%s", cstr); - TCHECK2(*cp, len); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp, len); return cp + len; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } static const u_char * -of10_packet_data_print(const u_char *cp, const u_char *ep, const u_int len) { +of10_packet_data_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const u_int len) { if (len == 0) return cp; /* data */ - printf("\n\t data (%u octets)", len); - if (vflag < 3) + ND_PRINT((ndo, "\n\t data (%u octets)", len)); + if (ndo->ndo_vflag < 3) return cp + len; - TCHECK2(*cp, len); - vflag -= 3; - printf(", frame decoding below\n"); - ether_print(gndo, cp, len, snapend - cp, NULL, NULL); - vflag += 3; + ND_TCHECK2(*cp, len); + ndo->ndo_vflag -= 3; + ND_PRINT((ndo, ", frame decoding below\n")); + ether_print(ndo, cp, len, ndo->ndo_snapend - cp, NULL, NULL); + ndo->ndo_vflag += 3; return cp + len; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* [OF10] Section 5.2.1 */ static const u_char * -of10_phy_ports_print(const u_char *cp, const u_char *ep, u_int len) { +of10_phy_ports_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, u_int len) { const u_char *cp0 = cp; const u_int len0 = len; @@ -681,54 +687,54 @@ of10_phy_ports_print(const u_char *cp, const u_char *ep, u_int len) { if (len < OF_PHY_PORT_LEN) goto corrupt; /* port_no */ - TCHECK2(*cp, 2); - printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* hw_addr */ - TCHECK2(*cp, ETHER_ADDR_LEN); - printf(", hw_addr %s", etheraddr_string(cp)); + ND_TCHECK2(*cp, ETHER_ADDR_LEN); + ND_PRINT((ndo, ", hw_addr %s", etheraddr_string(cp))); cp += ETHER_ADDR_LEN; /* name */ - TCHECK2(*cp, OFP_MAX_PORT_NAME_LEN); - printf(", name '"); + ND_TCHECK2(*cp, OFP_MAX_PORT_NAME_LEN); + ND_PRINT((ndo, ", name '")); fn_print(cp, cp + OFP_MAX_PORT_NAME_LEN); - printf("'"); + ND_PRINT((ndo, "'")); cp += OFP_MAX_PORT_NAME_LEN; - if (vflag < 2) { - TCHECK2(*cp, 24); + if (ndo->ndo_vflag < 2) { + ND_TCHECK2(*cp, 24); cp += 24; goto next_port; } /* config */ - TCHECK2(*cp, 4); - printf("\n\t config 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofppc_bm, EXTRACT_32BITS(cp), OFPPC_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t config 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofppc_bm, EXTRACT_32BITS(cp), OFPPC_U); cp += 4; /* state */ - TCHECK2(*cp, 4); - printf("\n\t state 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofpps_bm, EXTRACT_32BITS(cp), OFPPS_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t state 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofpps_bm, EXTRACT_32BITS(cp), OFPPS_U); cp += 4; /* curr */ - TCHECK2(*cp, 4); - printf("\n\t curr 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t curr 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); cp += 4; /* advertised */ - TCHECK2(*cp, 4); - printf("\n\t advertised 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t advertised 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); cp += 4; /* supported */ - TCHECK2(*cp, 4); - printf("\n\t supported 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t supported 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); cp += 4; /* peer */ - TCHECK2(*cp, 4); - printf("\n\t peer 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t peer 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); cp += 4; next_port: len -= OF_PHY_PORT_LEN; @@ -736,17 +742,18 @@ next_port: return cp; corrupt: /* skip the undersized trailing data */ - printf("%s", cstr); - TCHECK2(*cp0, len0); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* [OF10] Section 5.2.2 */ static const u_char * -of10_queue_props_print(const u_char *cp, const u_char *ep, u_int len) { +of10_queue_props_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, u_int len) { const u_char *cp0 = cp; const u_int len0 = len; uint16_t property, plen, rate; @@ -757,19 +764,19 @@ of10_queue_props_print(const u_char *cp, const u_char *ep, u_int len) { if (len < OF_QUEUE_PROP_HEADER_LEN) goto corrupt; /* property */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); property = EXTRACT_16BITS(cp); cp += 2; - printf("\n\t property %s", tok2str(ofpqt_str, "invalid (0x%04x)", property)); + ND_PRINT((ndo, "\n\t property %s", tok2str(ofpqt_str, "invalid (0x%04x)", property))); /* len */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); plen = EXTRACT_16BITS(cp); cp += 2; - printf(", len %u", plen); + ND_PRINT((ndo, ", len %u", plen)); if (plen < OF_QUEUE_PROP_HEADER_LEN || plen > len) goto corrupt; /* pad */ - TCHECK2(*cp, 4); + ND_TCHECK2(*cp, 4); cp += 4; /* property-specific constraints and decoding */ switch (property) { @@ -783,25 +790,25 @@ of10_queue_props_print(const u_char *cp, const u_char *ep, u_int len) { skip = 1; } if (plen_bogus) { - printf(" (bogus)"); + ND_PRINT((ndo, " (bogus)")); skip = 1; } if (skip) { - TCHECK2(*cp, plen - 4); + ND_TCHECK2(*cp, plen - 4); cp += plen - 4; goto next_property; } if (property == OFPQT_MIN_RATE) { /* the only case of property decoding */ /* rate */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); rate = EXTRACT_16BITS(cp); cp += 2; if (rate > 1000) - printf(", rate disabled"); + ND_PRINT((ndo, ", rate disabled")); else - printf(", rate %u.%u%%", rate / 10, rate % 10); + ND_PRINT((ndo, ", rate %u.%u%%", rate / 10, rate % 10)); /* pad */ - TCHECK2(*cp, 6); + ND_TCHECK2(*cp, 6); cp += 6; } next_property: @@ -810,17 +817,18 @@ next_property: return cp; corrupt: /* skip the rest of queue properties */ - printf("%s", cstr); - TCHECK2(*cp0, len0); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* ibid */ static const u_char * -of10_queues_print(const u_char *cp, const u_char *ep, u_int len) { +of10_queues_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, u_int len) { const u_char *cp0 = cp; const u_int len0 = len; uint16_t desclen; @@ -829,26 +837,26 @@ of10_queues_print(const u_char *cp, const u_char *ep, u_int len) { if (len < OF_PACKET_QUEUE_LEN) goto corrupt; /* queue_id */ - TCHECK2(*cp, 4); - printf("\n\t queue_id %u", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t queue_id %u", EXTRACT_32BITS(cp))); cp += 4; /* len */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); desclen = EXTRACT_16BITS(cp); cp += 2; - printf(", len %u", desclen); + ND_PRINT((ndo, ", len %u", desclen)); if (desclen < OF_PACKET_QUEUE_LEN || desclen > len) goto corrupt; /* pad */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); cp += 2; /* properties */ - if (vflag < 2) { - TCHECK2(*cp, desclen - OF_PACKET_QUEUE_LEN); + if (ndo->ndo_vflag < 2) { + ND_TCHECK2(*cp, desclen - OF_PACKET_QUEUE_LEN); cp += desclen - OF_PACKET_QUEUE_LEN; goto next_queue; } - if (ep == (cp = of10_queue_props_print(cp, ep, desclen - OF_PACKET_QUEUE_LEN))) + if (ep == (cp = of10_queue_props_print(ndo, cp, ep, desclen - OF_PACKET_QUEUE_LEN))) return ep; /* end of snapshot */ next_queue: len -= desclen; @@ -856,17 +864,18 @@ next_queue: return cp; corrupt: /* skip the rest of queues */ - printf("%s", cstr); - TCHECK2(*cp0, len0); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* [OF10] Section 5.2.3 */ static const u_char * -of10_match_print(const char *pfx, const u_char *cp, const u_char *ep) { +of10_match_print(netdissect_options *ndo, + const char *pfx, const u_char *cp, const u_char *ep) { uint32_t wildcards; uint16_t dl_type; uint8_t nw_proto; @@ -874,101 +883,102 @@ of10_match_print(const char *pfx, const u_char *cp, const u_char *ep) { const char *field_name; /* wildcards */ - TCHECK2(*cp, 4); + ND_TCHECK2(*cp, 4); wildcards = EXTRACT_32BITS(cp); if (wildcards & OFPFW_U) - printf("%swildcards 0x%08x (bogus)", pfx, wildcards); + ND_PRINT((ndo, "%swildcards 0x%08x (bogus)", pfx, wildcards)); cp += 4; /* in_port */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); if (! (wildcards & OFPFW_IN_PORT)) - printf("%smatch in_port %s", pfx, tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_PRINT((ndo, "%smatch in_port %s", pfx, tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* dl_src */ - TCHECK2(*cp, ETHER_ADDR_LEN); + ND_TCHECK2(*cp, ETHER_ADDR_LEN); if (! (wildcards & OFPFW_DL_SRC)) - printf("%smatch dl_src %s", pfx, etheraddr_string(cp)); + ND_PRINT((ndo, "%smatch dl_src %s", pfx, etheraddr_string(cp))); cp += ETHER_ADDR_LEN; /* dl_dst */ - TCHECK2(*cp, ETHER_ADDR_LEN); + ND_TCHECK2(*cp, ETHER_ADDR_LEN); if (! (wildcards & OFPFW_DL_DST)) - printf("%smatch dl_dst %s", pfx, etheraddr_string(cp)); + ND_PRINT((ndo, "%smatch dl_dst %s", pfx, etheraddr_string(cp))); cp += ETHER_ADDR_LEN; /* dl_vlan */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); if (! (wildcards & OFPFW_DL_VLAN)) - printf("%smatch dl_vlan %s", pfx, vlan_str(EXTRACT_16BITS(cp))); + ND_PRINT((ndo, "%smatch dl_vlan %s", pfx, vlan_str(EXTRACT_16BITS(cp)))); cp += 2; /* dl_vlan_pcp */ - TCHECK2(*cp, 1); + ND_TCHECK2(*cp, 1); if (! (wildcards & OFPFW_DL_VLAN_PCP)) - printf("%smatch dl_vlan_pcp %s", pfx, pcp_str(*cp)); + ND_PRINT((ndo, "%smatch dl_vlan_pcp %s", pfx, pcp_str(*cp))); cp += 1; /* pad1 */ - TCHECK2(*cp, 1); + ND_TCHECK2(*cp, 1); cp += 1; /* dl_type */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); dl_type = EXTRACT_16BITS(cp); cp += 2; if (! (wildcards & OFPFW_DL_TYPE)) - printf("%smatch dl_type 0x%04x", pfx, dl_type); + ND_PRINT((ndo, "%smatch dl_type 0x%04x", pfx, dl_type)); /* nw_tos */ - TCHECK2(*cp, 1); + ND_TCHECK2(*cp, 1); if (! (wildcards & OFPFW_NW_TOS)) - printf("%smatch nw_tos 0x%02x", pfx, *cp); + ND_PRINT((ndo, "%smatch nw_tos 0x%02x", pfx, *cp)); cp += 1; /* nw_proto */ - TCHECK2(*cp, 1); + ND_TCHECK2(*cp, 1); nw_proto = *cp; cp += 1; if (! (wildcards & OFPFW_NW_PROTO)) { field_name = ! (wildcards & OFPFW_DL_TYPE) && dl_type == ETHERTYPE_ARP ? "arp_opcode" : "nw_proto"; - printf("%smatch %s %u", pfx, field_name, nw_proto); + ND_PRINT((ndo, "%smatch %s %u", pfx, field_name, nw_proto)); } /* pad2 */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); cp += 2; /* nw_src */ - TCHECK2(*cp, 4); + ND_TCHECK2(*cp, 4); nw_bits = (wildcards & OFPFW_NW_SRC_MASK) >> OFPFW_NW_SRC_SHIFT; if (nw_bits < 32) - printf("%smatch nw_src %s/%u", pfx, ipaddr_string(cp), 32 - nw_bits); + ND_PRINT((ndo, "%smatch nw_src %s/%u", pfx, ipaddr_string(cp), 32 - nw_bits)); cp += 4; /* nw_dst */ - TCHECK2(*cp, 4); + ND_TCHECK2(*cp, 4); nw_bits = (wildcards & OFPFW_NW_DST_MASK) >> OFPFW_NW_DST_SHIFT; if (nw_bits < 32) - printf("%smatch nw_dst %s/%u", pfx, ipaddr_string(cp), 32 - nw_bits); + ND_PRINT((ndo, "%smatch nw_dst %s/%u", pfx, ipaddr_string(cp), 32 - nw_bits)); cp += 4; /* tp_src */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); if (! (wildcards & OFPFW_TP_SRC)) { field_name = ! (wildcards & OFPFW_DL_TYPE) && dl_type == ETHERTYPE_IP && ! (wildcards & OFPFW_NW_PROTO) && nw_proto == IPPROTO_ICMP ? "icmp_type" : "tp_src"; - printf("%smatch %s %u", pfx, field_name, EXTRACT_16BITS(cp)); + ND_PRINT((ndo, "%smatch %s %u", pfx, field_name, EXTRACT_16BITS(cp))); } cp += 2; /* tp_dst */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); if (! (wildcards & OFPFW_TP_DST)) { field_name = ! (wildcards & OFPFW_DL_TYPE) && dl_type == ETHERTYPE_IP && ! (wildcards & OFPFW_NW_PROTO) && nw_proto == IPPROTO_ICMP ? "icmp_code" : "tp_dst"; - printf("%smatch %s %u", pfx, field_name, EXTRACT_16BITS(cp)); + ND_PRINT((ndo, "%smatch %s %u", pfx, field_name, EXTRACT_16BITS(cp))); } return cp + 2; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* [OF10] Section 5.2.4 */ static const u_char * -of10_actions_print(const char *pfx, const u_char *cp, const u_char *ep, +of10_actions_print(netdissect_options *ndo, + const char *pfx, const u_char *cp, const u_char *ep, u_int len) { const u_char *cp0 = cp; const u_int len0 = len; @@ -980,15 +990,15 @@ of10_actions_print(const char *pfx, const u_char *cp, const u_char *ep, if (len < OF_ACTION_HEADER_LEN) goto corrupt; /* type */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); type = EXTRACT_16BITS(cp); cp += 2; - printf("%saction type %s", pfx, tok2str(ofpat_str, "invalid (0x%04x)", type)); + ND_PRINT((ndo, "%saction type %s", pfx, tok2str(ofpat_str, "invalid (0x%04x)", type))); /* length */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); alen = EXTRACT_16BITS(cp); cp += 2; - printf(", len %u", alen); + ND_PRINT((ndo, ", len %u", alen)); /* On action size underrun/overrun skip the rest of the action list. */ if (alen < OF_ACTION_HEADER_LEN || alen > len) goto corrupt; @@ -1018,11 +1028,11 @@ of10_actions_print(const char *pfx, const u_char *cp, const u_char *ep, skip = 1; } if (alen_bogus) { - printf(" (bogus)"); + ND_PRINT((ndo, " (bogus)")); skip = 1; } if (skip) { - TCHECK2(*cp, alen - 4); + ND_TCHECK2(*cp, alen - 4); cp += alen - 4; goto next_action; } @@ -1030,90 +1040,90 @@ of10_actions_print(const char *pfx, const u_char *cp, const u_char *ep, switch (type) { case OFPAT_OUTPUT: /* port */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); output_port = EXTRACT_16BITS(cp); cp += 2; - printf(", port %s", tok2str(ofpp_str, "%u", output_port)); + ND_PRINT((ndo, ", port %s", tok2str(ofpp_str, "%u", output_port))); /* max_len */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); if (output_port == OFPP_CONTROLLER) - printf(", max_len %u", EXTRACT_16BITS(cp)); + ND_PRINT((ndo, ", max_len %u", EXTRACT_16BITS(cp))); cp += 2; break; case OFPAT_SET_VLAN_VID: /* vlan_vid */ - TCHECK2(*cp, 2); - printf(", vlan_vid %s", vlan_str(EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", vlan_vid %s", vlan_str(EXTRACT_16BITS(cp)))); cp += 2; /* pad */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); cp += 2; break; case OFPAT_SET_VLAN_PCP: /* vlan_pcp */ - TCHECK2(*cp, 1); - printf(", vlan_pcp %s", pcp_str(*cp)); + ND_TCHECK2(*cp, 1); + ND_PRINT((ndo, ", vlan_pcp %s", pcp_str(*cp))); cp += 1; /* pad */ - TCHECK2(*cp, 3); + ND_TCHECK2(*cp, 3); cp += 3; break; case OFPAT_SET_DL_SRC: case OFPAT_SET_DL_DST: /* dl_addr */ - TCHECK2(*cp, ETHER_ADDR_LEN); - printf(", dl_addr %s", etheraddr_string(cp)); + ND_TCHECK2(*cp, ETHER_ADDR_LEN); + ND_PRINT((ndo, ", dl_addr %s", etheraddr_string(cp))); cp += ETHER_ADDR_LEN; /* pad */ - TCHECK2(*cp, 6); + ND_TCHECK2(*cp, 6); cp += 6; break; case OFPAT_SET_NW_SRC: case OFPAT_SET_NW_DST: /* nw_addr */ - TCHECK2(*cp, 4); - printf(", nw_addr %s", ipaddr_string(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, ", nw_addr %s", ipaddr_string(cp))); cp += 4; break; case OFPAT_SET_NW_TOS: /* nw_tos */ - TCHECK2(*cp, 1); - printf(", nw_tos 0x%02x", *cp); + ND_TCHECK2(*cp, 1); + ND_PRINT((ndo, ", nw_tos 0x%02x", *cp)); cp += 1; /* pad */ - TCHECK2(*cp, 3); + ND_TCHECK2(*cp, 3); cp += 3; break; case OFPAT_SET_TP_SRC: case OFPAT_SET_TP_DST: /* nw_tos */ - TCHECK2(*cp, 2); - printf(", tp_port %u", EXTRACT_16BITS(cp)); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", tp_port %u", EXTRACT_16BITS(cp))); cp += 2; /* pad */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); cp += 2; break; case OFPAT_ENQUEUE: /* port */ - TCHECK2(*cp, 2); - printf(", port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* pad */ - TCHECK2(*cp, 6); + ND_TCHECK2(*cp, 6); cp += 6; /* queue_id */ - TCHECK2(*cp, 4); - printf(", queue_id %s", tok2str(ofpq_str, "%u", EXTRACT_32BITS(cp))); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, ", queue_id %s", tok2str(ofpq_str, "%u", EXTRACT_32BITS(cp)))); cp += 4; break; case OFPAT_VENDOR: - if (ep == (cp = of10_vendor_data_print(cp, ep, alen - 4))) + if (ep == (cp = of10_vendor_data_print(ndo, cp, ep, alen - 4))) return ep; /* end of snapshot */ break; case OFPAT_STRIP_VLAN: /* pad */ - TCHECK2(*cp, 4); + ND_TCHECK2(*cp, 4); cp += 4; break; } /* switch */ @@ -1123,158 +1133,162 @@ next_action: return cp; corrupt: /* skip the rest of actions */ - printf("%s", cstr); - TCHECK2(*cp0, len0); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* [OF10] Section 5.3.1 */ static const u_char * -of10_features_reply_print(const u_char *cp, const u_char *ep, const u_int len) { +of10_features_reply_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const u_int len) { /* datapath_id */ - TCHECK2(*cp, 8); - printf("\n\t dpid 0x%016" PRIx64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, "\n\t dpid 0x%016" PRIx64, EXTRACT_64BITS(cp))); cp += 8; /* n_buffers */ - TCHECK2(*cp, 4); - printf(", n_buffers %u", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, ", n_buffers %u", EXTRACT_32BITS(cp))); cp += 4; /* n_tables */ - TCHECK2(*cp, 1); - printf(", n_tables %u", *cp); + ND_TCHECK2(*cp, 1); + ND_PRINT((ndo, ", n_tables %u", *cp)); cp += 1; /* pad */ - TCHECK2(*cp, 3); + ND_TCHECK2(*cp, 3); cp += 3; /* capabilities */ - TCHECK2(*cp, 4); - printf("\n\t capabilities 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofp_capabilities_bm, EXTRACT_32BITS(cp), OFPCAP_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t capabilities 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofp_capabilities_bm, EXTRACT_32BITS(cp), OFPCAP_U); cp += 4; /* actions */ - TCHECK2(*cp, 4); - printf("\n\t actions 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofpat_bm, EXTRACT_32BITS(cp), OFPAT_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t actions 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofpat_bm, EXTRACT_32BITS(cp), OFPAT_U); cp += 4; /* ports */ - return of10_phy_ports_print(cp, ep, len - OF_SWITCH_FEATURES_LEN); + return of10_phy_ports_print(ndo, cp, ep, len - OF_SWITCH_FEATURES_LEN); trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* [OF10] Section 5.3.3 */ static const u_char * -of10_flow_mod_print(const u_char *cp, const u_char *ep, const u_int len) { +of10_flow_mod_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const u_int len) { uint16_t command; /* match */ - if (ep == (cp = of10_match_print("\n\t ", cp, ep))) + if (ep == (cp = of10_match_print(ndo, "\n\t ", cp, ep))) return ep; /* end of snapshot */ /* cookie */ - TCHECK2(*cp, 8); - printf("\n\t cookie 0x%016" PRIx64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, "\n\t cookie 0x%016" PRIx64, EXTRACT_64BITS(cp))); cp += 8; /* command */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); command = EXTRACT_16BITS(cp); - printf(", command %s", tok2str(ofpfc_str, "invalid (0x%04x)", command)); + ND_PRINT((ndo, ", command %s", tok2str(ofpfc_str, "invalid (0x%04x)", command))); cp += 2; /* idle_timeout */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); if (EXTRACT_16BITS(cp)) - printf(", idle_timeout %u", EXTRACT_16BITS(cp)); + ND_PRINT((ndo, ", idle_timeout %u", EXTRACT_16BITS(cp))); cp += 2; /* hard_timeout */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); if (EXTRACT_16BITS(cp)) - printf(", hard_timeout %u", EXTRACT_16BITS(cp)); + ND_PRINT((ndo, ", hard_timeout %u", EXTRACT_16BITS(cp))); cp += 2; /* priority */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); if (EXTRACT_16BITS(cp)) - printf(", priority %u", EXTRACT_16BITS(cp)); + ND_PRINT((ndo, ", priority %u", EXTRACT_16BITS(cp))); cp += 2; /* buffer_id */ - TCHECK2(*cp, 4); + ND_TCHECK2(*cp, 4); if (command == OFPFC_ADD || command == OFPFC_MODIFY || command == OFPFC_MODIFY_STRICT) - printf(", buffer_id %s", tok2str(bufferid_str, "0x%08x", EXTRACT_32BITS(cp))); + ND_PRINT((ndo, ", buffer_id %s", tok2str(bufferid_str, "0x%08x", EXTRACT_32BITS(cp)))); cp += 4; /* out_port */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); if (command == OFPFC_DELETE || command == OFPFC_DELETE_STRICT) - printf(", out_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_PRINT((ndo, ", out_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* flags */ - TCHECK2(*cp, 2); - printf(", flags 0x%04x", EXTRACT_16BITS(cp)); - of10_bitmap_print(ofpff_bm, EXTRACT_16BITS(cp), OFPFF_U); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", flags 0x%04x", EXTRACT_16BITS(cp))); + of10_bitmap_print(ndo, ofpff_bm, EXTRACT_16BITS(cp), OFPFF_U); cp += 2; /* actions */ - return of10_actions_print("\n\t ", cp, ep, len - OF_FLOW_MOD_LEN); + return of10_actions_print(ndo, "\n\t ", cp, ep, len - OF_FLOW_MOD_LEN); trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* ibid */ static const u_char * -of10_port_mod_print(const u_char *cp, const u_char *ep) { +of10_port_mod_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep) { /* port_no */ - TCHECK2(*cp, 2); - printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* hw_addr */ - TCHECK2(*cp, ETHER_ADDR_LEN); - printf(", hw_addr %s", etheraddr_string(cp)); + ND_TCHECK2(*cp, ETHER_ADDR_LEN); + ND_PRINT((ndo, ", hw_addr %s", etheraddr_string(cp))); cp += ETHER_ADDR_LEN; /* config */ - TCHECK2(*cp, 4); - printf("\n\t config 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofppc_bm, EXTRACT_32BITS(cp), OFPPC_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t config 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofppc_bm, EXTRACT_32BITS(cp), OFPPC_U); cp += 4; /* mask */ - TCHECK2(*cp, 4); - printf("\n\t mask 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofppc_bm, EXTRACT_32BITS(cp), OFPPC_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t mask 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofppc_bm, EXTRACT_32BITS(cp), OFPPC_U); cp += 4; /* advertise */ - TCHECK2(*cp, 4); - printf("\n\t advertise 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t advertise 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); cp += 4; /* pad */ - TCHECK2(*cp, 4); + ND_TCHECK2(*cp, 4); return cp + 4; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* [OF10] Section 5.3.5 */ static const u_char * -of10_stats_request_print(const u_char *cp, const u_char *ep, u_int len) { +of10_stats_request_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, u_int len) { const u_char *cp0 = cp; const u_int len0 = len; uint16_t type; /* type */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); type = EXTRACT_16BITS(cp); cp += 2; - printf("\n\t type %s", tok2str(ofpst_str, "invalid (0x%04x)", type)); + ND_PRINT((ndo, "\n\t type %s", tok2str(ofpst_str, "invalid (0x%04x)", type))); /* flags */ - TCHECK2(*cp, 2); - printf(", flags 0x%04x", EXTRACT_16BITS(cp)); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", flags 0x%04x", EXTRACT_16BITS(cp))); if (EXTRACT_16BITS(cp)) - printf(" (bogus)"); + ND_PRINT((ndo, " (bogus)")); cp += 2; /* type-specific body of one of fixed lengths */ len -= OF_STATS_REQUEST_LEN; @@ -1289,105 +1303,107 @@ of10_stats_request_print(const u_char *cp, const u_char *ep, u_int len) { if (len != OF_FLOW_STATS_REQUEST_LEN) goto corrupt; /* match */ - if (ep == (cp = of10_match_print("\n\t ", cp, ep))) + if (ep == (cp = of10_match_print(ndo, "\n\t ", cp, ep))) return ep; /* end of snapshot */ /* table_id */ - TCHECK2(*cp, 1); - printf("\n\t table_id %s", tok2str(tableid_str, "%u", *cp)); + ND_TCHECK2(*cp, 1); + ND_PRINT((ndo, "\n\t table_id %s", tok2str(tableid_str, "%u", *cp))); cp += 1; /* pad */ - TCHECK2(*cp, 1); + ND_TCHECK2(*cp, 1); cp += 1; /* out_port */ - TCHECK2(*cp, 2); - printf(", out_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", out_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); return cp + 2; case OFPST_PORT: if (len != OF_PORT_STATS_REQUEST_LEN) goto corrupt; /* port_no */ - TCHECK2(*cp, 2); - printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* pad */ - TCHECK2(*cp, 6); + ND_TCHECK2(*cp, 6); return cp + 6; case OFPST_QUEUE: if (len != OF_QUEUE_STATS_REQUEST_LEN) goto corrupt; /* port_no */ - TCHECK2(*cp, 2); - printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* pad */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); cp += 2; /* queue_id */ - TCHECK2(*cp, 4); - printf(", queue_id %s", tok2str(ofpq_str, "%u", EXTRACT_32BITS(cp))); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, ", queue_id %s", tok2str(ofpq_str, "%u", EXTRACT_32BITS(cp)))); return cp + 4; case OFPST_VENDOR: - return of10_vendor_data_print(cp, ep, len); + return of10_vendor_data_print(ndo, cp, ep, len); } return cp; corrupt: /* skip the message body */ - printf("%s", cstr); - TCHECK2(*cp0, len0); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* ibid */ static const u_char * -of10_desc_stats_reply_print(const u_char *cp, const u_char *ep, const u_int len) { +of10_desc_stats_reply_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const u_int len) { if (len != OF_DESC_STATS_LEN) goto corrupt; /* mfr_desc */ - TCHECK2(*cp, DESC_STR_LEN); - printf("\n\t mfr_desc '"); + ND_TCHECK2(*cp, DESC_STR_LEN); + ND_PRINT((ndo, "\n\t mfr_desc '")); fn_print(cp, cp + DESC_STR_LEN); - printf("'"); + ND_PRINT((ndo, "'")); cp += DESC_STR_LEN; /* hw_desc */ - TCHECK2(*cp, DESC_STR_LEN); - printf("\n\t hw_desc '"); + ND_TCHECK2(*cp, DESC_STR_LEN); + ND_PRINT((ndo, "\n\t hw_desc '")); fn_print(cp, cp + DESC_STR_LEN); - printf("'"); + ND_PRINT((ndo, "'")); cp += DESC_STR_LEN; /* sw_desc */ - TCHECK2(*cp, DESC_STR_LEN); - printf("\n\t sw_desc '"); + ND_TCHECK2(*cp, DESC_STR_LEN); + ND_PRINT((ndo, "\n\t sw_desc '")); fn_print(cp, cp + DESC_STR_LEN); - printf("'"); + ND_PRINT((ndo, "'")); cp += DESC_STR_LEN; /* serial_num */ - TCHECK2(*cp, SERIAL_NUM_LEN); - printf("\n\t serial_num '"); + ND_TCHECK2(*cp, SERIAL_NUM_LEN); + ND_PRINT((ndo, "\n\t serial_num '")); fn_print(cp, cp + SERIAL_NUM_LEN); - printf("'"); + ND_PRINT((ndo, "'")); cp += SERIAL_NUM_LEN; /* dp_desc */ - TCHECK2(*cp, DESC_STR_LEN); - printf("\n\t dp_desc '"); + ND_TCHECK2(*cp, DESC_STR_LEN); + ND_PRINT((ndo, "\n\t dp_desc '")); fn_print(cp, cp + DESC_STR_LEN); - printf("'"); + ND_PRINT((ndo, "'")); return cp + DESC_STR_LEN; corrupt: /* skip the message body */ - printf("%s", cstr); - TCHECK2(*cp, len); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp, len); return cp + len; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* ibid */ static const u_char * -of10_flow_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { +of10_flow_stats_reply_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, u_int len) { const u_char *cp0 = cp; const u_int len0 = len; uint16_t entry_len; @@ -1396,59 +1412,59 @@ of10_flow_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { if (len < OF_FLOW_STATS_LEN) goto corrupt; /* length */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); entry_len = EXTRACT_16BITS(cp); - printf("\n\t length %u", entry_len); + ND_PRINT((ndo, "\n\t length %u", entry_len)); if (entry_len < OF_FLOW_STATS_LEN || entry_len > len) goto corrupt; cp += 2; /* table_id */ - TCHECK2(*cp, 1); - printf(", table_id %s", tok2str(tableid_str, "%u", *cp)); + ND_TCHECK2(*cp, 1); + ND_PRINT((ndo, ", table_id %s", tok2str(tableid_str, "%u", *cp))); cp += 1; /* pad */ - TCHECK2(*cp, 1); + ND_TCHECK2(*cp, 1); cp += 1; /* match */ - if (ep == (cp = of10_match_print("\n\t ", cp, ep))) + if (ep == (cp = of10_match_print(ndo, "\n\t ", cp, ep))) return ep; /* end of snapshot */ /* duration_sec */ - TCHECK2(*cp, 4); - printf("\n\t duration_sec %u", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t duration_sec %u", EXTRACT_32BITS(cp))); cp += 4; /* duration_nsec */ - TCHECK2(*cp, 4); - printf(", duration_nsec %u", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, ", duration_nsec %u", EXTRACT_32BITS(cp))); cp += 4; /* priority */ - TCHECK2(*cp, 2); - printf(", priority %u", EXTRACT_16BITS(cp)); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", priority %u", EXTRACT_16BITS(cp))); cp += 2; /* idle_timeout */ - TCHECK2(*cp, 2); - printf(", idle_timeout %u", EXTRACT_16BITS(cp)); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", idle_timeout %u", EXTRACT_16BITS(cp))); cp += 2; /* hard_timeout */ - TCHECK2(*cp, 2); - printf(", hard_timeout %u", EXTRACT_16BITS(cp)); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", hard_timeout %u", EXTRACT_16BITS(cp))); cp += 2; /* pad2 */ - TCHECK2(*cp, 6); + ND_TCHECK2(*cp, 6); cp += 6; /* cookie */ - TCHECK2(*cp, 8); - printf(", cookie 0x%016" PRIx64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", cookie 0x%016" PRIx64, EXTRACT_64BITS(cp))); cp += 8; /* packet_count */ - TCHECK2(*cp, 8); - printf(", packet_count %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", packet_count %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* byte_count */ - TCHECK2(*cp, 8); - printf(", byte_count %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", byte_count %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* actions */ - if (ep == (cp = of10_actions_print("\n\t ", cp, ep, entry_len - OF_FLOW_STATS_LEN))) + if (ep == (cp = of10_actions_print(ndo, "\n\t ", cp, ep, entry_len - OF_FLOW_STATS_LEN))) return ep; /* end of snapshot */ len -= entry_len; @@ -1456,48 +1472,50 @@ of10_flow_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { return cp; corrupt: /* skip the rest of flow statistics entries */ - printf("%s", cstr); - TCHECK2(*cp0, len0); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* ibid */ static const u_char * -of10_aggregate_stats_reply_print(const u_char *cp, const u_char *ep, +of10_aggregate_stats_reply_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const u_int len) { if (len != OF_AGGREGATE_STATS_REPLY_LEN) goto corrupt; /* packet_count */ - TCHECK2(*cp, 8); - printf("\n\t packet_count %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, "\n\t packet_count %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* byte_count */ - TCHECK2(*cp, 8); - printf(", byte_count %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", byte_count %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* flow_count */ - TCHECK2(*cp, 4); - printf(", flow_count %u", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, ", flow_count %u", EXTRACT_32BITS(cp))); cp += 4; /* pad */ - TCHECK2(*cp, 4); + ND_TCHECK2(*cp, 4); return cp + 4; corrupt: /* skip the message body */ - printf("%s", cstr); - TCHECK2(*cp, len); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp, len); return cp + len; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* ibid */ static const u_char * -of10_table_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { +of10_table_stats_reply_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, u_int len) { const u_char *cp0 = cp; const u_int len0 = len; @@ -1505,38 +1523,38 @@ of10_table_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { if (len < OF_TABLE_STATS_LEN) goto corrupt; /* table_id */ - TCHECK2(*cp, 1); - printf("\n\t table_id %s", tok2str(tableid_str, "%u", *cp)); + ND_TCHECK2(*cp, 1); + ND_PRINT((ndo, "\n\t table_id %s", tok2str(tableid_str, "%u", *cp))); cp += 1; /* pad */ - TCHECK2(*cp, 3); + ND_TCHECK2(*cp, 3); cp += 3; /* name */ - TCHECK2(*cp, OFP_MAX_TABLE_NAME_LEN); - printf(", name '"); + ND_TCHECK2(*cp, OFP_MAX_TABLE_NAME_LEN); + ND_PRINT((ndo, ", name '")); fn_print(cp, cp + OFP_MAX_TABLE_NAME_LEN); - printf("'"); + ND_PRINT((ndo, "'")); cp += OFP_MAX_TABLE_NAME_LEN; /* wildcards */ - TCHECK2(*cp, 4); - printf("\n\t wildcards 0x%08x", EXTRACT_32BITS(cp)); - of10_bitmap_print(ofpfw_bm, EXTRACT_32BITS(cp), OFPFW_U); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t wildcards 0x%08x", EXTRACT_32BITS(cp))); + of10_bitmap_print(ndo, ofpfw_bm, EXTRACT_32BITS(cp), OFPFW_U); cp += 4; /* max_entries */ - TCHECK2(*cp, 4); - printf("\n\t max_entries %u", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t max_entries %u", EXTRACT_32BITS(cp))); cp += 4; /* active_count */ - TCHECK2(*cp, 4); - printf(", active_count %u", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, ", active_count %u", EXTRACT_32BITS(cp))); cp += 4; /* lookup_count */ - TCHECK2(*cp, 8); - printf(", lookup_count %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", lookup_count %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* matched_count */ - TCHECK2(*cp, 8); - printf(", matched_count %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", matched_count %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; len -= OF_TABLE_STATS_LEN; @@ -1544,17 +1562,18 @@ of10_table_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { return cp; corrupt: /* skip the undersized trailing data */ - printf("%s", cstr); - TCHECK2(*cp0, len0); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* ibid */ static const u_char * -of10_port_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { +of10_port_stats_reply_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, u_int len) { const u_char *cp0 = cp; const u_int len0 = len; @@ -1562,64 +1581,64 @@ of10_port_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { if (len < OF_PORT_STATS_LEN) goto corrupt; /* port_no */ - TCHECK2(*cp, 2); - printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; - if (vflag < 2) { - TCHECK2(*cp, OF_PORT_STATS_LEN - 2); + if (ndo->ndo_vflag < 2) { + ND_TCHECK2(*cp, OF_PORT_STATS_LEN - 2); cp += OF_PORT_STATS_LEN - 2; goto next_port; } /* pad */ - TCHECK2(*cp, 6); + ND_TCHECK2(*cp, 6); cp += 6; /* rx_packets */ - TCHECK2(*cp, 8); - printf(", rx_packets %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", rx_packets %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* tx_packets */ - TCHECK2(*cp, 8); - printf(", tx_packets %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", tx_packets %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* rx_bytes */ - TCHECK2(*cp, 8); - printf(", rx_bytes %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", rx_bytes %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* tx_bytes */ - TCHECK2(*cp, 8); - printf(", tx_bytes %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", tx_bytes %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* rx_dropped */ - TCHECK2(*cp, 8); - printf(", rx_dropped %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", rx_dropped %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* tx_dropped */ - TCHECK2(*cp, 8); - printf(", tx_dropped %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", tx_dropped %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* rx_errors */ - TCHECK2(*cp, 8); - printf(", rx_errors %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", rx_errors %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* tx_errors */ - TCHECK2(*cp, 8); - printf(", tx_errors %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", tx_errors %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* rx_frame_err */ - TCHECK2(*cp, 8); - printf(", rx_frame_err %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", rx_frame_err %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* rx_over_err */ - TCHECK2(*cp, 8); - printf(", rx_over_err %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", rx_over_err %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* rx_crc_err */ - TCHECK2(*cp, 8); - printf(", rx_crc_err %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", rx_crc_err %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* collisions */ - TCHECK2(*cp, 8); - printf(", collisions %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", collisions %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; next_port: len -= OF_PORT_STATS_LEN; @@ -1627,17 +1646,18 @@ next_port: return cp; corrupt: /* skip the undersized trailing data */ - printf("%s", cstr); - TCHECK2(*cp0, len0); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* ibid */ static const u_char * -of10_queue_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { +of10_queue_stats_reply_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, u_int len) { const u_char *cp0 = cp; const u_int len0 = len; @@ -1645,27 +1665,27 @@ of10_queue_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { if (len < OF_QUEUE_STATS_LEN) goto corrupt; /* port_no */ - TCHECK2(*cp, 2); - printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* pad */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); cp += 2; /* queue_id */ - TCHECK2(*cp, 4); - printf(", queue_id %u", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, ", queue_id %u", EXTRACT_32BITS(cp))); cp += 4; /* tx_bytes */ - TCHECK2(*cp, 8); - printf(", tx_bytes %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", tx_bytes %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* tx_packets */ - TCHECK2(*cp, 8); - printf(", tx_packets %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", tx_packets %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* tx_errors */ - TCHECK2(*cp, 8); - printf(", tx_errors %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", tx_errors %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; len -= OF_QUEUE_STATS_LEN; @@ -1673,33 +1693,34 @@ of10_queue_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { return cp; corrupt: /* skip the undersized trailing data */ - printf("%s", cstr); - TCHECK2(*cp0, len0); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* ibid */ static const u_char * -of10_stats_reply_print(const u_char *cp, const u_char *ep, const u_int len) { +of10_stats_reply_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const u_int len) { const u_char *cp0 = cp; uint16_t type; /* type */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); type = EXTRACT_16BITS(cp); - printf("\n\t type %s", tok2str(ofpst_str, "invalid (0x%04x)", type)); + ND_PRINT((ndo, "\n\t type %s", tok2str(ofpst_str, "invalid (0x%04x)", type))); cp += 2; /* flags */ - TCHECK2(*cp, 2); - printf(", flags 0x%04x", EXTRACT_16BITS(cp)); - of10_bitmap_print(ofpsf_reply_bm, EXTRACT_16BITS(cp), OFPSF_REPLY_U); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", flags 0x%04x", EXTRACT_16BITS(cp))); + of10_bitmap_print(ndo, ofpsf_reply_bm, EXTRACT_16BITS(cp), OFPSF_REPLY_U); cp += 2; - if (vflag > 0) { - const u_char *(*decoder)(const u_char *, const u_char *, u_int) = + if (ndo->ndo_vflag > 0) { + const u_char *(*decoder)(netdissect_options *, const u_char *, const u_char *, u_int) = type == OFPST_DESC ? of10_desc_stats_reply_print : type == OFPST_FLOW ? of10_flow_stats_reply_print : type == OFPST_AGGREGATE ? of10_aggregate_stats_reply_print : @@ -1709,148 +1730,152 @@ of10_stats_reply_print(const u_char *cp, const u_char *ep, const u_int len) { type == OFPST_VENDOR ? of10_vendor_data_print : NULL; if (decoder != NULL) - return decoder(cp, ep, len - OF_STATS_REPLY_LEN); + return decoder(ndo, cp, ep, len - OF_STATS_REPLY_LEN); } - TCHECK2(*cp0, len); + ND_TCHECK2(*cp0, len); return cp0 + len; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* [OF10] Section 5.3.6 */ static const u_char * -of10_packet_out_print(const u_char *cp, const u_char *ep, const u_int len) { +of10_packet_out_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const u_int len) { const u_char *cp0 = cp; const u_int len0 = len; uint16_t actions_len; /* buffer_id */ - TCHECK2(*cp, 4); - printf("\n\t buffer_id 0x%08x", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t buffer_id 0x%08x", EXTRACT_32BITS(cp))); cp += 4; /* in_port */ - TCHECK2(*cp, 2); - printf(", in_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", in_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* actions_len */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); actions_len = EXTRACT_16BITS(cp); cp += 2; if (actions_len > len - OF_PACKET_OUT_LEN) goto corrupt; /* actions */ - if (ep == (cp = of10_actions_print("\n\t ", cp, ep, actions_len))) + if (ep == (cp = of10_actions_print(ndo, "\n\t ", cp, ep, actions_len))) return ep; /* end of snapshot */ /* data */ - return of10_packet_data_print(cp, ep, len - OF_PACKET_OUT_LEN - actions_len); + return of10_packet_data_print(ndo, cp, ep, len - OF_PACKET_OUT_LEN - actions_len); corrupt: /* skip the rest of the message body */ - printf("%s", cstr); - TCHECK2(*cp0, len0); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp0, len0); return cp0 + len0; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* [OF10] Section 5.4.1 */ static const u_char * -of10_packet_in_print(const u_char *cp, const u_char *ep, const u_int len) { +of10_packet_in_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const u_int len) { /* buffer_id */ - TCHECK2(*cp, 4); - printf("\n\t buffer_id %s", tok2str(bufferid_str, "0x%08x", EXTRACT_32BITS(cp))); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, "\n\t buffer_id %s", tok2str(bufferid_str, "0x%08x", EXTRACT_32BITS(cp)))); cp += 4; /* total_len */ - TCHECK2(*cp, 2); - printf(", total_len %u", EXTRACT_16BITS(cp)); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", total_len %u", EXTRACT_16BITS(cp))); cp += 2; /* in_port */ - TCHECK2(*cp, 2); - printf(", in_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", in_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* reason */ - TCHECK2(*cp, 1); - printf(", reason %s", tok2str(ofpr_str, "invalid (0x%02x)", *cp)); + ND_TCHECK2(*cp, 1); + ND_PRINT((ndo, ", reason %s", tok2str(ofpr_str, "invalid (0x%02x)", *cp))); cp += 1; /* pad */ - TCHECK2(*cp, 1); + ND_TCHECK2(*cp, 1); cp += 1; /* data */ /* 2 mock octets count in OF_PACKET_IN_LEN but not in len */ - return of10_packet_data_print(cp, ep, len - (OF_PACKET_IN_LEN - 2)); + return of10_packet_data_print(ndo, cp, ep, len - (OF_PACKET_IN_LEN - 2)); trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* [OF10] Section 5.4.2 */ static const u_char * -of10_flow_removed_print(const u_char *cp, const u_char *ep) { +of10_flow_removed_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep) { /* match */ - if (ep == (cp = of10_match_print("\n\t ", cp, ep))) + if (ep == (cp = of10_match_print(ndo, "\n\t ", cp, ep))) return ep; /* end of snapshot */ /* cookie */ - TCHECK2(*cp, 8); - printf("\n\t cookie 0x%016" PRIx64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, "\n\t cookie 0x%016" PRIx64, EXTRACT_64BITS(cp))); cp += 8; /* priority */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); if (EXTRACT_16BITS(cp)) - printf(", priority %u", EXTRACT_16BITS(cp)); + ND_PRINT((ndo, ", priority %u", EXTRACT_16BITS(cp))); cp += 2; /* reason */ - TCHECK2(*cp, 1); - printf(", reason %s", tok2str(ofprr_str, "unknown (0x%02x)", *cp)); + ND_TCHECK2(*cp, 1); + ND_PRINT((ndo, ", reason %s", tok2str(ofprr_str, "unknown (0x%02x)", *cp))); cp += 1; /* pad */ - TCHECK2(*cp, 1); + ND_TCHECK2(*cp, 1); cp += 1; /* duration_sec */ - TCHECK2(*cp, 4); - printf(", duration_sec %u", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, ", duration_sec %u", EXTRACT_32BITS(cp))); cp += 4; /* duration_nsec */ - TCHECK2(*cp, 4); - printf(", duration_nsec %u", EXTRACT_32BITS(cp)); + ND_TCHECK2(*cp, 4); + ND_PRINT((ndo, ", duration_nsec %u", EXTRACT_32BITS(cp))); cp += 4; /* idle_timeout */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); if (EXTRACT_16BITS(cp)) - printf(", idle_timeout %u", EXTRACT_16BITS(cp)); + ND_PRINT((ndo, ", idle_timeout %u", EXTRACT_16BITS(cp))); cp += 2; /* pad2 */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); cp += 2; /* packet_count */ - TCHECK2(*cp, 8); - printf(", packet_count %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", packet_count %" PRIu64, EXTRACT_64BITS(cp))); cp += 8; /* byte_count */ - TCHECK2(*cp, 8); - printf(", byte_count %" PRIu64, EXTRACT_64BITS(cp)); + ND_TCHECK2(*cp, 8); + ND_PRINT((ndo, ", byte_count %" PRIu64, EXTRACT_64BITS(cp))); return cp + 8; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* [OF10] Section 5.4.4 */ static const u_char * -of10_error_print(const u_char *cp, const u_char *ep, const u_int len) { +of10_error_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const u_int len) { uint16_t type; const struct tok *code_str; /* type */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); type = EXTRACT_16BITS(cp); cp += 2; - printf("\n\t type %s", tok2str(ofpet_str, "invalid (0x%04x)", type)); + ND_PRINT((ndo, "\n\t type %s", tok2str(ofpet_str, "invalid (0x%04x)", type))); /* code */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); code_str = type == OFPET_HELLO_FAILED ? ofphfc_str : type == OFPET_BAD_REQUEST ? ofpbrc_str : @@ -1859,18 +1884,19 @@ of10_error_print(const u_char *cp, const u_char *ep, const u_int len) { type == OFPET_PORT_MOD_FAILED ? ofppmfc_str : type == OFPET_QUEUE_OP_FAILED ? ofpqofc_str : empty_str; - printf(", code %s", tok2str(code_str, "invalid (0x%04x)", EXTRACT_16BITS(cp))); + ND_PRINT((ndo, ", code %s", tok2str(code_str, "invalid (0x%04x)", EXTRACT_16BITS(cp)))); cp += 2; /* data */ - return of10_data_print(cp, ep, len - OF_ERROR_MSG_LEN); + return of10_data_print(ndo, cp, ep, len - OF_ERROR_MSG_LEN); trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } const u_char * -of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, +of10_header_body_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep, const uint8_t type, const uint16_t len, const uint32_t xid) { const u_char *cp0 = cp; const u_int len0 = len; @@ -1882,8 +1908,8 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, * corrupt, proceed to the next message. */ /* [OF10] Section 5.1 */ - printf("\n\tversion 1.0, type %s, length %u, xid 0x%08x", - tok2str(ofpt_str, "invalid (0x%02x)", type), len, xid); + ND_PRINT((ndo, "\n\tversion 1.0, type %s, length %u, xid 0x%08x", + tok2str(ofpt_str, "invalid (0x%02x)", type), len, xid)); switch (type) { /* OpenFlow header only. */ case OFPT_FEATURES_REQUEST: /* [OF10] Section 5.3.1 */ @@ -1899,92 +1925,92 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, case OFPT_GET_CONFIG_REPLY: /* ibid */ if (len != OF_SWITCH_CONFIG_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; /* flags */ - TCHECK2(*cp, 2); - printf("\n\t flags %s", tok2str(ofp_config_str, "invalid (0x%04x)", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, "\n\t flags %s", tok2str(ofp_config_str, "invalid (0x%04x)", EXTRACT_16BITS(cp)))); cp += 2; /* miss_send_len */ - TCHECK2(*cp, 2); - printf(", miss_send_len %u", EXTRACT_16BITS(cp)); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, ", miss_send_len %u", EXTRACT_16BITS(cp))); return cp + 2; case OFPT_PORT_MOD: if (len != OF_PORT_MOD_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; - return of10_port_mod_print(cp, ep); + return of10_port_mod_print(ndo, cp, ep); case OFPT_QUEUE_GET_CONFIG_REQUEST: /* [OF10] Section 5.3.4 */ if (len != OF_QUEUE_GET_CONFIG_REQUEST_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; /* port */ - TCHECK2(*cp, 2); - printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* pad */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); return cp + 2; case OFPT_FLOW_REMOVED: if (len != OF_FLOW_REMOVED_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; - return of10_flow_removed_print(cp, ep); + return of10_flow_removed_print(ndo, cp, ep); case OFPT_PORT_STATUS: /* [OF10] Section 5.4.3 */ if (len != OF_PORT_STATUS_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; /* reason */ - TCHECK2(*cp, 1); - printf("\n\t reason %s", tok2str(ofppr_str, "invalid (0x%02x)", *cp)); + ND_TCHECK2(*cp, 1); + ND_PRINT((ndo, "\n\t reason %s", tok2str(ofppr_str, "invalid (0x%02x)", *cp))); cp += 1; /* pad */ - TCHECK2(*cp, 7); + ND_TCHECK2(*cp, 7); cp += 7; /* desc */ - return of10_phy_ports_print(cp, ep, OF_PHY_PORT_LEN); + return of10_phy_ports_print(ndo, cp, ep, OF_PHY_PORT_LEN); /* OpenFlow header, fixed-size message body and n * fixed-size data units. */ case OFPT_FEATURES_REPLY: if (len < OF_SWITCH_FEATURES_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; - return of10_features_reply_print(cp, ep, len); + return of10_features_reply_print(ndo, cp, ep, len); /* OpenFlow header and variable-size data. */ case OFPT_HELLO: /* [OF10] Section 5.5.1 */ case OFPT_ECHO_REQUEST: /* [OF10] Section 5.5.2 */ case OFPT_ECHO_REPLY: /* [OF10] Section 5.5.3 */ - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; - return of10_data_print(cp, ep, len - OF_HEADER_LEN); + return of10_data_print(ndo, cp, ep, len - OF_HEADER_LEN); /* OpenFlow header, fixed-size message body and variable-size data. */ case OFPT_ERROR: if (len < OF_ERROR_MSG_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; - return of10_error_print(cp, ep, len); + return of10_error_print(ndo, cp, ep, len); case OFPT_VENDOR: /* [OF10] Section 5.5.4 */ if (len < OF_VENDOR_HEADER_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; - return of10_vendor_data_print(cp, ep, len - OF_HEADER_LEN); + return of10_vendor_data_print(ndo, cp, ep, len - OF_HEADER_LEN); case OFPT_PACKET_IN: /* 2 mock octets count in OF_PACKET_IN_LEN but not in len */ if (len < OF_PACKET_IN_LEN - 2) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; - return of10_packet_in_print(cp, ep, len); + return of10_packet_in_print(ndo, cp, ep, len); /* a. OpenFlow header. */ /* b. OpenFlow header and one of the fixed-size message bodies. */ @@ -1992,9 +2018,9 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, case OFPT_STATS_REQUEST: if (len < OF_STATS_REQUEST_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; - return of10_stats_request_print(cp, ep, len); + return of10_stats_request_print(ndo, cp, ep, len); /* a. OpenFlow header and fixed-size message body. */ /* b. OpenFlow header and n * fixed-size data units. */ @@ -2003,50 +2029,50 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, case OFPT_STATS_REPLY: if (len < OF_STATS_REPLY_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; - return of10_stats_reply_print(cp, ep, len); + return of10_stats_reply_print(ndo, cp, ep, len); /* OpenFlow header and n * variable-size data units and variable-size data. */ case OFPT_PACKET_OUT: if (len < OF_PACKET_OUT_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; - return of10_packet_out_print(cp, ep, len); + return of10_packet_out_print(ndo, cp, ep, len); /* OpenFlow header, fixed-size message body and n * variable-size data units. */ case OFPT_FLOW_MOD: if (len < OF_FLOW_MOD_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; - return of10_flow_mod_print(cp, ep, len); + return of10_flow_mod_print(ndo, cp, ep, len); /* OpenFlow header, fixed-size message body and n * variable-size data units. */ case OFPT_QUEUE_GET_CONFIG_REPLY: /* [OF10] Section 5.3.4 */ if (len < OF_QUEUE_GET_CONFIG_REPLY_LEN) goto corrupt; - if (vflag < 1) + if (ndo->ndo_vflag < 1) goto next_message; /* port */ - TCHECK2(*cp, 2); - printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); + ND_TCHECK2(*cp, 2); + ND_PRINT((ndo, "\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp)))); cp += 2; /* pad */ - TCHECK2(*cp, 6); + ND_TCHECK2(*cp, 6); cp += 6; /* queues */ - return of10_queues_print(cp, ep, len - OF_QUEUE_GET_CONFIG_REPLY_LEN); + return of10_queues_print(ndo, cp, ep, len - OF_QUEUE_GET_CONFIG_REPLY_LEN); } /* switch (type) */ goto next_message; corrupt: /* skip the message body */ - printf("%s", cstr); + ND_PRINT((ndo, "%s", cstr)); next_message: - TCHECK2(*cp0, len0 - OF_HEADER_LEN); + ND_TCHECK2(*cp0, len0 - OF_HEADER_LEN); return cp0 + len0 - OF_HEADER_LEN; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } diff --git a/print-openflow.c b/print-openflow.c index d37f7ba3..9a675855 100644 --- a/print-openflow.c +++ b/print-openflow.c @@ -30,6 +30,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -46,15 +47,15 @@ static const char cstr[] = " (corrupt)"; #define OF_VER_1_0 0x01 static void -of_header_print(const uint8_t version, const uint8_t type, +of_header_print(netdissect_options *ndo, const uint8_t version, const uint8_t type, const uint16_t length, const uint32_t xid) { - printf("\n\tversion unknown (0x%02x), type 0x%02x, length %u, xid 0x%08x", - version, type, length, xid); + ND_PRINT((ndo, "\n\tversion unknown (0x%02x), type 0x%02x, length %u, xid 0x%08x", + version, type, length, xid)); } /* Print a single OpenFlow message. */ static const u_char * -of_header_body_print(const u_char *cp, const u_char *ep) { +of_header_body_print(netdissect_options *ndo, const u_char *cp, const u_char *ep) { uint8_t version, type; uint16_t length; uint32_t xid; @@ -62,19 +63,19 @@ of_header_body_print(const u_char *cp, const u_char *ep) { if (ep < cp + OF_HEADER_LEN) goto corrupt; /* version */ - TCHECK2(*cp, 1); + ND_TCHECK2(*cp, 1); version = *cp; cp += 1; /* type */ - TCHECK2(*cp, 1); + ND_TCHECK2(*cp, 1); type = *cp; cp += 1; /* length */ - TCHECK2(*cp, 2); + ND_TCHECK2(*cp, 2); length = EXTRACT_16BITS(cp); cp += 2; /* xid */ - TCHECK2(*cp, 4); + ND_TCHECK2(*cp, 4); xid = EXTRACT_32BITS(cp); cp += 4; /* Message length includes the header length and a message always includes @@ -83,36 +84,36 @@ of_header_body_print(const u_char *cp, const u_char *ep) { * message as possible even when it does not end within the current TCP * segment. */ if (length < OF_HEADER_LEN) { - of_header_print(version, type, length, xid); + of_header_print(ndo, version, type, length, xid); goto corrupt; } /* Decode known protocol versions further without printing the header (the * type decoding is version-specific. */ switch (version) { case OF_VER_1_0: - return of10_header_body_print(cp, ep, type, length, xid); + return of10_header_body_print(ndo, cp, ep, type, length, xid); default: - of_header_print(version, type, length, xid); - TCHECK2(*cp, length - OF_HEADER_LEN); + of_header_print(ndo, version, type, length, xid); + ND_TCHECK2(*cp, length - OF_HEADER_LEN); return cp + length - OF_HEADER_LEN; /* done with current message */ } corrupt: /* fail current packet */ - printf("%s", cstr); - TCHECK2(*cp, ep - cp); + ND_PRINT((ndo, "%s", cstr)); + ND_TCHECK2(*cp, ep - cp); return ep; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return ep; } /* Print a TCP segment worth of OpenFlow messages presuming the segment begins * on a message boundary. */ void -openflow_print(const u_char *cp, const u_int len) { +openflow_print(netdissect_options *ndo, const u_char *cp, const u_int len) { const u_char *ep = cp + len; - printf(": OpenFlow"); + ND_PRINT((ndo, ": OpenFlow")); while (cp < ep) - cp = of_header_body_print(cp, ep); + cp = of_header_body_print(ndo, cp, ep); } diff --git a/print-slow.c b/print-slow.c index 7462ab81..aa26d3e9 100644 --- a/print-slow.c +++ b/print-slow.c @@ -18,16 +18,13 @@ * Original code by Hannes Gredler (hannes@juniper.net) */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <tcpdump-stdinc.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - #include "interface.h" #include "extract.h" #include "addrtoname.h" @@ -245,18 +242,19 @@ struct lacp_marker_tlv_terminator_t { u_int8_t pad[50]; }; -void slow_marker_lacp_print(register const u_char *, register u_int); -void slow_oam_print(register const u_char *, register u_int); +static void slow_marker_lacp_print(netdissect_options *, register const u_char *, register u_int); +static void slow_oam_print(netdissect_options *, register const u_char *, register u_int); const struct slow_common_header_t *slow_com_header; void -slow_print(register const u_char *pptr, register u_int len) { +slow_print(netdissect_options *ndo, + register const u_char *pptr, register u_int len) { int print_version; slow_com_header = (const struct slow_common_header_t *)pptr; - TCHECK(*slow_com_header); + ND_TCHECK(*slow_com_header); /* * Sanity checking of the header. @@ -264,7 +262,7 @@ slow_print(register const u_char *pptr, register u_int len) { switch (slow_com_header->proto_subtype) { case SLOW_PROTO_LACP: if (slow_com_header->version != LACP_VERSION) { - printf("LACP version %u packet not supported",slow_com_header->version); + ND_PRINT((ndo, "LACP version %u packet not supported",slow_com_header->version)); return; } print_version = 1; @@ -272,7 +270,7 @@ slow_print(register const u_char *pptr, register u_int len) { case SLOW_PROTO_MARKER: if (slow_com_header->version != MARKER_VERSION) { - printf("MARKER version %u packet not supported",slow_com_header->version); + ND_PRINT((ndo, "MARKER version %u packet not supported",slow_com_header->version)); return; } print_version = 1; @@ -289,24 +287,24 @@ slow_print(register const u_char *pptr, register u_int len) { } if (print_version) { - printf("%sv%u, length %u", + ND_PRINT((ndo, "%sv%u, length %u", tok2str(slow_proto_values, "unknown (%u)",slow_com_header->proto_subtype), slow_com_header->version, - len); + len)); } else { /* some slow protos don't have a version number in the header */ - printf("%s, length %u", + ND_PRINT((ndo, "%s, length %u", tok2str(slow_proto_values, "unknown (%u)",slow_com_header->proto_subtype), - len); + len)); } /* unrecognized subtype */ if (print_version == -1) { - print_unknown_data(gndo,pptr, "\n\t", len); + print_unknown_data(ndo, pptr, "\n\t", len); return; } - if (!vflag) + if (!ndo->ndo_vflag) return; switch (slow_com_header->proto_subtype) { @@ -315,7 +313,7 @@ slow_print(register const u_char *pptr, register u_int len) { case SLOW_PROTO_OAM: /* skip proto_subtype */ - slow_oam_print(pptr+1, len-1); + slow_oam_print(ndo, pptr+1, len-1); break; case SLOW_PROTO_LACP: /* LACP and MARKER share the same semantics */ @@ -323,16 +321,18 @@ slow_print(register const u_char *pptr, register u_int len) { /* skip slow_common_header */ len -= sizeof(const struct slow_common_header_t); pptr += sizeof(const struct slow_common_header_t); - slow_marker_lacp_print(pptr, len); + slow_marker_lacp_print(ndo, pptr, len); break; } return; trunc: - printf("\n\t\t packet exceeded snapshot"); + ND_PRINT((ndo, "\n\t\t packet exceeded snapshot")); } -void slow_marker_lacp_print(register const u_char *tptr, register u_int tlen) { +static void +slow_marker_lacp_print(netdissect_options *ndo, + register const u_char *tptr, register u_int tlen) { const struct tlv_header_t *tlv_header; const u_char *tlv_tptr; @@ -347,23 +347,23 @@ void slow_marker_lacp_print(register const u_char *tptr, register u_int tlen) { while(tlen>0) { /* did we capture enough for fully decoding the tlv header ? */ - TCHECK2(*tptr, sizeof(struct tlv_header_t)); + ND_TCHECK2(*tptr, sizeof(struct tlv_header_t)); tlv_header = (const struct tlv_header_t *)tptr; tlv_len = tlv_header->length; - printf("\n\t%s TLV (0x%02x), length %u", + ND_PRINT((ndo, "\n\t%s TLV (0x%02x), length %u", tok2str(slow_tlv_values, "Unknown", (slow_com_header->proto_subtype << 8) + tlv_header->type), tlv_header->type, - tlv_len); + tlv_len)); if ((tlv_len < sizeof(struct tlv_header_t) || tlv_len > tlen) && tlv_header->type != LACP_TLV_TERMINATOR && tlv_header->type != MARKER_TLV_TERMINATOR) { - printf("\n\t-----trailing data-----"); - print_unknown_data(gndo,tptr+sizeof(struct tlv_header_t),"\n\t ",tlen); + ND_PRINT((ndo, "\n\t-----trailing data-----")); + print_unknown_data(ndo, tptr+sizeof(struct tlv_header_t), "\n\t ", tlen); return; } @@ -371,7 +371,7 @@ void slow_marker_lacp_print(register const u_char *tptr, register u_int tlen) { tlv_tlen=tlv_len-sizeof(struct tlv_header_t); /* did we capture enough for fully decoding the tlv ? */ - TCHECK2(*tptr, tlv_len); + ND_TCHECK2(*tptr, tlv_len); switch((slow_com_header->proto_subtype << 8) + tlv_header->type) { @@ -380,7 +380,7 @@ void slow_marker_lacp_print(register const u_char *tptr, register u_int tlen) { case ((SLOW_PROTO_LACP << 8) + LACP_TLV_PARTNER_INFO): tlv_ptr.lacp_tlv_actor_partner_info = (const struct lacp_tlv_actor_partner_info_t *)tlv_tptr; - printf("\n\t System %s, System Priority %u, Key %u" \ + ND_PRINT((ndo, "\n\t System %s, System Priority %u, Key %u" \ ", Port %u, Port Priority %u\n\t State Flags [%s]", etheraddr_string(tlv_ptr.lacp_tlv_actor_partner_info->sys), EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->sys_pri), @@ -389,25 +389,25 @@ void slow_marker_lacp_print(register const u_char *tptr, register u_int tlen) { EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->port_pri), bittok2str(lacp_tlv_actor_partner_info_state_values, "none", - tlv_ptr.lacp_tlv_actor_partner_info->state)); + tlv_ptr.lacp_tlv_actor_partner_info->state))); break; case ((SLOW_PROTO_LACP << 8) + LACP_TLV_COLLECTOR_INFO): tlv_ptr.lacp_tlv_collector_info = (const struct lacp_tlv_collector_info_t *)tlv_tptr; - printf("\n\t Max Delay %u", - EXTRACT_16BITS(tlv_ptr.lacp_tlv_collector_info->max_delay)); + ND_PRINT((ndo, "\n\t Max Delay %u", + EXTRACT_16BITS(tlv_ptr.lacp_tlv_collector_info->max_delay))); break; case ((SLOW_PROTO_MARKER << 8) + MARKER_TLV_MARKER_INFO): tlv_ptr.marker_tlv_marker_info = (const struct marker_tlv_marker_info_t *)tlv_tptr; - printf("\n\t Request System %s, Request Port %u, Request Transaction ID 0x%08x", + ND_PRINT((ndo, "\n\t Request System %s, Request Port %u, Request Transaction ID 0x%08x", etheraddr_string(tlv_ptr.marker_tlv_marker_info->req_sys), EXTRACT_16BITS(tlv_ptr.marker_tlv_marker_info->req_port), - EXTRACT_32BITS(tlv_ptr.marker_tlv_marker_info->req_trans_id)); + EXTRACT_32BITS(tlv_ptr.marker_tlv_marker_info->req_trans_id))); break; @@ -419,24 +419,24 @@ void slow_marker_lacp_print(register const u_char *tptr, register u_int tlen) { tlv_len = sizeof(tlv_ptr.lacp_marker_tlv_terminator->pad) + sizeof(struct tlv_header_t); /* tell the user that we modified the length field */ - if (vflag>1) - printf(" (=%u)",tlv_len); + if (ndo->ndo_vflag>1) + ND_PRINT((ndo, " (=%u)", tlv_len)); /* we have messed around with the length field - now we need to check * again if there are enough bytes on the wire for the hexdump */ - TCHECK2(tlv_ptr.lacp_marker_tlv_terminator->pad[0], + ND_TCHECK2(tlv_ptr.lacp_marker_tlv_terminator->pad[0], sizeof(tlv_ptr.lacp_marker_tlv_terminator->pad)); } break; default: - if (vflag <= 1) - print_unknown_data(gndo,tlv_tptr,"\n\t ",tlv_tlen); + if (ndo->ndo_vflag <= 1) + print_unknown_data(ndo, tlv_tptr, "\n\t ", tlv_tlen); break; } /* do we want to see an additional hexdump ? */ - if (vflag > 1) { - print_unknown_data(gndo,tptr+sizeof(struct tlv_header_t),"\n\t ", + if (ndo->ndo_vflag > 1) { + print_unknown_data(ndo, tptr+sizeof(struct tlv_header_t), "\n\t ", tlv_len-sizeof(struct tlv_header_t)); } @@ -445,10 +445,12 @@ void slow_marker_lacp_print(register const u_char *tptr, register u_int tlen) { } return; trunc: - printf("\n\t\t packet exceeded snapshot"); + ND_PRINT((ndo, "\n\t\t packet exceeded snapshot")); } -void slow_oam_print(register const u_char *tptr, register u_int tlen) { +static void +slow_oam_print(netdissect_options *ndo, + register const u_char *tptr, register u_int tlen) { u_int hexdump; @@ -479,27 +481,27 @@ void slow_oam_print(register const u_char *tptr, register u_int tlen) { tptr += sizeof(struct slow_oam_common_header_t); tlen -= sizeof(struct slow_oam_common_header_t); - printf("\n\tCode %s OAM PDU, Flags [%s]", + ND_PRINT((ndo, "\n\tCode %s OAM PDU, Flags [%s]", tok2str(slow_oam_code_values, "Unknown (%u)", ptr.slow_oam_common_header->code), bittok2str(slow_oam_flag_values, "none", - EXTRACT_16BITS(&ptr.slow_oam_common_header->flags))); + EXTRACT_16BITS(&ptr.slow_oam_common_header->flags)))); switch (ptr.slow_oam_common_header->code) { case SLOW_OAM_CODE_INFO: while (tlen > 0) { ptr.slow_oam_tlv_header = (const struct slow_oam_tlv_header_t *)tptr; - printf("\n\t %s Information Type (%u), length %u", + ND_PRINT((ndo, "\n\t %s Information Type (%u), length %u", tok2str(slow_oam_info_type_values, "Reserved", ptr.slow_oam_tlv_header->type), ptr.slow_oam_tlv_header->type, - ptr.slow_oam_tlv_header->length); + ptr.slow_oam_tlv_header->length)); hexdump = FALSE; switch (ptr.slow_oam_tlv_header->type) { case SLOW_OAM_INFO_TYPE_END_OF_TLV: if (ptr.slow_oam_tlv_header->length != 0) { - printf("\n\t ERROR: illegal length - should be 0"); + ND_PRINT((ndo, "\n\t ERROR: illegal length - should be 0")); } return; @@ -509,30 +511,30 @@ void slow_oam_print(register const u_char *tptr, register u_int tlen) { if (tlv.slow_oam_info->info_length != sizeof(struct slow_oam_info_t)) { - printf("\n\t ERROR: illegal length - should be %lu", - (unsigned long) sizeof(struct slow_oam_info_t)); + ND_PRINT((ndo, "\n\t ERROR: illegal length - should be %lu", + (unsigned long) sizeof(struct slow_oam_info_t))); return; } - printf("\n\t OAM-Version %u, Revision %u", + ND_PRINT((ndo, "\n\t OAM-Version %u, Revision %u", tlv.slow_oam_info->oam_version, - EXTRACT_16BITS(&tlv.slow_oam_info->revision)); + EXTRACT_16BITS(&tlv.slow_oam_info->revision))); - printf("\n\t State-Parser-Action %s, State-MUX-Action %s", + ND_PRINT((ndo, "\n\t State-Parser-Action %s, State-MUX-Action %s", tok2str(slow_oam_info_type_state_parser_values, "Reserved", tlv.slow_oam_info->state & OAM_INFO_TYPE_PARSER_MASK), tok2str(slow_oam_info_type_state_mux_values, "Reserved", - tlv.slow_oam_info->state & OAM_INFO_TYPE_MUX_MASK)); - printf("\n\t OAM-Config Flags [%s], OAM-PDU-Config max-PDU size %u", + tlv.slow_oam_info->state & OAM_INFO_TYPE_MUX_MASK))); + ND_PRINT((ndo, "\n\t OAM-Config Flags [%s], OAM-PDU-Config max-PDU size %u", bittok2str(slow_oam_info_type_oam_config_values, "none", tlv.slow_oam_info->oam_config), EXTRACT_16BITS(&tlv.slow_oam_info->oam_pdu_config) & - OAM_INFO_TYPE_PDU_SIZE_MASK); - printf("\n\t OUI %s (0x%06x), Vendor-Private 0x%08x", + OAM_INFO_TYPE_PDU_SIZE_MASK)); + ND_PRINT((ndo, "\n\t OUI %s (0x%06x), Vendor-Private 0x%08x", tok2str(oui_values, "Unknown", EXTRACT_24BITS(&tlv.slow_oam_info->oui)), EXTRACT_24BITS(&tlv.slow_oam_info->oui), - EXTRACT_32BITS(&tlv.slow_oam_info->vendor_private)); + EXTRACT_32BITS(&tlv.slow_oam_info->vendor_private))); break; case SLOW_OAM_INFO_TYPE_ORG_SPECIFIC: @@ -550,8 +552,8 @@ void slow_oam_print(register const u_char *tptr, register u_int tlen) { } /* do we also want to see a hex dump ? */ - if (vflag > 1 || hexdump==TRUE) { - print_unknown_data(gndo,tptr,"\n\t ", + if (ndo->ndo_vflag > 1 || hexdump==TRUE) { + print_unknown_data(ndo, tptr, "\n\t ", ptr.slow_oam_tlv_header->length); } @@ -563,17 +565,17 @@ void slow_oam_print(register const u_char *tptr, register u_int tlen) { case SLOW_OAM_CODE_EVENT_NOTIF: while (tlen > 0) { ptr.slow_oam_tlv_header = (const struct slow_oam_tlv_header_t *)tptr; - printf("\n\t %s Link Event Type (%u), length %u", + ND_PRINT((ndo, "\n\t %s Link Event Type (%u), length %u", tok2str(slow_oam_link_event_values, "Reserved", ptr.slow_oam_tlv_header->type), ptr.slow_oam_tlv_header->type, - ptr.slow_oam_tlv_header->length); + ptr.slow_oam_tlv_header->length)); hexdump = FALSE; switch (ptr.slow_oam_tlv_header->type) { case SLOW_OAM_LINK_EVENT_END_OF_TLV: if (ptr.slow_oam_tlv_header->length != 0) { - printf("\n\t ERROR: illegal length - should be 0"); + ND_PRINT((ndo, "\n\t ERROR: illegal length - should be 0")); } return; @@ -585,12 +587,12 @@ void slow_oam_print(register const u_char *tptr, register u_int tlen) { if (tlv.slow_oam_link_event->event_length != sizeof(struct slow_oam_link_event_t)) { - printf("\n\t ERROR: illegal length - should be %lu", - (unsigned long) sizeof(struct slow_oam_link_event_t)); + ND_PRINT((ndo, "\n\t ERROR: illegal length - should be %lu", + (unsigned long) sizeof(struct slow_oam_link_event_t))); return; } - printf("\n\t Timestamp %u ms, Errored Window %" PRIu64 + ND_PRINT((ndo, "\n\t Timestamp %u ms, Errored Window %" PRIu64 "\n\t Errored Threshold %" PRIu64 "\n\t Errors %" PRIu64 "\n\t Error Running Total %" PRIu64 @@ -600,7 +602,7 @@ void slow_oam_print(register const u_char *tptr, register u_int tlen) { EXTRACT_64BITS(&tlv.slow_oam_link_event->threshold), EXTRACT_64BITS(&tlv.slow_oam_link_event->errors), EXTRACT_64BITS(&tlv.slow_oam_link_event->errors_running_total), - EXTRACT_32BITS(&tlv.slow_oam_link_event->event_running_total)); + EXTRACT_32BITS(&tlv.slow_oam_link_event->event_running_total))); break; case SLOW_OAM_LINK_EVENT_ORG_SPECIFIC: @@ -618,8 +620,8 @@ void slow_oam_print(register const u_char *tptr, register u_int tlen) { } /* do we also want to see a hex dump ? */ - if (vflag > 1 || hexdump==TRUE) { - print_unknown_data(gndo,tptr,"\n\t ", + if (ndo->ndo_vflag > 1 || hexdump==TRUE) { + print_unknown_data(ndo, tptr, "\n\t ", ptr.slow_oam_tlv_header->length); } @@ -630,11 +632,11 @@ void slow_oam_print(register const u_char *tptr, register u_int tlen) { case SLOW_OAM_CODE_LOOPBACK_CTRL: tlv.slow_oam_loopbackctrl = (const struct slow_oam_loopbackctrl_t *)tptr; - printf("\n\t Command %s (%u)", + ND_PRINT((ndo, "\n\t Command %s (%u)", tok2str(slow_oam_loopbackctrl_cmd_values, "Unknown", tlv.slow_oam_loopbackctrl->command), - tlv.slow_oam_loopbackctrl->command); + tlv.slow_oam_loopbackctrl->command)); tptr ++; tlen --; break; @@ -647,8 +649,8 @@ void slow_oam_print(register const u_char *tptr, register u_int tlen) { case SLOW_OAM_CODE_VAR_RESPONSE: case SLOW_OAM_CODE_PRIVATE: default: - if (vflag <= 1) { - print_unknown_data(gndo,tptr,"\n\t ", tlen); + if (ndo->ndo_vflag <= 1) { + print_unknown_data(ndo, tptr, "\n\t ", tlen); } break; } diff --git a/print-tcp.c b/print-tcp.c index ef6bb517..34ea9ae3 100644 --- a/print-tcp.c +++ b/print-tcp.c @@ -671,7 +671,7 @@ tcp_print(register const u_char *bp, register u_int length, if (sport == TELNET_PORT || dport == TELNET_PORT) { if (!qflag && vflag) - telnet_print(bp, length); + telnet_print(gndo, bp, length); } else if (sport == BGP_PORT || dport == BGP_PORT) bgp_print(bp, length); else if (sport == PPTP_PORT || dport == PPTP_PORT) @@ -685,7 +685,7 @@ tcp_print(register const u_char *bp, register u_int length, else if (sport == BEEP_PORT || dport == BEEP_PORT) beep_print(gndo, bp, length); else if (sport == OPENFLOW_PORT || dport == OPENFLOW_PORT) - openflow_print(bp, length); + openflow_print(gndo, bp, length); else if (length > 2 && (sport == NAMESERVER_PORT || dport == NAMESERVER_PORT || sport == MULTICASTDNS_PORT || dport == MULTICASTDNS_PORT)) { diff --git a/print-telnet.c b/print-telnet.c index e8d0a3ee..6a2680b4 100644 --- a/print-telnet.c +++ b/print-telnet.c @@ -45,6 +45,7 @@ * are preserved in all copies. */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -52,8 +53,6 @@ #include <tcpdump-stdinc.h> #include <stdio.h> -#include <stdlib.h> -#include <string.h> #include "interface.h" @@ -385,7 +384,7 @@ numstr(int x) /* sp points to IAC byte */ static int -telnet_parse(const u_char *sp, u_int length, int print) +telnet_parse(netdissect_options *ndo, const u_char *sp, u_int length, int print) { int i, x; u_int c; @@ -394,7 +393,7 @@ telnet_parse(const u_char *sp, u_int length, int print) do { \ if (length < 1) \ goto pktend; \ - TCHECK(*sp); \ + ND_TCHECK(*sp); \ c = *sp++; \ length--; \ } while (0) @@ -407,7 +406,7 @@ telnet_parse(const u_char *sp, u_int length, int print) FETCH(c, sp, length); if (c == IAC) { /* <IAC><IAC>! */ if (print) - printf("IAC IAC"); + ND_PRINT((ndo, "IAC IAC")); goto done; } @@ -425,10 +424,10 @@ telnet_parse(const u_char *sp, u_int length, int print) FETCH(x, sp, length); if (x >= 0 && x < NTELOPTS) { if (print) - (void)printf("%s %s", telcmds[i], telopts[x]); + ND_PRINT((ndo, "%s %s", telcmds[i], telopts[x])); } else { if (print) - (void)printf("%s %#x", telcmds[i], x); + ND_PRINT((ndo, "%s %#x", telcmds[i], x)); } if (c != SB) break; @@ -448,46 +447,46 @@ telnet_parse(const u_char *sp, u_int length, int print) break; FETCH(c, sp, length); if (print) - (void)printf(" %s", STR_OR_ID(c, authcmd)); + ND_PRINT((ndo, " %s", STR_OR_ID(c, authcmd))); if (p <= sp) break; FETCH(c, sp, length); if (print) - (void)printf(" %s", STR_OR_ID(c, authtype)); + ND_PRINT((ndo, " %s", STR_OR_ID(c, authtype))); break; case TELOPT_ENCRYPT: if (p <= sp) break; FETCH(c, sp, length); if (print) - (void)printf(" %s", STR_OR_ID(c, enccmd)); + ND_PRINT((ndo, " %s", STR_OR_ID(c, enccmd))); if (p <= sp) break; FETCH(c, sp, length); if (print) - (void)printf(" %s", STR_OR_ID(c, enctype)); + ND_PRINT((ndo, " %s", STR_OR_ID(c, enctype))); break; default: if (p <= sp) break; FETCH(c, sp, length); if (print) - (void)printf(" %s", STR_OR_ID(c, cmds)); + ND_PRINT((ndo, " %s", STR_OR_ID(c, cmds))); break; } while (p > sp) { FETCH(x, sp, length); if (print) - (void)printf(" %#x", x); + ND_PRINT((ndo, " %#x", x)); } /* terminating IAC SE */ if (print) - (void)printf(" SE"); + ND_PRINT((ndo, " SE")); sp += 2; break; default: if (print) - (void)printf("%s", telcmds[i]); + ND_PRINT((ndo, "%s", telcmds[i])); goto done; } @@ -495,14 +494,14 @@ done: return sp - osp; trunc: - (void)printf("[|telnet]"); + ND_PRINT((ndo, "[|telnet]")); pktend: return -1; #undef FETCH } void -telnet_print(const u_char *sp, u_int length) +telnet_print(netdissect_options *ndo, const u_char *sp, u_int length) { int first = 1; const u_char *osp; @@ -511,34 +510,34 @@ telnet_print(const u_char *sp, u_int length) osp = sp; while (length > 0 && *sp == IAC) { - l = telnet_parse(sp, length, 0); + l = telnet_parse(ndo, sp, length, 0); if (l < 0) break; /* * now print it */ - if (Xflag && 2 < vflag) { + if (ndo->ndo_Xflag && 2 < ndo->ndo_vflag) { if (first) - printf("\nTelnet:"); - hex_print_with_offset(gndo,"\n", sp, l, sp - osp); + ND_PRINT((ndo, "\nTelnet:")); + hex_print_with_offset(ndo, "\n", sp, l, sp - osp); if (l > 8) - printf("\n\t\t\t\t"); + ND_PRINT((ndo, "\n\t\t\t\t")); else - printf("%*s\t", (8 - l) * 3, ""); + ND_PRINT((ndo, "%*s\t", (8 - l) * 3, "")); } else - printf("%s", (first) ? " [telnet " : ", "); + ND_PRINT((ndo, "%s", (first) ? " [telnet " : ", ")); - (void)telnet_parse(sp, length, 1); + (void)telnet_parse(ndo, sp, length, 1); first = 0; sp += l; length -= l; } if (!first) { - if (Xflag && 2 < vflag) - printf("\n"); + if (ndo->ndo_Xflag && 2 < ndo->ndo_vflag) + ND_PRINT((ndo, "\n")); else - printf("]"); + ND_PRINT((ndo, "]")); } } |