From cf90fd1a84054121c867a173cb7b7a0f5ae44d2f Mon Sep 17 00:00:00 2001 From: Denis Ovsienko Date: Tue, 11 Mar 2014 16:08:24 +0400 Subject: [PATCH] NDOize ARCNET, BFD and GRE decoders --- interface.h | 4 -- netdissect.h | 6 +- print-arcnet.c | 73 +++++++++++----------- print-bfd.c | 72 +++++++++++----------- print-gre.c | 160 ++++++++++++++++++++++++------------------------- print-ip.c | 2 +- print-ip6.c | 2 +- print-udp.c | 2 +- tcpdump.c | 8 +-- 9 files changed, 162 insertions(+), 167 deletions(-) diff --git a/interface.h b/interface.h index d8b41c93..bf29936d 100644 --- a/interface.h +++ b/interface.h @@ -197,8 +197,6 @@ extern void dvmrp_print(const u_char *, u_int); extern void egp_print(const u_char *, u_int); extern u_int enc_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int pflog_if_print(const struct pcap_pkthdr *, const u_char *); -extern u_int arcnet_if_print(const struct pcap_pkthdr *, const u_char *); -extern u_int arcnet_linux_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int token_print(const u_char *, u_int, u_int); extern u_int token_if_print(const struct pcap_pkthdr *, const u_char *); extern void fddi_print(const u_char *, u_int, u_int); @@ -213,7 +211,6 @@ extern u_int ieee802_11_radio_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int ieee802_11_radio_avs_if_print(const struct pcap_pkthdr *, const u_char *); -extern void gre_print(const u_char *, u_int); extern void icmp_print(const u_char *, u_int, const u_char *, int); extern void igmp_print(const u_char *, u_int); extern void ipN_print(const u_char *, u_int); @@ -315,7 +312,6 @@ extern void mpls_lsp_ping_print(const u_char *, u_int); extern void zephyr_print(const u_char *, int); extern void zmtp1_print(const u_char *, u_int); extern void zmtp1_print_datagram(const u_char *, const u_int); -extern void bfd_print(const u_char *, u_int, u_int); extern void sip_print(const u_char *, u_int); extern void syslog_print(const u_char *, u_int); extern int mptcp_print(const u_char *, u_int, u_char); diff --git a/netdissect.h b/netdissect.h index c0bca504..e04b6ebe 100644 --- a/netdissect.h +++ b/netdissect.h @@ -387,6 +387,10 @@ extern u_int lane_if_print(netdissect_options *, const struct pcap_pkthdr *, con extern void otv_print(netdissect_options *, const u_char *, u_int); extern void ahcp_print(netdissect_options *, const u_char *, const u_int); extern void vxlan_print(netdissect_options *, const u_char *, u_int); +extern u_int arcnet_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *); +extern u_int arcnet_linux_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *); +extern void bfd_print(netdissect_options *, const u_char *, u_int, u_int); +extern void gre_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 *); @@ -422,11 +426,9 @@ extern void dvmrp_print(netdissect_options *,const u_char *, u_int); extern void egp_print(netdissect_options *,const u_char *, u_int, const u_char *); -extern void arcnet_if_print(u_char*,const struct pcap_pkthdr *,const u_char *); extern void token_if_print(u_char *,const struct pcap_pkthdr *,const u_char *); extern void fddi_if_print(u_char *,const struct pcap_pkthdr *, const u_char *); -extern void gre_print(netdissect_options *,const u_char *, u_int); extern void icmp_print(netdissect_options *,const u_char *, u_int, const u_char *); extern void hsrp_print(netdissect_options *ndo, diff --git a/print-arcnet.c b/print-arcnet.c index f037aefa..4f32dce4 100644 --- a/print-arcnet.c +++ b/print-arcnet.c @@ -27,8 +27,6 @@ #include -#include - #include "interface.h" #include "extract.h" @@ -101,7 +99,7 @@ struct arc_linux_header { #define ARC_LINUX_HDRLEN 5 #define ARC_LINUX_HDRNEWLEN 8 -static int arcnet_encap_print(u_char arctype, const u_char *p, +static int arcnet_encap_print(netdissect_options *, u_char arctype, const u_char *p, u_int length, u_int caplen); static const struct tok arctypemap[] = { @@ -119,7 +117,8 @@ static const struct tok arctypemap[] = { }; static inline void -arcnet_print(const u_char *bp, u_int length, int phds, int flag, u_int seqid) +arcnet_print(netdissect_options *ndo, const u_char *bp, u_int length, int phds, + int flag, u_int seqid) { const struct arc_header *ap; const char *arctypename; @@ -128,40 +127,40 @@ arcnet_print(const u_char *bp, u_int length, int phds, int flag, u_int seqid) ap = (const struct arc_header *)bp; - if (qflag) { - (void)printf("%02x %02x %d: ", + if (ndo->ndo_qflag) { + ND_PRINT((ndo, "%02x %02x %d: ", ap->arc_shost, ap->arc_dhost, - length); + length)); return; } arctypename = tok2str(arctypemap, "%02x", ap->arc_type); if (!phds) { - (void)printf("%02x %02x %s %d: ", + ND_PRINT((ndo, "%02x %02x %s %d: ", ap->arc_shost, ap->arc_dhost, arctypename, - length); + length)); return; } if (flag == 0) { - (void)printf("%02x %02x %s seqid %04x %d: ", + ND_PRINT((ndo, "%02x %02x %s seqid %04x %d: ", ap->arc_shost, ap->arc_dhost, arctypename, seqid, - length); + length)); return; } if (flag & 1) - (void)printf("%02x %02x %s seqid %04x " + ND_PRINT((ndo, "%02x %02x %s seqid %04x " "(first of %d fragments) %d: ", ap->arc_shost, ap->arc_dhost, arctypename, seqid, - (flag + 3) / 2, length); + (flag + 3) / 2, length)); else - (void)printf("%02x %02x %s seqid %04x " + ND_PRINT((ndo, "%02x %02x %s seqid %04x " "(fragment %d) %d: ", ap->arc_shost, ap->arc_dhost, arctypename, seqid, - flag/2 + 1, length); + flag/2 + 1, length)); } /* @@ -171,7 +170,7 @@ arcnet_print(const u_char *bp, u_int length, int phds, int flag, u_int seqid) * is the number of bytes actually captured. */ u_int -arcnet_if_print(const struct pcap_pkthdr *h, const u_char *p) +arcnet_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p) { u_int caplen = h->caplen; u_int length = h->len; @@ -182,7 +181,7 @@ arcnet_if_print(const struct pcap_pkthdr *h, const u_char *p) u_char arc_type; if (caplen < ARC_HDRLEN) { - printf("[|arcnet]"); + ND_PRINT((ndo, "[|arcnet]")); return (caplen); } @@ -203,15 +202,15 @@ arcnet_if_print(const struct pcap_pkthdr *h, const u_char *p) if (phds) { if (caplen < ARC_HDRNEWLEN) { - arcnet_print(p, length, 0, 0, 0); - printf("[|phds]"); + arcnet_print(ndo, p, length, 0, 0, 0); + ND_PRINT((ndo, "[|phds]")); return (caplen); } if (ap->arc_flag == 0xff) { if (caplen < ARC_HDRNEWLEN_EXC) { - arcnet_print(p, length, 0, 0, 0); - printf("[|phds extended]"); + arcnet_print(ndo, p, length, 0, 0, 0); + ND_PRINT((ndo, "[|phds extended]")); return (caplen); } flag = ap->arc_flag2; @@ -225,8 +224,8 @@ arcnet_if_print(const struct pcap_pkthdr *h, const u_char *p) } - if (eflag) - arcnet_print(p, length, phds, flag, seqid); + if (ndo->ndo_eflag) + arcnet_print(ndo, p, length, phds, flag, seqid); /* * Go past the ARCNET header. @@ -242,8 +241,8 @@ arcnet_if_print(const struct pcap_pkthdr *h, const u_char *p) return (archdrlen); } - if (!arcnet_encap_print(arc_type, p, length, caplen)) - default_print(p, caplen); + if (!arcnet_encap_print(ndo, arc_type, p, length, caplen)) + ndo->ndo_default_print(ndo, p, caplen); return (archdrlen); } @@ -259,7 +258,7 @@ arcnet_if_print(const struct pcap_pkthdr *h, const u_char *p) * extra "offset" field between the src/dest and packet type. */ u_int -arcnet_linux_if_print(const struct pcap_pkthdr *h, const u_char *p) +arcnet_linux_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p) { u_int caplen = h->caplen; u_int length = h->len; @@ -269,7 +268,7 @@ arcnet_linux_if_print(const struct pcap_pkthdr *h, const u_char *p) u_char arc_type; if (caplen < ARC_LINUX_HDRLEN) { - printf("[|arcnet]"); + ND_PRINT((ndo, "[|arcnet]")); return (caplen); } @@ -280,7 +279,7 @@ arcnet_linux_if_print(const struct pcap_pkthdr *h, const u_char *p) default: archdrlen = ARC_LINUX_HDRNEWLEN; if (caplen < ARC_LINUX_HDRNEWLEN) { - printf("[|arcnet]"); + ND_PRINT((ndo, "[|arcnet]")); return (caplen); } break; @@ -291,8 +290,8 @@ arcnet_linux_if_print(const struct pcap_pkthdr *h, const u_char *p) break; } - if (eflag) - arcnet_print(p, length, 0, 0, 0); + if (ndo->ndo_eflag) + arcnet_print(ndo, p, length, 0, 0, 0); /* * Go past the ARCNET header. @@ -301,8 +300,8 @@ arcnet_linux_if_print(const struct pcap_pkthdr *h, const u_char *p) caplen -= archdrlen; p += archdrlen; - if (!arcnet_encap_print(arc_type, p, length, caplen)) - default_print(p, caplen); + if (!arcnet_encap_print(ndo, arc_type, p, length, caplen)) + ndo->ndo_default_print(ndo, p, caplen); return (archdrlen); } @@ -316,30 +315,30 @@ arcnet_linux_if_print(const struct pcap_pkthdr *h, const u_char *p) static int -arcnet_encap_print(u_char arctype, const u_char *p, +arcnet_encap_print(netdissect_options *ndo, u_char arctype, const u_char *p, u_int length, u_int caplen) { switch (arctype) { case ARCTYPE_IP_OLD: case ARCTYPE_IP: - ip_print(gndo, p, length); + ip_print(ndo, p, length); return (1); #ifdef INET6 case ARCTYPE_INET6: - ip6_print(gndo, p, length); + ip6_print(ndo, p, length); return (1); #endif /*INET6*/ case ARCTYPE_ARP_OLD: case ARCTYPE_ARP: case ARCTYPE_REVARP: - arp_print(gndo, p, length, caplen); + arp_print(ndo, p, length, caplen); return (1); case ARCTYPE_ATALK: /* XXX was this ever used? */ - if (vflag) + if (ndo->ndo_vflag) fputs("et1 ", stdout); atalk_print(p, length); return (1); diff --git a/print-bfd.c b/print-bfd.c index b409d315..bc410b4f 100644 --- a/print-bfd.c +++ b/print-bfd.c @@ -20,9 +20,8 @@ #include #include -#include -#include "interface.h" +#include "netdissect.h" #include "extract.h" #include "udp.h" @@ -161,7 +160,8 @@ static const struct tok bfd_v1_state_values[] = { }; void -bfd_print(register const u_char *pptr, register u_int len, register u_int port) +bfd_print(netdissect_options *ndo, register const u_char *pptr, + register u_int len, register u_int port) { const struct bfd_header_t *bfd_header; const struct bfd_auth_header_t *bfd_auth_header; @@ -169,7 +169,7 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port) bfd_header = (const struct bfd_header_t *)pptr; if (port == BFD_CONTROL_PORT) { - TCHECK(*bfd_header); + ND_TCHECK(*bfd_header); version = BFD_EXTRACT_VERSION(bfd_header->version_diag); } else if (port == BFD_ECHO_PORT) { /* Echo is BFD v1 only */ @@ -179,79 +179,79 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port) /* BFDv0 */ case (BFD_CONTROL_PORT << 8): - if (vflag < 1 ) + if (ndo->ndo_vflag < 1) { - printf("BFDv%u, %s, Flags: [%s], length: %u", + ND_PRINT((ndo, "BFDv%u, %s, Flags: [%s], length: %u", version, tok2str(bfd_port_values, "unknown (%u)", port), bittok2str(bfd_v0_flag_values, "none", bfd_header->flags), - len); + len)); return; } - printf("BFDv%u, length: %u\n\t%s, Flags: [%s], Diagnostic: %s (0x%02x)", + ND_PRINT((ndo, "BFDv%u, length: %u\n\t%s, Flags: [%s], Diagnostic: %s (0x%02x)", version, len, tok2str(bfd_port_values, "unknown (%u)", port), bittok2str(bfd_v0_flag_values, "none", bfd_header->flags), tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(bfd_header->version_diag)), - BFD_EXTRACT_DIAG(bfd_header->version_diag)); + BFD_EXTRACT_DIAG(bfd_header->version_diag))); - printf("\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u", + ND_PRINT((ndo, "\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u", bfd_header->detect_time_multiplier, bfd_header->detect_time_multiplier * EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000, - bfd_header->length); + bfd_header->length)); - printf("\n\tMy Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->my_discriminator)); - printf(", Your Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->your_discriminator)); - printf("\n\t Desired min Tx Interval: %4u ms", EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000); - printf("\n\t Required min Rx Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_rx_interval)/1000); - printf("\n\t Required min Echo Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_echo_interval)/1000); + ND_PRINT((ndo, "\n\tMy Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->my_discriminator))); + ND_PRINT((ndo, ", Your Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->your_discriminator))); + ND_PRINT((ndo, "\n\t Desired min Tx Interval: %4u ms", EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000)); + ND_PRINT((ndo, "\n\t Required min Rx Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_rx_interval)/1000)); + ND_PRINT((ndo, "\n\t Required min Echo Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_echo_interval)/1000)); break; /* BFDv1 */ case (BFD_CONTROL_PORT << 8 | 1): - if (vflag < 1 ) + if (ndo->ndo_vflag < 1) { - printf("BFDv%u, %s, State %s, Flags: [%s], length: %u", + ND_PRINT((ndo, "BFDv%u, %s, State %s, Flags: [%s], length: %u", version, tok2str(bfd_port_values, "unknown (%u)", port), tok2str(bfd_v1_state_values, "unknown (%u)", (bfd_header->flags & 0xc0) >> 6), bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f), - len); + len)); return; } - printf("BFDv%u, length: %u\n\t%s, State %s, Flags: [%s], Diagnostic: %s (0x%02x)", + ND_PRINT((ndo, "BFDv%u, length: %u\n\t%s, State %s, Flags: [%s], Diagnostic: %s (0x%02x)", version, len, tok2str(bfd_port_values, "unknown (%u)", port), tok2str(bfd_v1_state_values, "unknown (%u)", (bfd_header->flags & 0xc0) >> 6), bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f), tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(bfd_header->version_diag)), - BFD_EXTRACT_DIAG(bfd_header->version_diag)); + BFD_EXTRACT_DIAG(bfd_header->version_diag))); - printf("\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u", + ND_PRINT((ndo, "\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u", bfd_header->detect_time_multiplier, bfd_header->detect_time_multiplier * EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000, - bfd_header->length); + bfd_header->length)); - printf("\n\tMy Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->my_discriminator)); - printf(", Your Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->your_discriminator)); - printf("\n\t Desired min Tx Interval: %4u ms", EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000); - printf("\n\t Required min Rx Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_rx_interval)/1000); - printf("\n\t Required min Echo Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_echo_interval)/1000); + ND_PRINT((ndo, "\n\tMy Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->my_discriminator))); + ND_PRINT((ndo, ", Your Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->your_discriminator))); + ND_PRINT((ndo, "\n\t Desired min Tx Interval: %4u ms", EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000)); + ND_PRINT((ndo, "\n\t Required min Rx Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_rx_interval)/1000)); + ND_PRINT((ndo, "\n\t Required min Echo Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_echo_interval)/1000)); if (bfd_header->flags & BFD_FLAG_AUTH) { pptr += sizeof (const struct bfd_header_t); bfd_auth_header = (const struct bfd_auth_header_t *)pptr; - TCHECK2(*bfd_auth_header, sizeof(const struct bfd_auth_header_t)); - printf("\n\t%s (%u) Authentication, length %u present", + ND_TCHECK2(*bfd_auth_header, sizeof(const struct bfd_auth_header_t)); + ND_PRINT((ndo, "\n\t%s (%u) Authentication, length %u present", tok2str(bfd_v1_authentication_values,"Unknown",bfd_auth_header->auth_type), bfd_auth_header->auth_type, - bfd_auth_header->auth_len); + bfd_auth_header->auth_len)); } break; @@ -261,11 +261,11 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port) case (BFD_ECHO_PORT << 8 | 1): default: - printf("BFD, %s, length: %u", + ND_PRINT((ndo, "BFD, %s, length: %u", tok2str(bfd_port_values, "unknown (%u)", port), - len); - if (vflag >= 1) { - if(!print_unknown_data(gndo, pptr,"\n\t",len)) + len)); + if (ndo->ndo_vflag >= 1) { + if(!print_unknown_data(ndo, pptr,"\n\t",len)) return; } break; @@ -273,7 +273,7 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port) return; trunc: - printf("[|BFD]"); + ND_PRINT((ndo, "[|BFD]")); } /* * Local Variables: diff --git a/print-gre.c b/print-gre.c index 3dd6f0f9..b0eeb56e 100644 --- a/print-gre.c +++ b/print-gre.c @@ -42,13 +42,10 @@ #include -#include #include #include "interface.h" #include "extract.h" - -#include "ip.h" #include "ethertype.h" static const char tstr[] = "[|gre]"; @@ -78,49 +75,47 @@ static const struct tok gre_flag_values[] = { #define GRESRE_IP 0x0800 /* IP */ #define GRESRE_ASN 0xfffe /* ASN */ -void gre_print_0(const u_char *, u_int); -void gre_print_1(const u_char *, u_int); -void gre_sre_print(u_int16_t, u_int8_t, u_int8_t, const u_char *, u_int); -void gre_sre_ip_print(u_int8_t, u_int8_t, const u_char *, u_int); -void gre_sre_asn_print(u_int8_t, u_int8_t, const u_char *, u_int); +static void gre_print_0(netdissect_options *, const u_char *, u_int); +static void gre_print_1(netdissect_options *, const u_char *, u_int); +static void gre_sre_print(netdissect_options *, u_int16_t, u_int8_t, u_int8_t, const u_char *, u_int); +static void gre_sre_ip_print(netdissect_options *, u_int8_t, u_int8_t, const u_char *, u_int); +static void gre_sre_asn_print(netdissect_options *, u_int8_t, u_int8_t, const u_char *, u_int); void -gre_print(const u_char *bp, u_int length) +gre_print(netdissect_options *ndo, const u_char *bp, u_int length) { u_int len = length, vers; if (len < 2) { - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return; } vers = EXTRACT_16BITS(bp) & GRE_VERS_MASK; - printf("GREv%u",vers); + ND_PRINT((ndo, "GREv%u",vers)); switch(vers) { case 0: - gre_print_0(bp, len); + gre_print_0(ndo, bp, len); break; case 1: - gre_print_1(bp, len); + gre_print_1(ndo, bp, len); break; default: - printf(" ERROR: unknown-version"); + ND_PRINT((ndo, " ERROR: unknown-version")); break; } - return; - } -void -gre_print_0(const u_char *bp, u_int length) +static void +gre_print_0(netdissect_options *ndo, const u_char *bp, u_int length) { u_int len = length; u_int16_t flags, prot; flags = EXTRACT_16BITS(bp); - if (vflag) - printf(", Flags [%s]", - bittok2str(gre_flag_values,"none",flags)); + if (ndo->ndo_vflag) + ND_PRINT((ndo, ", Flags [%s]", + bittok2str(gre_flag_values,"none",flags))); len -= 2; bp += 2; @@ -134,14 +129,14 @@ gre_print_0(const u_char *bp, u_int length) if ((flags & GRE_CP) | (flags & GRE_RP)) { if (len < 2) goto trunc; - if (vflag) - printf(", sum 0x%x", EXTRACT_16BITS(bp)); + if (ndo->ndo_vflag) + ND_PRINT((ndo, ", sum 0x%x", EXTRACT_16BITS(bp))); bp += 2; len -= 2; if (len < 2) goto trunc; - printf(", off 0x%x", EXTRACT_16BITS(bp)); + ND_PRINT((ndo, ", off 0x%x", EXTRACT_16BITS(bp))); bp += 2; len -= 2; } @@ -149,7 +144,7 @@ gre_print_0(const u_char *bp, u_int length) if (flags & GRE_KP) { if (len < 4) goto trunc; - printf(", key=0x%x", EXTRACT_32BITS(bp)); + ND_PRINT((ndo, ", key=0x%x", EXTRACT_32BITS(bp))); bp += 4; len -= 4; } @@ -157,7 +152,7 @@ gre_print_0(const u_char *bp, u_int length) if (flags & GRE_SP) { if (len < 4) goto trunc; - printf(", seq %u", EXTRACT_32BITS(bp)); + ND_PRINT((ndo, ", seq %u", EXTRACT_32BITS(bp))); bp += 4; len -= 4; } @@ -179,7 +174,7 @@ gre_print_0(const u_char *bp, u_int length) if (af == 0 && srelen == 0) break; - gre_sre_print(af, sreoff, srelen, bp, len); + gre_sre_print(ndo, af, sreoff, srelen, bp, len); if (len < srelen) goto trunc; @@ -188,25 +183,25 @@ gre_print_0(const u_char *bp, u_int length) } } - if (eflag) - printf(", proto %s (0x%04x)", + if (ndo->ndo_eflag) + ND_PRINT((ndo, ", proto %s (0x%04x)", tok2str(ethertype_values,"unknown",prot), - prot); + prot)); - printf(", length %u",length); + ND_PRINT((ndo, ", length %u",length)); - if (vflag < 1) - printf(": "); /* put in a colon as protocol demarc */ + if (ndo->ndo_vflag < 1) + ND_PRINT((ndo, ": ")); /* put in a colon as protocol demarc */ else - printf("\n\t"); /* if verbose go multiline */ + ND_PRINT((ndo, "\n\t")); /* if verbose go multiline */ switch (prot) { case ETHERTYPE_IP: - ip_print(gndo, bp, len); + ip_print(ndo, bp, len); break; #ifdef INET6 case ETHERTYPE_IPV6: - ip6_print(gndo, bp, len); + ip6_print(ndo, bp, len); break; #endif case ETHERTYPE_MPLS: @@ -222,19 +217,19 @@ gre_print_0(const u_char *bp, u_int length) isoclns_print(bp, len, len); break; case ETHERTYPE_TEB: - ether_print(gndo, bp, len, len, NULL, NULL); + ether_print(ndo, bp, len, len, NULL, NULL); break; default: - printf("gre-proto-0x%x", prot); + ND_PRINT((ndo, "gre-proto-0x%x", prot)); } return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } -void -gre_print_1(const u_char *bp, u_int length) +static void +gre_print_1(netdissect_options *ndo, const u_char *bp, u_int length) { u_int len = length; u_int16_t flags, prot; @@ -243,9 +238,9 @@ gre_print_1(const u_char *bp, u_int length) len -= 2; bp += 2; - if (vflag) - printf(", Flags [%s]", - bittok2str(gre_flag_values,"none",flags)); + if (ndo->ndo_vflag) + ND_PRINT((ndo, ", Flags [%s]", + bittok2str(gre_flag_values,"none",flags))); if (len < 2) goto trunc; @@ -260,7 +255,7 @@ gre_print_1(const u_char *bp, u_int length) if (len < 4) goto trunc; k = EXTRACT_32BITS(bp); - printf(", call %d", k & 0xffff); + ND_PRINT((ndo, ", call %d", k & 0xffff)); len -= 4; bp += 4; } @@ -268,7 +263,7 @@ gre_print_1(const u_char *bp, u_int length) if (flags & GRE_SP) { if (len < 4) goto trunc; - printf(", seq %u", EXTRACT_32BITS(bp)); + ND_PRINT((ndo, ", seq %u", EXTRACT_32BITS(bp))); bp += 4; len -= 4; } @@ -276,78 +271,80 @@ gre_print_1(const u_char *bp, u_int length) if (flags & GRE_AP) { if (len < 4) goto trunc; - printf(", ack %u", EXTRACT_32BITS(bp)); + ND_PRINT((ndo, ", ack %u", EXTRACT_32BITS(bp))); bp += 4; len -= 4; } if ((flags & GRE_SP) == 0) - printf(", no-payload"); + ND_PRINT((ndo, ", no-payload")); - if (eflag) - printf(", proto %s (0x%04x)", + if (ndo->ndo_eflag) + ND_PRINT((ndo, ", proto %s (0x%04x)", tok2str(ethertype_values,"unknown",prot), - prot); + prot)); - printf(", length %u",length); + ND_PRINT((ndo, ", length %u",length)); if ((flags & GRE_SP) == 0) return; - if (vflag < 1) - printf(": "); /* put in a colon as protocol demarc */ + if (ndo->ndo_vflag < 1) + ND_PRINT((ndo, ": ")); /* put in a colon as protocol demarc */ else - printf("\n\t"); /* if verbose go multiline */ + ND_PRINT((ndo, "\n\t")); /* if verbose go multiline */ switch (prot) { case ETHERTYPE_PPP: ppp_print(bp, len); break; default: - printf("gre-proto-0x%x", prot); + ND_PRINT((ndo, "gre-proto-0x%x", prot)); break; } return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } -void -gre_sre_print(u_int16_t af, u_int8_t sreoff, u_int8_t srelen, - const u_char *bp, u_int len) +static void +gre_sre_print(netdissect_options *ndo, u_int16_t af, u_int8_t sreoff, + u_int8_t srelen, const u_char *bp, u_int len) { switch (af) { case GRESRE_IP: - printf(", (rtaf=ip"); - gre_sre_ip_print(sreoff, srelen, bp, len); - printf(") "); + ND_PRINT((ndo, ", (rtaf=ip")); + gre_sre_ip_print(ndo, sreoff, srelen, bp, len); + ND_PRINT((ndo, ") ")); break; case GRESRE_ASN: - printf(", (rtaf=asn"); - gre_sre_asn_print(sreoff, srelen, bp, len); - printf(") "); + ND_PRINT((ndo, ", (rtaf=asn")); + gre_sre_asn_print(ndo, sreoff, srelen, bp, len); + ND_PRINT((ndo, ") ")); break; default: - printf(", (rtaf=0x%x) ", af); + ND_PRINT((ndo, ", (rtaf=0x%x) ", af)); } } -void -gre_sre_ip_print(u_int8_t sreoff, u_int8_t srelen, const u_char *bp, u_int len) + +static void +gre_sre_ip_print(netdissect_options *ndo, u_int8_t sreoff, u_int8_t srelen, + const u_char *bp, u_int len) { struct in_addr a; const u_char *up = bp; if (sreoff & 3) { - printf(", badoffset=%u", sreoff); + ND_PRINT((ndo, ", badoffset=%u", sreoff)); return; } if (srelen & 3) { - printf(", badlength=%u", srelen); + ND_PRINT((ndo, ", badlength=%u", srelen)); return; } if (sreoff >= srelen) { - printf(", badoff/len=%u/%u", sreoff, srelen); + ND_PRINT((ndo, ", badoff/len=%u/%u", sreoff, srelen)); return; } @@ -356,9 +353,9 @@ gre_sre_ip_print(u_int8_t sreoff, u_int8_t srelen, const u_char *bp, u_int len) return; memcpy(&a, bp, sizeof(a)); - printf(" %s%s", + ND_PRINT((ndo, " %s%s", ((bp - up) == sreoff) ? "*" : "", - inet_ntoa(a)); + inet_ntoa(a))); bp += 4; len -= 4; @@ -366,21 +363,22 @@ gre_sre_ip_print(u_int8_t sreoff, u_int8_t srelen, const u_char *bp, u_int len) } } -void -gre_sre_asn_print(u_int8_t sreoff, u_int8_t srelen, const u_char *bp, u_int len) +static void +gre_sre_asn_print(netdissect_options *ndo, u_int8_t sreoff, u_int8_t srelen, + const u_char *bp, u_int len) { const u_char *up = bp; if (sreoff & 1) { - printf(", badoffset=%u", sreoff); + ND_PRINT((ndo, ", badoffset=%u", sreoff)); return; } if (srelen & 1) { - printf(", badlength=%u", srelen); + ND_PRINT((ndo, ", badlength=%u", srelen)); return; } if (sreoff >= srelen) { - printf(", badoff/len=%u/%u", sreoff, srelen); + ND_PRINT((ndo, ", badoff/len=%u/%u", sreoff, srelen)); return; } @@ -388,9 +386,9 @@ gre_sre_asn_print(u_int8_t sreoff, u_int8_t srelen, const u_char *bp, u_int len) if (len < 2 || srelen == 0) return; - printf(" %s%x", + ND_PRINT((ndo, " %s%x", ((bp - up) == sreoff) ? "*" : "", - EXTRACT_16BITS(bp)); + EXTRACT_16BITS(bp))); bp += 2; len -= 2; diff --git a/print-ip.c b/print-ip.c index 6e76ecf3..b37b2b33 100644 --- a/print-ip.c +++ b/print-ip.c @@ -445,7 +445,7 @@ again: case IPPROTO_GRE: /* do it */ - gre_print(ipds->cp, ipds->len); + gre_print(ndo, ipds->cp, ipds->len); break; case IPPROTO_MOBILE: diff --git a/print-ip6.c b/print-ip6.c index 62525346..91da17ec 100644 --- a/print-ip6.c +++ b/print-ip6.c @@ -246,7 +246,7 @@ ip6_print(netdissect_options *ndo, const u_char *bp, u_int length) return; case IPPROTO_GRE: - gre_print(cp, len); + gre_print(ndo, cp, len); return; case IPPROTO_RSVP: diff --git a/print-udp.c b/print-udp.c index 2ff6d824..f52de035 100644 --- a/print-udp.c +++ b/print-udp.c @@ -660,7 +660,7 @@ udp_print(register const u_char *bp, u_int length, lspping_print((const u_char *)(up + 1), length); else if (dport == BFD_CONTROL_PORT || dport == BFD_ECHO_PORT ) - bfd_print((const u_char *)(up+1), length, dport); + bfd_print(gndo, (const u_char *)(up+1), length, dport); else if (ISPORT(LMP_PORT)) lmp_print((const u_char *)(up + 1), length); else if (ISPORT(VQP_PORT)) diff --git a/tcpdump.c b/tcpdump.c index 17ecbedf..d820edd4 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -167,10 +167,6 @@ struct ndo_printer { static const struct printer printers[] = { - { arcnet_if_print, DLT_ARCNET }, -#ifdef DLT_ARCNET_LINUX - { arcnet_linux_if_print, DLT_ARCNET_LINUX }, -#endif { token_if_print, DLT_IEEE802 }, { sl_if_print, DLT_SLIP }, #ifdef DLT_SLIP_BSDOS @@ -343,6 +339,10 @@ static const struct ndo_printer ndo_printers[] = { #endif #ifdef DLT_LANE8023 { lane_if_print, DLT_LANE8023 }, +#endif + { arcnet_if_print, DLT_ARCNET }, +#ifdef DLT_ARCNET_LINUX + { arcnet_linux_if_print, DLT_ARCNET_LINUX }, #endif { NULL, 0 }, };