diff options
author | Denis Ovsienko <infrastation@yandex.ru> | 2014-03-19 13:57:56 +0400 |
---|---|---|
committer | Denis Ovsienko <infrastation@yandex.ru> | 2014-03-19 14:16:56 +0400 |
commit | 17934c433e64063bfb3e1a1b7ca8e5cff95f8710 (patch) | |
tree | 04b4aa6482887a2c79804be0acd1cfe6627ed929 | |
parent | bed843855d69cfc7c6bef96b4e6d43301bc7c290 (diff) | |
download | tcpdump-17934c433e64063bfb3e1a1b7ca8e5cff95f8710.tar.gz |
NDOize 7 bigger decoders
This change converts IGMP, IPv6 mobility options, LDP, Lightweight
Access Point, PGM, PPTP and RIP decoders.
-rw-r--r-- | interface.h | 8 | ||||
-rw-r--r-- | netdissect.h | 13 | ||||
-rw-r--r-- | print-igmp.c | 179 | ||||
-rw-r--r-- | print-ip.c | 4 | ||||
-rw-r--r-- | print-ip6.c | 4 | ||||
-rw-r--r-- | print-ldp.c | 162 | ||||
-rw-r--r-- | print-lwapp.c | 64 | ||||
-rw-r--r-- | print-mobility.c | 142 | ||||
-rw-r--r-- | print-pgm.c | 232 | ||||
-rw-r--r-- | print-pptp.c | 718 | ||||
-rw-r--r-- | print-rip.c | 105 | ||||
-rw-r--r-- | print-tcp.c | 4 | ||||
-rw-r--r-- | print-udp.c | 12 |
13 files changed, 837 insertions, 810 deletions
diff --git a/interface.h b/interface.h index 4d305b69..9f691300 100644 --- a/interface.h +++ b/interface.h @@ -184,7 +184,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 igmp_print(const u_char *, u_int); extern void isoclns_print(const u_char *, u_int, u_int); extern void krb_print(const u_char *); extern u_int llap_print(const u_char *, u_int); @@ -201,18 +200,14 @@ extern void olsr_print (const u_char *, u_int, int); extern void pimv1_print(const u_char *, u_int); extern void cisco_autorp_print(const u_char *, u_int); extern void rsvp_print(const u_char *, u_int); -extern void ldp_print(const u_char *, u_int); extern void lldp_print(const u_char *, u_int); extern void lspping_print(const u_char *, u_int); -extern void lwapp_control_print(const u_char *, u_int, int); -extern void lwapp_data_print(const u_char *, u_int); extern void pim_print(const u_char *, u_int, u_int); extern u_int ppp_print(register const u_char *, u_int); extern u_int ppp_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int ppp_hdlc_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int ppp_bsdos_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int prism_if_print(const struct pcap_pkthdr *, const u_char *); -extern void rip_print(const u_char *, u_int); extern u_int sl_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int sl_bsdos_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int juniper_atm1_print(const struct pcap_pkthdr *, const u_char *); @@ -249,10 +244,8 @@ extern void print_data(const unsigned char *, int); extern void vrrp_print(const u_char *, u_int, const u_char *, 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 *); extern void cdp_print(const u_char *, u_int, u_int); extern void lwres_print(const u_char *, u_int); -extern void pptp_print(const u_char *); extern void sctp_print(const u_char *, const u_char *, u_int); extern void forces_print(const u_char *, u_int); extern void mpls_lsp_ping_print(const u_char *, u_int); @@ -262,7 +255,6 @@ extern int mptcp_print(const u_char *, u_int, u_char); #ifdef INET6 -extern int mobility_print(const u_char *, const u_char *); extern void ospf6_print(const u_char *, u_int); extern void dhcp6_print(const u_char *, u_int); extern void babel_print(const u_char *, u_int); diff --git a/netdissect.h b/netdissect.h index 09e883f0..a3d2cb34 100644 --- a/netdissect.h +++ b/netdissect.h @@ -437,6 +437,13 @@ extern u_int mfr_print(netdissect_options *, register const u_char *, u_int); extern u_int fr_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *); extern u_int mfr_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *); extern void q933_print(netdissect_options *, const u_char *, u_int); +extern void igmp_print(netdissect_options *, const u_char *, u_int); +extern void rip_print(netdissect_options *, const u_char *, u_int); +extern void lwapp_control_print(netdissect_options *, const u_char *, u_int, int); +extern void lwapp_data_print(netdissect_options *, const u_char *, u_int); +extern void pgm_print(netdissect_options *, const u_char *, u_int, const u_char *); +extern void pptp_print(netdissect_options *, const u_char *); +extern void ldp_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 *); @@ -464,8 +471,6 @@ extern void egp_print(netdissect_options *,const u_char *, u_int, extern void hsrp_print(netdissect_options *ndo, register const u_char *bp, register u_int len); extern void ieee802_11_if_print(u_char *,const struct pcap_pkthdr *, const u_char *); -extern void igmp_print(netdissect_options *, - register const u_char *, u_int); extern void igrp_print(netdissect_options *,const u_char *, u_int, const u_char *); extern void isoclns_print(netdissect_options *,const u_char *, @@ -500,8 +505,6 @@ extern void ppp_hdlc_if_print(u_char *, extern void ppp_bsdos_if_print(u_char *, const struct pcap_pkthdr *, const u_char *); -extern void rip_print(netdissect_options *,const u_char *, u_int); - extern void sctp_print(netdissect_options *ndo, const u_char *bp, const u_char *bp2, u_int sctpPacketLength); @@ -542,7 +545,6 @@ extern void carp_print(netdissect_options *,const u_char *bp, extern void cdp_print(netdissect_options *,const u_char *, u_int, u_int, const u_char *, const u_char *); extern void lwres_print(netdissect_options *,const u_char *, u_int); -extern void pptp_print(netdissect_options *,const u_char *, u_int); #endif extern u_int ipnet_if_print(netdissect_options *,const struct pcap_pkthdr *, const u_char *); @@ -557,6 +559,7 @@ extern int rt6_print(netdissect_options *, const u_char *, const u_char *); extern int hbhopt_print(netdissect_options *, const u_char *); extern int dstopt_print(netdissect_options *, const u_char *); extern void ripng_print(netdissect_options *, const u_char *, unsigned int); +extern int mobility_print(netdissect_options *, const u_char *, const u_char *); #if 0 extern void icmp6_print(netdissect_options *,const u_char *, const u_char *); diff --git a/print-igmp.c b/print-igmp.c index d1cc4f35..14b55fd3 100644 --- a/print-igmp.c +++ b/print-igmp.c @@ -19,15 +19,13 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <tcpdump-stdinc.h> -#include <stdio.h> -#include <string.h> - #include "interface.h" #include "addrtoname.h" #include "extract.h" /* must come after interface.h */ @@ -104,118 +102,119 @@ static const struct tok igmpv3report2str[] = { }; static void -print_mtrace(register const u_char *bp, register u_int len) +print_mtrace(netdissect_options *ndo, + register const u_char *bp, register u_int len) { register const struct tr_query *tr = (const struct tr_query *)(bp + 8); - TCHECK(*tr); + ND_TCHECK(*tr); if (len < 8 + sizeof (struct tr_query)) { - (void)printf(" [invalid len %d]", len); + ND_PRINT((ndo, " [invalid len %d]", len)); return; } - printf("mtrace %u: %s to %s reply-to %s", + ND_PRINT((ndo, "mtrace %u: %s to %s reply-to %s", TR_GETQID(EXTRACT_32BITS(&tr->tr_rttlqid)), ipaddr_string(&tr->tr_src), ipaddr_string(&tr->tr_dst), - ipaddr_string(&tr->tr_raddr)); + ipaddr_string(&tr->tr_raddr))); if (IN_CLASSD(EXTRACT_32BITS(&tr->tr_raddr))) - printf(" with-ttl %d", TR_GETTTL(EXTRACT_32BITS(&tr->tr_rttlqid))); + ND_PRINT((ndo, " with-ttl %d", TR_GETTTL(EXTRACT_32BITS(&tr->tr_rttlqid)))); return; trunc: - printf("%s", tstr); - return; + ND_PRINT((ndo, "%s", tstr)); } static void -print_mresp(register const u_char *bp, register u_int len) +print_mresp(netdissect_options *ndo, + register const u_char *bp, register u_int len) { register const struct tr_query *tr = (const struct tr_query *)(bp + 8); - TCHECK(*tr); + ND_TCHECK(*tr); if (len < 8 + sizeof (struct tr_query)) { - (void)printf(" [invalid len %d]", len); + ND_PRINT((ndo, " [invalid len %d]", len)); return; } - printf("mresp %lu: %s to %s reply-to %s", + ND_PRINT((ndo, "mresp %lu: %s to %s reply-to %s", (u_long)TR_GETQID(EXTRACT_32BITS(&tr->tr_rttlqid)), ipaddr_string(&tr->tr_src), ipaddr_string(&tr->tr_dst), - ipaddr_string(&tr->tr_raddr)); + ipaddr_string(&tr->tr_raddr))); if (IN_CLASSD(EXTRACT_32BITS(&tr->tr_raddr))) - printf(" with-ttl %d", TR_GETTTL(EXTRACT_32BITS(&tr->tr_rttlqid))); + ND_PRINT((ndo, " with-ttl %d", TR_GETTTL(EXTRACT_32BITS(&tr->tr_rttlqid)))); return; trunc: - printf("%s", tstr); - return; + ND_PRINT((ndo, "%s", tstr)); } static void -print_igmpv3_report(register const u_char *bp, register u_int len) +print_igmpv3_report(netdissect_options *ndo, + register const u_char *bp, register u_int len) { u_int group, nsrcs, ngroups; register u_int i, j; /* Minimum len is 16, and should be a multiple of 4 */ if (len < 16 || len & 0x03) { - (void)printf(" [invalid len %d]", len); + ND_PRINT((ndo, " [invalid len %d]", len)); return; } - TCHECK2(bp[6], 2); + ND_TCHECK2(bp[6], 2); ngroups = EXTRACT_16BITS(&bp[6]); - (void)printf(", %d group record(s)", ngroups); - if (vflag > 0) { + ND_PRINT((ndo, ", %d group record(s)", ngroups)); + if (ndo->ndo_vflag > 0) { /* Print the group records */ group = 8; for (i=0; i<ngroups; i++) { if (len < group+8) { - (void)printf(" [invalid number of groups]"); + ND_PRINT((ndo, " [invalid number of groups]")); return; } - TCHECK2(bp[group+4], 4); - (void)printf(" [gaddr %s", ipaddr_string(&bp[group+4])); - (void)printf(" %s", tok2str(igmpv3report2str, " [v3-report-#%d]", - bp[group])); + ND_TCHECK2(bp[group+4], 4); + ND_PRINT((ndo, " [gaddr %s", ipaddr_string(&bp[group+4]))); + ND_PRINT((ndo, " %s", tok2str(igmpv3report2str, " [v3-report-#%d]", + bp[group]))); nsrcs = EXTRACT_16BITS(&bp[group+2]); /* Check the number of sources and print them */ if (len < group+8+(nsrcs<<2)) { - (void)printf(" [invalid number of sources %d]", nsrcs); + ND_PRINT((ndo, " [invalid number of sources %d]", nsrcs)); return; } - if (vflag == 1) - (void)printf(", %d source(s)", nsrcs); + if (ndo->ndo_vflag == 1) + ND_PRINT((ndo, ", %d source(s)", nsrcs)); else { /* Print the sources */ - (void)printf(" {"); + ND_PRINT((ndo, " {")); for (j=0; j<nsrcs; j++) { - TCHECK2(bp[group+8+(j<<2)], 4); - (void)printf(" %s", ipaddr_string(&bp[group+8+(j<<2)])); + ND_TCHECK2(bp[group+8+(j<<2)], 4); + ND_PRINT((ndo, " %s", ipaddr_string(&bp[group+8+(j<<2)]))); } - (void)printf(" }"); + ND_PRINT((ndo, " }")); } /* Next group record */ group += 8 + (nsrcs << 2); - (void)printf("]"); + ND_PRINT((ndo, "]")); } } return; trunc: - (void)printf("%s", tstr); - return; + ND_PRINT((ndo, "%s", tstr)); } static void -print_igmpv3_query(register const u_char *bp, register u_int len) +print_igmpv3_query(netdissect_options *ndo, + register const u_char *bp, register u_int len) { u_int mrc; int mrt; u_int nsrcs; register u_int i; - (void)printf(" v3"); + ND_PRINT((ndo, " v3")); /* Minimum len is 12, and should be a multiple of 4 */ if (len < 12 || len & 0x03) { - (void)printf(" [invalid len %d]", len); + ND_PRINT((ndo, " [invalid len %d]", len)); return; } - TCHECK(bp[1]); + ND_TCHECK(bp[1]); mrc = bp[1]; if (mrc < 128) { mrt = mrc; @@ -223,119 +222,119 @@ print_igmpv3_query(register const u_char *bp, register u_int len) mrt = ((mrc & 0x0f) | 0x10) << (((mrc & 0x70) >> 4) + 3); } if (mrc != 100) { - (void)printf(" [max resp time "); + ND_PRINT((ndo, " [max resp time ")); if (mrt < 600) { - (void)printf("%.1fs", mrt * 0.1); + ND_PRINT((ndo, "%.1fs", mrt * 0.1)); } else { relts_print(mrt / 10); } - (void)printf("]"); + ND_PRINT((ndo, "]")); } - TCHECK2(bp[4], 4); + ND_TCHECK2(bp[4], 4); if (EXTRACT_32BITS(&bp[4]) == 0) return; - (void)printf(" [gaddr %s", ipaddr_string(&bp[4])); - TCHECK2(bp[10], 2); + ND_PRINT((ndo, " [gaddr %s", ipaddr_string(&bp[4]))); + ND_TCHECK2(bp[10], 2); nsrcs = EXTRACT_16BITS(&bp[10]); if (nsrcs > 0) { if (len < 12 + (nsrcs << 2)) - (void)printf(" [invalid number of sources]"); - else if (vflag > 1) { - (void)printf(" {"); + ND_PRINT((ndo, " [invalid number of sources]")); + else if (ndo->ndo_vflag > 1) { + ND_PRINT((ndo, " {")); for (i=0; i<nsrcs; i++) { - TCHECK2(bp[12+(i<<2)], 4); - (void)printf(" %s", ipaddr_string(&bp[12+(i<<2)])); + ND_TCHECK2(bp[12+(i<<2)], 4); + ND_PRINT((ndo, " %s", ipaddr_string(&bp[12+(i<<2)]))); } - (void)printf(" }"); + ND_PRINT((ndo, " }")); } else - (void)printf(", %d source(s)", nsrcs); + ND_PRINT((ndo, ", %d source(s)", nsrcs)); } - (void)printf("]"); + ND_PRINT((ndo, "]")); return; trunc: - (void)printf("%s", tstr); - return; + ND_PRINT((ndo, "%s", tstr)); } void -igmp_print(register const u_char *bp, register u_int len) +igmp_print(netdissect_options *ndo, + register const u_char *bp, register u_int len) { struct cksum_vec vec[1]; - if (qflag) { - (void)printf("igmp"); + if (ndo->ndo_qflag) { + ND_PRINT((ndo, "igmp")); return; } - TCHECK(bp[0]); + ND_TCHECK(bp[0]); switch (bp[0]) { case 0x11: - (void)printf("igmp query"); + ND_PRINT((ndo, "igmp query")); if (len >= 12) - print_igmpv3_query(bp, len); + print_igmpv3_query(ndo, bp, len); else { - TCHECK(bp[1]); + ND_TCHECK(bp[1]); if (bp[1]) { - (void)printf(" v2"); + ND_PRINT((ndo, " v2")); if (bp[1] != 100) - (void)printf(" [max resp time %d]", bp[1]); + ND_PRINT((ndo, " [max resp time %d]", bp[1])); } else - (void)printf(" v1"); - TCHECK2(bp[4], 4); + ND_PRINT((ndo, " v1")); + ND_TCHECK2(bp[4], 4); if (EXTRACT_32BITS(&bp[4])) - (void)printf(" [gaddr %s]", ipaddr_string(&bp[4])); + ND_PRINT((ndo, " [gaddr %s]", ipaddr_string(&bp[4]))); if (len != 8) - (void)printf(" [len %d]", len); + ND_PRINT((ndo, " [len %d]", len)); } break; case 0x12: - TCHECK2(bp[4], 4); - (void)printf("igmp v1 report %s", ipaddr_string(&bp[4])); + ND_TCHECK2(bp[4], 4); + ND_PRINT((ndo, "igmp v1 report %s", ipaddr_string(&bp[4]))); if (len != 8) - (void)printf(" [len %d]", len); + ND_PRINT((ndo, " [len %d]", len)); break; case 0x16: - TCHECK2(bp[4], 4); - (void)printf("igmp v2 report %s", ipaddr_string(&bp[4])); + ND_TCHECK2(bp[4], 4); + ND_PRINT((ndo, "igmp v2 report %s", ipaddr_string(&bp[4]))); break; case 0x22: - (void)printf("igmp v3 report"); - print_igmpv3_report(bp, len); + ND_PRINT((ndo, "igmp v3 report")); + print_igmpv3_report(ndo, bp, len); break; case 0x17: - TCHECK2(bp[4], 4); - (void)printf("igmp leave %s", ipaddr_string(&bp[4])); + ND_TCHECK2(bp[4], 4); + ND_PRINT((ndo, "igmp leave %s", ipaddr_string(&bp[4]))); break; case 0x13: - (void)printf("igmp dvmrp"); + ND_PRINT((ndo, "igmp dvmrp")); if (len < 8) - (void)printf(" [len %d]", len); + ND_PRINT((ndo, " [len %d]", len)); else dvmrp_print(bp, len); break; case 0x14: - (void)printf("igmp pimv1"); + ND_PRINT((ndo, "igmp pimv1")); pimv1_print(bp, len); break; case 0x1e: - print_mresp(bp, len); + print_mresp(ndo, bp, len); break; case 0x1f: - print_mtrace(bp, len); + print_mtrace(ndo, bp, len); break; default: - (void)printf("igmp-%d", bp[0]); + ND_PRINT((ndo, "igmp-%d", bp[0])); break; } - if (vflag && TTEST2(bp[0], len)) { + if (ndo->ndo_vflag && ND_TTEST2(bp[0], len)) { /* Check the IGMP checksum */ vec[0].ptr = bp; vec[0].len = len; if (in_cksum(vec, 1)) - printf(" bad igmp cksum %x!", EXTRACT_16BITS(&bp[2])); + ND_PRINT((ndo, " bad igmp cksum %x!", EXTRACT_16BITS(&bp[2]))); } return; trunc: - (void)printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } @@ -420,7 +420,7 @@ again: break; case IPPROTO_IGMP: - igmp_print(ipds->cp, ipds->len); + igmp_print(ndo, ipds->cp, ipds->len); break; case IPPROTO_IPV4: @@ -476,7 +476,7 @@ again: break; case IPPROTO_PGM: - pgm_print(ipds->cp, ipds->len, (const u_char *)ipds->ip); + pgm_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip); break; default: diff --git a/print-ip6.c b/print-ip6.c index 8c3a7238..d941a700 100644 --- a/print-ip6.c +++ b/print-ip6.c @@ -180,7 +180,7 @@ ip6_print(netdissect_options *ndo, const u_char *bp, u_int length) * which payload can be piggybacked atop a * mobility header. */ - advance = mobility_print(cp, (const u_char *)ip6); + advance = mobility_print(ndo, cp, (const u_char *)ip6); nh = *cp; return; case IPPROTO_ROUTING: @@ -240,7 +240,7 @@ ip6_print(netdissect_options *ndo, const u_char *bp, u_int length) return; case IPPROTO_PGM: - pgm_print(cp, len, (const u_char *)ip6); + pgm_print(ndo, cp, len, (const u_char *)ip6); return; case IPPROTO_GRE: diff --git a/print-ldp.c b/print-ldp.c index 2d609388..d31bfa89 100644 --- a/print-ldp.c +++ b/print-ldp.c @@ -14,16 +14,13 @@ * and Steinar Haug (sthaug@nethelp.no) */ +#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" @@ -212,8 +209,7 @@ static const struct tok ldp_fec_martini_ifparm_vccv_cv_values[] = { { 0, NULL} }; -int ldp_msg_print(register const u_char *); -int ldp_tlv_print(register const u_char *); +static int ldp_msg_print(netdissect_options *, register const u_char *); /* * ldp tlv header @@ -233,10 +229,11 @@ int ldp_tlv_print(register const u_char *); */ #define TLV_TCHECK(minlen) \ - TCHECK2(*tptr, minlen); if (tlv_tlen < minlen) goto badtlv; + ND_TCHECK2(*tptr, minlen); if (tlv_tlen < minlen) goto badtlv; -int -ldp_tlv_print(register const u_char *tptr) { +static int +ldp_tlv_print(netdissect_options *ndo, + register const u_char *tptr) { struct ldp_tlv_header { u_int8_t type[2]; @@ -256,14 +253,14 @@ ldp_tlv_print(register const u_char *tptr) { tlv_type=LDP_MASK_TLV_TYPE(EXTRACT_16BITS(ldp_tlv_header->type)); /* FIXME vendor private / experimental check */ - printf("\n\t %s TLV (0x%04x), length: %u, Flags: [%s and %s forward if unknown]", + ND_PRINT((ndo, "\n\t %s TLV (0x%04x), length: %u, Flags: [%s and %s forward if unknown]", tok2str(ldp_tlv_values, "Unknown", tlv_type), tlv_type, tlv_len, LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "continue processing" : "ignore", - LDP_MASK_F_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "do" : "don't"); + LDP_MASK_F_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "do" : "don't")); tptr+=sizeof(struct ldp_tlv_header); @@ -271,25 +268,25 @@ ldp_tlv_print(register const u_char *tptr) { case LDP_TLV_COMMON_HELLO: TLV_TCHECK(4); - printf("\n\t Hold Time: %us, Flags: [%s Hello%s]", + ND_PRINT((ndo, "\n\t Hold Time: %us, Flags: [%s Hello%s]", EXTRACT_16BITS(tptr), (EXTRACT_16BITS(tptr+2)&0x8000) ? "Targeted" : "Link", - (EXTRACT_16BITS(tptr+2)&0x4000) ? ", Request for targeted Hellos" : ""); + (EXTRACT_16BITS(tptr+2)&0x4000) ? ", Request for targeted Hellos" : "")); break; case LDP_TLV_IPV4_TRANSPORT_ADDR: TLV_TCHECK(4); - printf("\n\t IPv4 Transport Address: %s", ipaddr_string(tptr)); + ND_PRINT((ndo, "\n\t IPv4 Transport Address: %s", ipaddr_string(tptr))); break; #ifdef INET6 case LDP_TLV_IPV6_TRANSPORT_ADDR: TLV_TCHECK(16); - printf("\n\t IPv6 Transport Address: %s", ip6addr_string(tptr)); + ND_PRINT((ndo, "\n\t IPv6 Transport Address: %s", ip6addr_string(tptr))); break; #endif case LDP_TLV_CONFIG_SEQ_NUMBER: TLV_TCHECK(4); - printf("\n\t Sequence Number: %u", EXTRACT_32BITS(tptr)); + ND_PRINT((ndo, "\n\t Sequence Number: %u", EXTRACT_32BITS(tptr))); break; case LDP_TLV_ADDRESS_LIST: @@ -297,13 +294,13 @@ ldp_tlv_print(register const u_char *tptr) { af = EXTRACT_16BITS(tptr); tptr+=LDP_TLV_ADDRESS_LIST_AFNUM_LEN; tlv_tlen -= LDP_TLV_ADDRESS_LIST_AFNUM_LEN; - printf("\n\t Address Family: %s, addresses", - tok2str(af_values, "Unknown (%u)", af)); + ND_PRINT((ndo, "\n\t Address Family: %s, addresses", + tok2str(af_values, "Unknown (%u)", af))); switch (af) { case AFNUM_INET: while(tlv_tlen >= sizeof(struct in_addr)) { - TCHECK2(*tptr, sizeof(struct in_addr)); - printf(" %s",ipaddr_string(tptr)); + ND_TCHECK2(*tptr, sizeof(struct in_addr)); + ND_PRINT((ndo, " %s", ipaddr_string(tptr))); tlv_tlen-=sizeof(struct in_addr); tptr+=sizeof(struct in_addr); } @@ -311,8 +308,8 @@ ldp_tlv_print(register const u_char *tptr) { #ifdef INET6 case AFNUM_INET6: while(tlv_tlen >= sizeof(struct in6_addr)) { - TCHECK2(*tptr, sizeof(struct in6_addr)); - printf(" %s",ip6addr_string(tptr)); + ND_TCHECK2(*tptr, sizeof(struct in6_addr)); + ND_PRINT((ndo, " %s", ip6addr_string(tptr))); tlv_tlen-=sizeof(struct in6_addr); tptr+=sizeof(struct in6_addr); } @@ -326,19 +323,19 @@ ldp_tlv_print(register const u_char *tptr) { case LDP_TLV_COMMON_SESSION: TLV_TCHECK(8); - printf("\n\t Version: %u, Keepalive: %us, Flags: [Downstream %s, Loop Detection %s]", + ND_PRINT((ndo, "\n\t Version: %u, Keepalive: %us, Flags: [Downstream %s, Loop Detection %s]", EXTRACT_16BITS(tptr), EXTRACT_16BITS(tptr+2), (EXTRACT_16BITS(tptr+6)&0x8000) ? "On Demand" : "Unsolicited", (EXTRACT_16BITS(tptr+6)&0x4000) ? "Enabled" : "Disabled" - ); + )); break; case LDP_TLV_FEC: TLV_TCHECK(1); fec_type = *tptr; - printf("\n\t %s FEC (0x%02x)", + ND_PRINT((ndo, "\n\t %s FEC (0x%02x)", tok2str(ldp_fec_values, "Unknown", fec_type), - fec_type); + fec_type)); tptr+=1; tlv_tlen-=1; @@ -356,11 +353,11 @@ ldp_tlv_print(register const u_char *tptr) { if (i == -2) goto trunc; if (i == -3) - printf(": IPv4 prefix (goes past end of TLV)"); + ND_PRINT((ndo, ": IPv4 prefix (goes past end of TLV)")); else if (i == -1) - printf(": IPv4 prefix (invalid length)"); + ND_PRINT((ndo, ": IPv4 prefix (invalid length)")); else - printf(": IPv4 prefix %s",buf); + ND_PRINT((ndo, ": IPv4 prefix %s", buf)); } #ifdef INET6 else if (af == AFNUM_INET6) { @@ -368,15 +365,15 @@ ldp_tlv_print(register const u_char *tptr) { if (i == -2) goto trunc; if (i == -3) - printf(": IPv4 prefix (goes past end of TLV)"); + ND_PRINT((ndo, ": IPv4 prefix (goes past end of TLV)")); else if (i == -1) - printf(": IPv6 prefix (invalid length)"); + ND_PRINT((ndo, ": IPv6 prefix (invalid length)")); else - printf(": IPv6 prefix %s",buf); + ND_PRINT((ndo, ": IPv6 prefix %s", buf)); } #endif else - printf(": Address family %u prefix", af); + ND_PRINT((ndo, ": Address family %u prefix", af)); break; case LDP_FEC_HOSTADDRESS: break; @@ -390,22 +387,22 @@ ldp_tlv_print(register const u_char *tptr) { vc_info_len = *(tptr+2); if (vc_info_len == 0) { - printf(": %s, %scontrol word, group-ID %u, VC-info-length: %u", + ND_PRINT((ndo, ": %s, %scontrol word, group-ID %u, VC-info-length: %u", tok2str(l2vpn_encaps_values, "Unknown", EXTRACT_16BITS(tptr)&0x7fff), EXTRACT_16BITS(tptr)&0x8000 ? "" : "no ", EXTRACT_32BITS(tptr+3), - vc_info_len); + vc_info_len)); break; } /* Make sure we have the VC ID as well */ TLV_TCHECK(11); - printf(": %s, %scontrol word, group-ID %u, VC-ID %u, VC-info-length: %u", + ND_PRINT((ndo, ": %s, %scontrol word, group-ID %u, VC-ID %u, VC-info-length: %u", tok2str(l2vpn_encaps_values, "Unknown", EXTRACT_16BITS(tptr)&0x7fff), EXTRACT_16BITS(tptr)&0x8000 ? "" : "no ", EXTRACT_32BITS(tptr+3), EXTRACT_32BITS(tptr+7), - vc_info_len); + vc_info_len)); if (vc_info_len < 4) goto trunc; /* minimum 4, for the VC ID */ vc_info_len -= 4; /* subtract out the VC ID, giving the length of the interface parameters */ @@ -423,33 +420,33 @@ ldp_tlv_print(register const u_char *tptr) { if (vc_info_len < vc_info_tlv_len) break; - printf("\n\t\tInterface Parameter: %s (0x%02x), len %u", + ND_PRINT((ndo, "\n\t\tInterface Parameter: %s (0x%02x), len %u", tok2str(ldp_fec_martini_ifparm_values,"Unknown",vc_info_tlv_type), vc_info_tlv_type, - vc_info_tlv_len); + vc_info_tlv_len)); switch(vc_info_tlv_type) { case LDP_FEC_MARTINI_IFPARM_MTU: - printf(": %u",EXTRACT_16BITS(tptr+2)); + ND_PRINT((ndo, ": %u", EXTRACT_16BITS(tptr+2))); break; case LDP_FEC_MARTINI_IFPARM_DESC: - printf(": "); + ND_PRINT((ndo, ": ")); for (idx = 2; idx < vc_info_tlv_len; idx++) safeputchar(*(tptr+idx)); break; case LDP_FEC_MARTINI_IFPARM_VCCV: - printf("\n\t\t Control Channels (0x%02x) = [%s]", + ND_PRINT((ndo, "\n\t\t Control Channels (0x%02x) = [%s]", *(tptr+2), - bittok2str(ldp_fec_martini_ifparm_vccv_cc_values,"none",*(tptr+2))); - printf("\n\t\t CV Types (0x%02x) = [%s]", + bittok2str(ldp_fec_martini_ifparm_vccv_cc_values, "none", *(tptr+2)))); + ND_PRINT((ndo, "\n\t\t CV Types (0x%02x) = [%s]", *(tptr+3), - bittok2str(ldp_fec_martini_ifparm_vccv_cv_values,"none",*(tptr+3))); + bittok2str(ldp_fec_martini_ifparm_vccv_cv_values, "none", *(tptr+3)))); break; default: - print_unknown_data(gndo,tptr+2,"\n\t\t ",vc_info_tlv_len-2); + print_unknown_data(ndo, tptr+2, "\n\t\t ", vc_info_tlv_len-2); break; } @@ -463,45 +460,45 @@ ldp_tlv_print(register const u_char *tptr) { case LDP_TLV_GENERIC_LABEL: TLV_TCHECK(4); - printf("\n\t Label: %u", EXTRACT_32BITS(tptr) & 0xfffff); + ND_PRINT((ndo, "\n\t Label: %u", EXTRACT_32BITS(tptr) & 0xfffff)); break; case LDP_TLV_STATUS: TLV_TCHECK(8); ui = EXTRACT_32BITS(tptr); tptr+=4; - printf("\n\t Status: 0x%02x, Flags: [%s and %s forward]", + ND_PRINT((ndo, "\n\t Status: 0x%02x, Flags: [%s and %s forward]", ui&0x3fffffff, ui&0x80000000 ? "Fatal error" : "Advisory Notification", - ui&0x40000000 ? "do" : "don't"); + ui&0x40000000 ? "do" : "don't")); ui = EXTRACT_32BITS(tptr); tptr+=4; if (ui) - printf(", causing Message ID: 0x%08x", ui); + ND_PRINT((ndo, ", causing Message ID: 0x%08x", ui)); break; case LDP_TLV_FT_SESSION: TLV_TCHECK(8); ft_flags = EXTRACT_16BITS(tptr); - printf("\n\t Flags: [%sReconnect, %sSave State, %sAll-Label Protection, %s Checkpoint, %sRe-Learn State]", + ND_PRINT((ndo, "\n\t Flags: [%sReconnect, %sSave State, %sAll-Label Protection, %s Checkpoint, %sRe-Learn State]", ft_flags&0x8000 ? "" : "No ", ft_flags&0x8 ? "" : "Don't ", ft_flags&0x4 ? "" : "No ", ft_flags&0x2 ? "Sequence Numbered Label" : "All Labels", - ft_flags&0x1 ? "" : "Don't "); + ft_flags&0x1 ? "" : "Don't ")); tptr+=4; ui = EXTRACT_32BITS(tptr); if (ui) - printf(", Reconnect Timeout: %ums", ui); + ND_PRINT((ndo, ", Reconnect Timeout: %ums", ui)); tptr+=4; ui = EXTRACT_32BITS(tptr); if (ui) - printf(", Recovery Time: %ums", ui); + ND_PRINT((ndo, ", Recovery Time: %ums", ui)); break; case LDP_TLV_MTU: TLV_TCHECK(2); - printf("\n\t MTU: %u", EXTRACT_16BITS(tptr)); + ND_PRINT((ndo, "\n\t MTU: %u", EXTRACT_16BITS(tptr))); break; @@ -522,27 +519,28 @@ ldp_tlv_print(register const u_char *tptr) { case LDP_TLV_LABEL_REQUEST_MSG_ID: default: - if (vflag <= 1) - print_unknown_data(gndo,tptr,"\n\t ",tlv_tlen); + if (ndo->ndo_vflag <= 1) + print_unknown_data(ndo, tptr, "\n\t ", tlv_tlen); break; } return(tlv_len+4); /* Type & Length fields not included */ trunc: - printf("\n\t\t packet exceeded snapshot"); + ND_PRINT((ndo, "\n\t\t packet exceeded snapshot")); return 0; badtlv: - printf("\n\t\t TLV contents go past end of TLV"); + ND_PRINT((ndo, "\n\t\t TLV contents go past end of TLV")); return(tlv_len+4); /* Type & Length fields not included */ } void -ldp_print(register const u_char *pptr, register u_int len) { +ldp_print(netdissect_options *ndo, + register const u_char *pptr, register u_int len) { int processed; while (len > (sizeof(struct ldp_common_header) + sizeof(struct ldp_msg_header))) { - processed = ldp_msg_print(pptr); + processed = ldp_msg_print(ndo, pptr); if (processed == 0) return; len -= processed; @@ -550,9 +548,9 @@ ldp_print(register const u_char *pptr, register u_int len) { } } - -int -ldp_msg_print(register const u_char *pptr) { +static int +ldp_msg_print(netdissect_options *ndo, + register const u_char *pptr) { const struct ldp_common_header *ldp_com_header; const struct ldp_msg_header *ldp_msg_header; @@ -563,28 +561,28 @@ ldp_msg_print(register const u_char *pptr) { tptr=pptr; ldp_com_header = (const struct ldp_common_header *)pptr; - TCHECK(*ldp_com_header); + ND_TCHECK(*ldp_com_header); /* * Sanity checking of the header. */ if (EXTRACT_16BITS(&ldp_com_header->version) != LDP_VERSION) { - printf("%sLDP version %u packet not supported", - (vflag < 1) ? "" : "\n\t", - EXTRACT_16BITS(&ldp_com_header->version)); + ND_PRINT((ndo, "%sLDP version %u packet not supported", + (ndo->ndo_vflag < 1) ? "" : "\n\t", + EXTRACT_16BITS(&ldp_com_header->version))); return 0; } /* print the LSR-ID, label-space & length */ pdu_len = EXTRACT_16BITS(&ldp_com_header->pdu_length); - printf("%sLDP, Label-Space-ID: %s:%u, pdu-length: %u", - (vflag < 1) ? "" : "\n\t", + ND_PRINT((ndo, "%sLDP, Label-Space-ID: %s:%u, pdu-length: %u", + (ndo->ndo_vflag < 1) ? "" : "\n\t", ipaddr_string(&ldp_com_header->lsr_id), EXTRACT_16BITS(&ldp_com_header->label_space), - pdu_len); + pdu_len)); /* bail out if non-verbose */ - if (vflag < 1) + if (ndo->ndo_vflag < 1) return 0; /* ok they seem to want to know everything - lets fully decode it */ @@ -595,21 +593,21 @@ ldp_msg_print(register const u_char *pptr) { while(tlen>0) { /* did we capture enough for fully decoding the msg header ? */ - TCHECK2(*tptr, sizeof(struct ldp_msg_header)); + ND_TCHECK2(*tptr, sizeof(struct ldp_msg_header)); ldp_msg_header = (const struct ldp_msg_header *)tptr; msg_len=EXTRACT_16BITS(ldp_msg_header->length); msg_type=LDP_MASK_MSG_TYPE(EXTRACT_16BITS(ldp_msg_header->type)); /* FIXME vendor private / experimental check */ - printf("\n\t %s Message (0x%04x), length: %u, Message ID: 0x%08x, Flags: [%s if unknown]", + ND_PRINT((ndo, "\n\t %s Message (0x%04x), length: %u, Message ID: 0x%08x, Flags: [%s if unknown]", tok2str(ldp_msg_values, "Unknown", msg_type), msg_type, msg_len, EXTRACT_32BITS(&ldp_msg_header->id), - LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_msg_header->type)) ? "continue processing" : "ignore"); + LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_msg_header->type)) ? "continue processing" : "ignore")); if (msg_len == 0) /* infinite loop protection */ return 0; @@ -618,7 +616,7 @@ ldp_msg_print(register const u_char *pptr) { msg_tlen=msg_len-sizeof(struct ldp_msg_header)+4; /* Type & Length fields not included */ /* did we capture enough for fully decoding the message ? */ - TCHECK2(*tptr, msg_len); + ND_TCHECK2(*tptr, msg_len); hexdump=FALSE; switch(msg_type) { @@ -632,7 +630,7 @@ ldp_msg_print(register const u_char *pptr) { case LDP_MSG_ADDRESS_WITHDRAW: case LDP_MSG_LABEL_WITHDRAW: while(msg_tlen >= 4) { - processed = ldp_tlv_print(msg_tptr); + processed = ldp_tlv_print(ndo, msg_tptr); if (processed == 0) break; msg_tlen-=processed; @@ -650,13 +648,13 @@ ldp_msg_print(register const u_char *pptr) { case LDP_MSG_LABEL_ABORT_REQUEST: default: - if (vflag <= 1) - print_unknown_data(gndo,msg_tptr,"\n\t ",msg_tlen); + if (ndo->ndo_vflag <= 1) + print_unknown_data(ndo, msg_tptr, "\n\t ", msg_tlen); break; } /* do we want to see an additionally hexdump ? */ - if (vflag > 1 || hexdump==TRUE) - print_unknown_data(gndo,tptr+sizeof(struct ldp_msg_header),"\n\t ", + if (ndo->ndo_vflag > 1 || hexdump==TRUE) + print_unknown_data(ndo, tptr+sizeof(struct ldp_msg_header), "\n\t ", msg_len); tptr += msg_len+4; @@ -664,7 +662,7 @@ ldp_msg_print(register const u_char *pptr) { } return pdu_len+4; trunc: - printf("\n\t\t packet exceeded snapshot"); + ND_PRINT((ndo, "\n\t\t packet exceeded snapshot")); return 0; } diff --git a/print-lwapp.c b/print-lwapp.c index eed9cdd8..2b942bce 100644 --- a/print-lwapp.c +++ b/print-lwapp.c @@ -17,16 +17,13 @@ * Original code by Carles Kishimoto <carles.kishimoto@gmail.com> */ +#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" @@ -164,7 +161,8 @@ struct lwapp_message_header { }; void -lwapp_control_print(const u_char *pptr, u_int len, int has_ap_ident) { +lwapp_control_print(netdissect_options *ndo, + const u_char *pptr, u_int len, int has_ap_ident) { const struct lwapp_transport_header *lwapp_trans_header; const struct lwapp_control_header *lwapp_control_header; @@ -176,47 +174,46 @@ lwapp_control_print(const u_char *pptr, u_int len, int has_ap_ident) { if (has_ap_ident) { /* check if enough bytes for AP identity */ - if (!TTEST2(*tptr, 6)) + if (!ND_TTEST2(*tptr, 6)) goto trunc; lwapp_trans_header = (const struct lwapp_transport_header *)(pptr+6); } else { lwapp_trans_header = (const struct lwapp_transport_header *)pptr; } - TCHECK(*lwapp_trans_header); + ND_TCHECK(*lwapp_trans_header); /* * Sanity checking of the header. */ if (LWAPP_EXTRACT_VERSION(lwapp_trans_header->version) != LWAPP_VERSION) { - printf("LWAPP version %u packet not supported", - LWAPP_EXTRACT_VERSION(lwapp_trans_header->version)); + ND_PRINT((ndo, "LWAPP version %u packet not supported", + LWAPP_EXTRACT_VERSION(lwapp_trans_header->version))); return; } /* non-verbose */ - if (vflag < 1) { - printf("LWAPPv%u, %s frame, Flags [%s], length %u", + if (ndo->ndo_vflag < 1) { + ND_PRINT((ndo, "LWAPPv%u, %s frame, Flags [%s], length %u", LWAPP_EXTRACT_VERSION(lwapp_trans_header->version), LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data", bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07), - len); + len)); return; } /* ok they seem to want to know everything - lets fully decode it */ tlen=EXTRACT_16BITS(lwapp_trans_header->length); - printf("LWAPPv%u, %s frame, Radio-id %u, Flags [%s], Frag-id %u, length %u", + ND_PRINT((ndo, "LWAPPv%u, %s frame, Radio-id %u, Flags [%s], Frag-id %u, length %u", LWAPP_EXTRACT_VERSION(lwapp_trans_header->version), LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data", LWAPP_EXTRACT_RID(lwapp_trans_header->version), bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07), lwapp_trans_header->frag_id, - tlen); + tlen)); if (has_ap_ident) { - printf("\n\tAP identity: %s", - etheraddr_string(tptr)); + ND_PRINT((ndo, "\n\tAP identity: %s", etheraddr_string(tptr))); tptr+=sizeof(const struct lwapp_transport_header)+6; } else { tptr+=sizeof(const struct lwapp_transport_header); @@ -225,22 +222,22 @@ lwapp_control_print(const u_char *pptr, u_int len, int has_ap_ident) { while(tlen>0) { /* did we capture enough for fully decoding the object header ? */ - if (!TTEST2(*tptr, sizeof(struct lwapp_control_header))) + if (!ND_TTEST2(*tptr, sizeof(struct lwapp_control_header))) goto trunc; lwapp_control_header = (const struct lwapp_control_header *)tptr; msg_tlen = EXTRACT_16BITS(lwapp_control_header->len); /* print message header */ - printf("\n\t Msg type: %s (%u), Seqnum: %u, Msg len: %d, Session: 0x%08x", + ND_PRINT((ndo, "\n\t Msg type: %s (%u), Seqnum: %u, Msg len: %d, Session: 0x%08x", tok2str(lwapp_msg_type_values,"Unknown",lwapp_control_header->msg_type), lwapp_control_header->msg_type, lwapp_control_header->seq_num, msg_tlen, - EXTRACT_32BITS(lwapp_control_header->session_id)); + EXTRACT_32BITS(lwapp_control_header->session_id))); /* did we capture enough for fully decoding the message */ - if (!TTEST2(*tptr, msg_tlen)) + if (!ND_TTEST2(*tptr, msg_tlen)) goto trunc; /* XXX - Decode sub messages for each message */ @@ -286,11 +283,12 @@ lwapp_control_print(const u_char *pptr, u_int len, int has_ap_ident) { return; trunc: - printf("\n\t\t packet exceeded snapshot"); + ND_PRINT((ndo, "\n\t\t packet exceeded snapshot")); } void -lwapp_data_print(const u_char *pptr, u_int len) { +lwapp_data_print(netdissect_options *ndo, + const u_char *pptr, u_int len) { const struct lwapp_transport_header *lwapp_trans_header; const u_char *tptr; @@ -299,51 +297,51 @@ lwapp_data_print(const u_char *pptr, u_int len) { tptr=pptr; /* check if enough bytes for AP identity */ - if (!TTEST2(*tptr, 6)) + if (!ND_TTEST2(*tptr, 6)) goto trunc; lwapp_trans_header = (const struct lwapp_transport_header *)pptr; - TCHECK(*lwapp_trans_header); + ND_TCHECK(*lwapp_trans_header); /* * Sanity checking of the header. */ if (LWAPP_EXTRACT_VERSION(lwapp_trans_header->version) != LWAPP_VERSION) { - printf("LWAPP version %u packet not supported", - LWAPP_EXTRACT_VERSION(lwapp_trans_header->version)); + ND_PRINT((ndo, "LWAPP version %u packet not supported", + LWAPP_EXTRACT_VERSION(lwapp_trans_header->version))); return; } /* non-verbose */ - if (vflag < 1) { - printf("LWAPPv%u, %s frame, Flags [%s], length %u", + if (ndo->ndo_vflag < 1) { + ND_PRINT((ndo, "LWAPPv%u, %s frame, Flags [%s], length %u", LWAPP_EXTRACT_VERSION(lwapp_trans_header->version), LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data", bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07), - len); + len)); return; } /* ok they seem to want to know everything - lets fully decode it */ tlen=EXTRACT_16BITS(lwapp_trans_header->length); - printf("LWAPPv%u, %s frame, Radio-id %u, Flags [%s], Frag-id %u, length %u", + ND_PRINT((ndo, "LWAPPv%u, %s frame, Radio-id %u, Flags [%s], Frag-id %u, length %u", LWAPP_EXTRACT_VERSION(lwapp_trans_header->version), LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data", LWAPP_EXTRACT_RID(lwapp_trans_header->version), bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07), lwapp_trans_header->frag_id, - tlen); + tlen)); tptr+=sizeof(const struct lwapp_transport_header); tlen-=sizeof(const struct lwapp_transport_header); /* FIX - An IEEE 802.11 frame follows - hexdump for now */ - print_unknown_data(gndo,tptr, "\n\t", tlen); + print_unknown_data(ndo, tptr, "\n\t", tlen); return; trunc: - printf("\n\t\t packet exceeded snapshot"); + ND_PRINT((ndo, "\n\t\t packet exceeded snapshot")); } /* diff --git a/print-mobility.c b/print-mobility.c index d4dfcc0c..7abb9224 100644 --- a/print-mobility.c +++ b/print-mobility.c @@ -27,6 +27,7 @@ * SUCH DAMAGE. */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -34,10 +35,7 @@ #ifdef INET6 #include <tcpdump-stdinc.h> -#include <stdio.h> - #include "ip6.h" - #include "interface.h" #include "addrtoname.h" #include "extract.h" /* must come after interface.h */ @@ -91,7 +89,8 @@ struct ip6_mobility { #define IP6MOPT_AUTH_MINLEN 12 static void -mobility_opt_print(const u_char *bp, const unsigned len) +mobility_opt_print(netdissect_options *ndo, + const u_char *bp, const unsigned len) { unsigned i, optlen; @@ -109,67 +108,68 @@ mobility_opt_print(const u_char *bp, const unsigned len) switch (bp[i]) { case IP6MOPT_PAD1: - printf("(pad1)"); + ND_PRINT((ndo, "(pad1)")); break; case IP6MOPT_PADN: if (len - i < IP6MOPT_MINLEN) { - printf("(padn: trunc)"); + ND_PRINT((ndo, "(padn: trunc)")); goto trunc; } - printf("(padn)"); + ND_PRINT((ndo, "(padn)")); break; case IP6MOPT_REFRESH: if (len - i < IP6MOPT_REFRESH_MINLEN) { - printf("(refresh: trunc)"); + ND_PRINT((ndo, "(refresh: trunc)")); goto trunc; } /* units of 4 secs */ - printf("(refresh: %u)", - EXTRACT_16BITS(&bp[i+2]) << 2); + ND_PRINT((ndo, "(refresh: %u)", + EXTRACT_16BITS(&bp[i+2]) << 2)); break; case IP6MOPT_ALTCOA: if (len - i < IP6MOPT_ALTCOA_MINLEN) { - printf("(altcoa: trunc)"); + ND_PRINT((ndo, "(altcoa: trunc)")); goto trunc; } - printf("(alt-CoA: %s)", ip6addr_string(&bp[i+2])); + ND_PRINT((ndo, "(alt-CoA: %s)", ip6addr_string(&bp[i+2]))); break; case IP6MOPT_NONCEID: if (len - i < IP6MOPT_NONCEID_MINLEN) { - printf("(ni: trunc)"); + ND_PRINT((ndo, "(ni: trunc)")); goto trunc; } - printf("(ni: ho=0x%04x co=0x%04x)", + ND_PRINT((ndo, "(ni: ho=0x%04x co=0x%04x)", EXTRACT_16BITS(&bp[i+2]), - EXTRACT_16BITS(&bp[i+4])); + EXTRACT_16BITS(&bp[i+4]))); break; case IP6MOPT_AUTH: if (len - i < IP6MOPT_AUTH_MINLEN) { - printf("(auth: trunc)"); + ND_PRINT((ndo, "(auth: trunc)")); goto trunc; } - printf("(auth)"); + ND_PRINT((ndo, "(auth)")); break; default: if (len - i < IP6MOPT_MINLEN) { - printf("(sopt_type %u: trunc)", bp[i]); + ND_PRINT((ndo, "(sopt_type %u: trunc)", bp[i])); goto trunc; } - printf("(type-0x%02x: len=%u)", bp[i], bp[i + 1]); + ND_PRINT((ndo, "(type-0x%02x: len=%u)", bp[i], bp[i + 1])); break; } } return; trunc: - printf("[trunc] "); + ND_PRINT((ndo, "[trunc] ")); } /* * Mobility Header */ int -mobility_print(const u_char *bp, const u_char *bp2 _U_) +mobility_print(netdissect_options *ndo, + const u_char *bp, const u_char *bp2 _U_) { const struct ip6_mobility *mh; const u_char *ep; @@ -179,9 +179,9 @@ mobility_print(const u_char *bp, const u_char *bp2 _U_) mh = (struct ip6_mobility *)bp; /* 'ep' points to the end of available data. */ - ep = snapend; + ep = ndo->ndo_snapend; - if (!TTEST(mh->ip6m_len)) { + if (!ND_TTEST(mh->ip6m_len)) { /* * There's not enough captured data to include the * mobility header length. @@ -201,114 +201,114 @@ mobility_print(const u_char *bp, const u_char *bp2 _U_) /* XXX ip6m_cksum */ - TCHECK(mh->ip6m_type); + ND_TCHECK(mh->ip6m_type); type = mh->ip6m_type; switch (type) { case IP6M_BINDING_REQUEST: - printf("mobility: BRR"); + ND_PRINT((ndo, "mobility: BRR")); hlen = IP6M_MINLEN; break; case IP6M_HOME_TEST_INIT: case IP6M_CAREOF_TEST_INIT: - printf("mobility: %soTI", - type == IP6M_HOME_TEST_INIT ? "H" : "C"); + ND_PRINT((ndo, "mobility: %soTI", + type == IP6M_HOME_TEST_INIT ? "H" : "C")); hlen = IP6M_MINLEN; - if (vflag) { - TCHECK2(*mh, hlen + 8); - printf(" %s Init Cookie=%08x:%08x", + if (ndo->ndo_vflag) { + ND_TCHECK2(*mh, hlen + 8); + ND_PRINT((ndo, " %s Init Cookie=%08x:%08x", type == IP6M_HOME_TEST_INIT ? "Home" : "Care-of", EXTRACT_32BITS(&bp[hlen]), - EXTRACT_32BITS(&bp[hlen + 4])); + EXTRACT_32BITS(&bp[hlen + 4]))); } hlen += 8; break; case IP6M_HOME_TEST: case IP6M_CAREOF_TEST: - printf("mobility: %soT", - type == IP6M_HOME_TEST ? "H" : "C"); - TCHECK(mh->ip6m_data16[0]); - printf(" nonce id=0x%x", EXTRACT_16BITS(&mh->ip6m_data16[0])); + ND_PRINT((ndo, "mobility: %soT", + type == IP6M_HOME_TEST ? "H" : "C")); + ND_TCHECK(mh->ip6m_data16[0]); + ND_PRINT((ndo, " nonce id=0x%x", EXTRACT_16BITS(&mh->ip6m_data16[0]))); hlen = IP6M_MINLEN; - if (vflag) { - TCHECK2(*mh, hlen + 8); - printf(" %s Init Cookie=%08x:%08x", + if (ndo->ndo_vflag) { + ND_TCHECK2(*mh, hlen + 8); + ND_PRINT((ndo, " %s Init Cookie=%08x:%08x", type == IP6M_HOME_TEST ? "Home" : "Care-of", EXTRACT_32BITS(&bp[hlen]), - EXTRACT_32BITS(&bp[hlen + 4])); + EXTRACT_32BITS(&bp[hlen + 4]))); } hlen += 8; - if (vflag) { - TCHECK2(*mh, hlen + 8); - printf(" %s Keygen Token=%08x:%08x", + if (ndo->ndo_vflag) { + ND_TCHECK2(*mh, hlen + 8); + ND_PRINT((ndo, " %s Keygen Token=%08x:%08x", type == IP6M_HOME_TEST ? "Home" : "Care-of", EXTRACT_32BITS(&bp[hlen]), - EXTRACT_32BITS(&bp[hlen + 4])); + EXTRACT_32BITS(&bp[hlen + 4]))); } hlen += 8; break; case IP6M_BINDING_UPDATE: - printf("mobility: BU"); - TCHECK(mh->ip6m_data16[0]); - printf(" seq#=%u", EXTRACT_16BITS(&mh->ip6m_data16[0])); + ND_PRINT((ndo, "mobility: BU")); + ND_TCHECK(mh->ip6m_data16[0]); + ND_PRINT((ndo, " seq#=%u", EXTRACT_16BITS(&mh->ip6m_data16[0]))); hlen = IP6M_MINLEN; - TCHECK2(*mh, hlen + 1); + ND_TCHECK2(*mh, hlen + 1); if (bp[hlen] & 0xf0) - printf(" "); + ND_PRINT((ndo, " ")); if (bp[hlen] & 0x80) - printf("A"); + ND_PRINT((ndo, "A")); if (bp[hlen] & 0x40) - printf("H"); + ND_PRINT((ndo, "H")); if (bp[hlen] & 0x20) - printf("L"); + ND_PRINT((ndo, "L")); if (bp[hlen] & 0x10) - printf("K"); + ND_PRINT((ndo, "K")); /* Reserved (4bits) */ hlen += 1; /* Reserved (8bits) */ hlen += 1; - TCHECK2(*mh, hlen + 2); + ND_TCHECK2(*mh, hlen + 2); /* units of 4 secs */ - printf(" lifetime=%u", EXTRACT_16BITS(&bp[hlen]) << 2); + ND_PRINT((ndo, " lifetime=%u", EXTRACT_16BITS(&bp[hlen]) << 2)); hlen += 2; break; case IP6M_BINDING_ACK: - printf("mobility: BA"); - TCHECK(mh->ip6m_data8[0]); - printf(" status=%u", mh->ip6m_data8[0]); + ND_PRINT((ndo, "mobility: BA")); + ND_TCHECK(mh->ip6m_data8[0]); + ND_PRINT((ndo, " status=%u", mh->ip6m_data8[0])); if (mh->ip6m_data8[1] & 0x80) - printf(" K"); + ND_PRINT((ndo, " K")); /* Reserved (7bits) */ hlen = IP6M_MINLEN; - TCHECK2(*mh, hlen + 2); - printf(" seq#=%u", EXTRACT_16BITS(&bp[hlen])); + ND_TCHECK2(*mh, hlen + 2); + ND_PRINT((ndo, " seq#=%u", EXTRACT_16BITS(&bp[hlen]))); hlen += 2; - TCHECK2(*mh, hlen + 2); + ND_TCHECK2(*mh, hlen + 2); /* units of 4 secs */ - printf(" lifetime=%u", EXTRACT_16BITS(&bp[hlen]) << 2); + ND_PRINT((ndo, " lifetime=%u", EXTRACT_16BITS(&bp[hlen]) << 2)); hlen += 2; break; case IP6M_BINDING_ERROR: - printf("mobility: BE"); - TCHECK(mh->ip6m_data8[0]); - printf(" status=%u", mh->ip6m_data8[0]); + ND_PRINT((ndo, "mobility: BE")); + ND_TCHECK(mh->ip6m_data8[0]); + ND_PRINT((ndo, " status=%u", mh->ip6m_data8[0])); /* Reserved */ hlen = IP6M_MINLEN; - TCHECK2(*mh, hlen + 16); - printf(" homeaddr %s", ip6addr_string(&bp[hlen])); + ND_TCHECK2(*mh, hlen + 16); + ND_PRINT((ndo, " homeaddr %s", ip6addr_string(&bp[hlen]))); hlen += 16; break; default: - printf("mobility: type-#%u len=%u", type, mh->ip6m_len); + ND_PRINT((ndo, "mobility: type-#%u len=%u", type, mh->ip6m_len)); return(mhlen); break; } - if (vflag) - mobility_opt_print(&bp[hlen], mhlen - hlen); + if (ndo->ndo_vflag) + mobility_opt_print(ndo, &bp[hlen], mhlen - hlen); return(mhlen); trunc: - fputs("[|MOBILITY]", stdout); + ND_PRINT((ndo, "[|MOBILITY]")); return(mhlen); } #endif /* INET6 */ diff --git a/print-pgm.c b/print-pgm.c index 20de180f..ea9204f4 100644 --- a/print-pgm.c +++ b/print-pgm.c @@ -13,16 +13,13 @@ * Original code by Andy Heffernan (ahh@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" @@ -150,8 +147,9 @@ typedef enum _pgm_type { #endif void -pgm_print(register const u_char *bp, register u_int length, - register const u_char *bp2) +pgm_print(netdissect_options *ndo, + register const u_char *bp, register u_int length, + register const u_char *bp2) { register const struct pgm_header *pgm; register const struct ip *ip; @@ -178,24 +176,24 @@ pgm_print(register const u_char *bp, register u_int length, ip6 = NULL; #else /* INET6 */ if (IP_V(ip) == 6) { - (void)printf("Can't handle IPv6"); + ND_PRINT((ndo, "Can't handle IPv6")); return; } #endif /* INET6 */ ch = '\0'; - if (!TTEST(pgm->pgm_dport)) { + if (!ND_TTEST(pgm->pgm_dport)) { #ifdef INET6 if (ip6) { - (void)printf("%s > %s: [|pgm]", + ND_PRINT((ndo, "%s > %s: [|pgm]", ip6addr_string(&ip6->ip6_src), - ip6addr_string(&ip6->ip6_dst)); + ip6addr_string(&ip6->ip6_dst))); return; } else #endif /* INET6 */ { - (void)printf("%s > %s: [|pgm]", + ND_PRINT((ndo, "%s > %s: [|pgm]", ipaddr_string(&ip->ip_src), - ipaddr_string(&ip->ip_dst)); + ipaddr_string(&ip->ip_dst))); return; } } @@ -206,50 +204,50 @@ pgm_print(register const u_char *bp, register u_int length, #ifdef INET6 if (ip6) { if (ip6->ip6_nxt == IPPROTO_PGM) { - (void)printf("%s.%s > %s.%s: ", + ND_PRINT((ndo, "%s.%s > %s.%s: ", ip6addr_string(&ip6->ip6_src), tcpport_string(sport), ip6addr_string(&ip6->ip6_dst), - tcpport_string(dport)); + tcpport_string(dport))); } else { - (void)printf("%s > %s: ", - tcpport_string(sport), tcpport_string(dport)); + ND_PRINT((ndo, "%s > %s: ", + tcpport_string(sport), tcpport_string(dport))); } } else #endif /*INET6*/ { if (ip->ip_p == IPPROTO_PGM) { - (void)printf("%s.%s > %s.%s: ", + ND_PRINT((ndo, "%s.%s > %s.%s: ", ipaddr_string(&ip->ip_src), tcpport_string(sport), ipaddr_string(&ip->ip_dst), - tcpport_string(dport)); + tcpport_string(dport))); } else { - (void)printf("%s > %s: ", - tcpport_string(sport), tcpport_string(dport)); + ND_PRINT((ndo, "%s > %s: ", + tcpport_string(sport), tcpport_string(dport))); } } - TCHECK(*pgm); + ND_TCHECK(*pgm); - (void)printf("PGM, length %u", EXTRACT_16BITS(&pgm->pgm_length)); + ND_PRINT((ndo, "PGM, length %u", EXTRACT_16BITS(&pgm->pgm_length))); - if (!vflag) + if (!ndo->ndo_vflag) return; - (void)printf(" 0x%02x%02x%02x%02x%02x%02x ", + ND_PRINT((ndo, " 0x%02x%02x%02x%02x%02x%02x ", pgm->pgm_gsid[0], pgm->pgm_gsid[1], pgm->pgm_gsid[2], pgm->pgm_gsid[3], pgm->pgm_gsid[4], - pgm->pgm_gsid[5]); + pgm->pgm_gsid[5])); switch (pgm->pgm_type) { case PGM_SPM: { struct pgm_spm *spm; spm = (struct pgm_spm *)(pgm + 1); - TCHECK(*spm); + ND_TCHECK(*spm); switch (EXTRACT_16BITS(&spm->pgms_nla_afi)) { case AFI_IP: @@ -267,16 +265,16 @@ pgm_print(register const u_char *bp, register u_int length, break; } bp = (u_char *) (spm + 1); - TCHECK2(*bp, addr_size); + ND_TCHECK2(*bp, addr_size); nla = bp; bp += addr_size; inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf)); - (void)printf("SPM seq %u trail %u lead %u nla %s", + ND_PRINT((ndo, "SPM seq %u trail %u lead %u nla %s", EXTRACT_32BITS(&spm->pgms_seq), EXTRACT_32BITS(&spm->pgms_trailseq), EXTRACT_32BITS(&spm->pgms_leadseq), - nla_buf); + nla_buf)); break; } @@ -284,10 +282,10 @@ pgm_print(register const u_char *bp, register u_int length, struct pgm_poll *poll; poll = (struct pgm_poll *)(pgm + 1); - TCHECK(*poll); - (void)printf("POLL seq %u round %u", + ND_TCHECK(*poll); + ND_PRINT((ndo, "POLL seq %u round %u", EXTRACT_32BITS(&poll->pgmp_seq), - EXTRACT_16BITS(&poll->pgmp_round)); + EXTRACT_16BITS(&poll->pgmp_round))); bp = (u_char *) (poll + 1); break; } @@ -296,7 +294,7 @@ pgm_print(register const u_char *bp, register u_int length, u_int32_t ivl, rnd, mask; polr = (struct pgm_polr *)(pgm + 1); - TCHECK(*polr); + ND_TCHECK(*polr); switch (EXTRACT_16BITS(&polr->pgmp_nla_afi)) { case AFI_IP: @@ -314,37 +312,37 @@ pgm_print(register const u_char *bp, register u_int length, break; } bp = (u_char *) (polr + 1); - TCHECK2(*bp, addr_size); + ND_TCHECK2(*bp, addr_size); nla = bp; bp += addr_size; inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf)); - TCHECK2(*bp, sizeof(u_int32_t)); + ND_TCHECK2(*bp, sizeof(u_int32_t)); ivl = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); - TCHECK2(*bp, sizeof(u_int32_t)); + ND_TCHECK2(*bp, sizeof(u_int32_t)); rnd = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); - TCHECK2(*bp, sizeof(u_int32_t)); + ND_TCHECK2(*bp, sizeof(u_int32_t)); mask = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); - (void)printf("POLR seq %u round %u nla %s ivl %u rnd 0x%08x " + ND_PRINT((ndo, "POLR seq %u round %u nla %s ivl %u rnd 0x%08x " "mask 0x%08x", EXTRACT_32BITS(&polr->pgmp_seq), - EXTRACT_16BITS(&polr->pgmp_round), nla_buf, ivl, rnd, mask); + EXTRACT_16BITS(&polr->pgmp_round), nla_buf, ivl, rnd, mask)); break; } case PGM_ODATA: { struct pgm_data *odata; odata = (struct pgm_data *)(pgm + 1); - TCHECK(*odata); - (void)printf("ODATA trail %u seq %u", + ND_TCHECK(*odata); + ND_PRINT((ndo, "ODATA trail %u seq %u", EXTRACT_32BITS(&odata->pgmd_trailseq), - EXTRACT_32BITS(&odata->pgmd_seq)); + EXTRACT_32BITS(&odata->pgmd_seq))); bp = (u_char *) (odata + 1); break; } @@ -353,10 +351,10 @@ pgm_print(register const u_char *bp, register u_int length, struct pgm_data *rdata; rdata = (struct pgm_data *)(pgm + 1); - TCHECK(*rdata); - (void)printf("RDATA trail %u seq %u", + ND_TCHECK(*rdata); + ND_PRINT((ndo, "RDATA trail %u seq %u", EXTRACT_32BITS(&rdata->pgmd_trailseq), - EXTRACT_32BITS(&rdata->pgmd_seq)); + EXTRACT_32BITS(&rdata->pgmd_seq))); bp = (u_char *) (rdata + 1); break; } @@ -374,7 +372,7 @@ pgm_print(register const u_char *bp, register u_int length, #endif nak = (struct pgm_nak *)(pgm + 1); - TCHECK(*nak); + ND_TCHECK(*nak); /* * Skip past the source, saving info along the way @@ -396,7 +394,7 @@ pgm_print(register const u_char *bp, register u_int length, break; } bp = (u_char *) (nak + 1); - TCHECK2(*bp, addr_size); + ND_TCHECK2(*bp, addr_size); source = bp; bp += addr_size; @@ -420,7 +418,7 @@ pgm_print(register const u_char *bp, register u_int length, break; } bp += (2 * sizeof(u_int16_t)); - TCHECK2(*bp, addr_size); + ND_TCHECK2(*bp, addr_size); group = bp; bp += addr_size; @@ -431,19 +429,19 @@ pgm_print(register const u_char *bp, register u_int length, inet_ntop(group_af, group, group_buf, sizeof(group_buf)); switch (pgm->pgm_type) { case PGM_NAK: - (void)printf("NAK "); + ND_PRINT((ndo, "NAK ")); break; case PGM_NULLNAK: - (void)printf("NNAK "); + ND_PRINT((ndo, "NNAK ")); break; case PGM_NCF: - (void)printf("NCF "); + ND_PRINT((ndo, "NCF ")); break; default: break; } - (void)printf("(%s -> %s), seq %u", - source_buf, group_buf, EXTRACT_32BITS(&nak->pgmn_seq)); + ND_PRINT((ndo, "(%s -> %s), seq %u", + source_buf, group_buf, EXTRACT_32BITS(&nak->pgmn_seq))); break; } @@ -451,19 +449,19 @@ pgm_print(register const u_char *bp, register u_int length, struct pgm_ack *ack; ack = (struct pgm_ack *)(pgm + 1); - TCHECK(*ack); - (void)printf("ACK seq %u", - EXTRACT_32BITS(&ack->pgma_rx_max_seq)); + ND_TCHECK(*ack); + ND_PRINT((ndo, "ACK seq %u", + EXTRACT_32BITS(&ack->pgma_rx_max_seq))); bp = (u_char *) (ack + 1); break; } case PGM_SPMR: - (void)printf("SPMR"); + ND_PRINT((ndo, "SPMR")); break; default: - (void)printf("UNKNOWN type 0x%02x", pgm->pgm_type); + ND_PRINT((ndo, "UNKNOWN type 0x%02x", pgm->pgm_type)); break; } @@ -472,8 +470,8 @@ pgm_print(register const u_char *bp, register u_int length, /* * make sure there's enough for the first option header */ - if (!TTEST2(*bp, PGM_MIN_OPT_LEN)) { - (void)printf("[|OPT]"); + if (!ND_TTEST2(*bp, PGM_MIN_OPT_LEN)) { + ND_PRINT((ndo, "[|OPT]")); return; } @@ -483,58 +481,58 @@ pgm_print(register const u_char *bp, register u_int length, */ opt_type = *bp++; if ((opt_type & PGM_OPT_MASK) != PGM_OPT_LENGTH) { - (void)printf("[First option bad, should be PGM_OPT_LENGTH, is %u]", opt_type & PGM_OPT_MASK); + ND_PRINT((ndo, "[First option bad, should be PGM_OPT_LENGTH, is %u]", opt_type & PGM_OPT_MASK)); return; } opt_len = *bp++; if (opt_len != 4) { - (void)printf("[Bad OPT_LENGTH option, length %u != 4]", opt_len); + ND_PRINT((ndo, "[Bad OPT_LENGTH option, length %u != 4]", opt_len)); return; } opts_len = EXTRACT_16BITS(bp); if (opts_len < 4) { - (void)printf("[Bad total option length %u < 4]", opts_len); + ND_PRINT((ndo, "[Bad total option length %u < 4]", opts_len)); return; } bp += sizeof(u_int16_t); - (void)printf(" OPTS LEN %d", opts_len); + ND_PRINT((ndo, " OPTS LEN %d", opts_len)); opts_len -= 4; while (opts_len) { if (opts_len < PGM_MIN_OPT_LEN) { - (void)printf("[Total option length leaves no room for final option]"); + ND_PRINT((ndo, "[Total option length leaves no room for final option]")); return; } opt_type = *bp++; opt_len = *bp++; if (opt_len < PGM_MIN_OPT_LEN) { - (void)printf("[Bad option, length %u < %u]", opt_len, - PGM_MIN_OPT_LEN); + ND_PRINT((ndo, "[Bad option, length %u < %u]", opt_len, + PGM_MIN_OPT_LEN)); break; } if (opts_len < opt_len) { - (void)printf("[Total option length leaves no room for final option]"); + ND_PRINT((ndo, "[Total option length leaves no room for final option]")); return; } - if (!TTEST2(*bp, opt_len - 2)) { - (void)printf(" [|OPT]"); + if (!ND_TTEST2(*bp, opt_len - 2)) { + ND_PRINT((ndo, " [|OPT]")); return; } switch (opt_type & PGM_OPT_MASK) { case PGM_OPT_LENGTH: if (opt_len != 4) { - (void)printf("[Bad OPT_LENGTH option, length %u != 4]", opt_len); + ND_PRINT((ndo, "[Bad OPT_LENGTH option, length %u != 4]", opt_len)); return; } - (void)printf(" OPTS LEN (extra?) %d", EXTRACT_16BITS(bp)); + ND_PRINT((ndo, " OPTS LEN (extra?) %d", EXTRACT_16BITS(bp))); bp += sizeof(u_int16_t); opts_len -= 4; break; case PGM_OPT_FRAGMENT: if (opt_len != 16) { - (void)printf("[Bad OPT_FRAGMENT option, length %u != 16]", opt_len); + ND_PRINT((ndo, "[Bad OPT_FRAGMENT option, length %u != 16]", opt_len)); return; } bp += 2; @@ -544,21 +542,21 @@ pgm_print(register const u_char *bp, register u_int length, bp += sizeof(u_int32_t); len = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); - (void)printf(" FRAG seq %u off %u len %u", seq, offset, len); + ND_PRINT((ndo, " FRAG seq %u off %u len %u", seq, offset, len)); opts_len -= 16; break; case PGM_OPT_NAK_LIST: bp += 2; opt_len -= sizeof(u_int32_t); /* option header */ - (void)printf(" NAK LIST"); + ND_PRINT((ndo, " NAK LIST")); while (opt_len) { if (opt_len < sizeof(u_int32_t)) { - (void)printf("[Option length not a multiple of 4]"); + ND_PRINT((ndo, "[Option length not a multiple of 4]")); return; } - TCHECK2(*bp, sizeof(u_int32_t)); - (void)printf(" %u", EXTRACT_32BITS(bp)); + ND_TCHECK2(*bp, sizeof(u_int32_t)); + ND_PRINT((ndo, " %u", EXTRACT_32BITS(bp))); bp += sizeof(u_int32_t); opt_len -= sizeof(u_int32_t); opts_len -= sizeof(u_int32_t); @@ -567,19 +565,19 @@ pgm_print(register const u_char *bp, register u_int length, case PGM_OPT_JOIN: if (opt_len != 8) { - (void)printf("[Bad OPT_JOIN option, length %u != 8]", opt_len); + ND_PRINT((ndo, "[Bad OPT_JOIN option, length %u != 8]", opt_len)); return; } bp += 2; seq = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); - (void)printf(" JOIN %u", seq); + ND_PRINT((ndo, " JOIN %u", seq)); opts_len -= 8; break; case PGM_OPT_NAK_BO_IVL: if (opt_len != 12) { - (void)printf("[Bad OPT_NAK_BO_IVL option, length %u != 12]", opt_len); + ND_PRINT((ndo, "[Bad OPT_NAK_BO_IVL option, length %u != 12]", opt_len)); return; } bp += 2; @@ -587,13 +585,13 @@ pgm_print(register const u_char *bp, register u_int length, bp += sizeof(u_int32_t); seq = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); - (void)printf(" BACKOFF ivl %u ivlseq %u", offset, seq); + ND_PRINT((ndo, " BACKOFF ivl %u ivlseq %u", offset, seq)); opts_len -= 12; break; case PGM_OPT_NAK_BO_RNG: if (opt_len != 12) { - (void)printf("[Bad OPT_NAK_BO_RNG option, length %u != 12]", opt_len); + ND_PRINT((ndo, "[Bad OPT_NAK_BO_RNG option, length %u != 12]", opt_len)); return; } bp += 2; @@ -601,7 +599,7 @@ pgm_print(register const u_char *bp, register u_int length, bp += sizeof(u_int32_t); seq = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); - (void)printf(" BACKOFF max %u min %u", offset, seq); + ND_PRINT((ndo, " BACKOFF max %u min %u", offset, seq)); opts_len -= 12; break; @@ -624,113 +622,113 @@ pgm_print(register const u_char *bp, register u_int length, } bp += (2 * sizeof(u_int16_t)); if (opt_len != 4 + addr_size) { - (void)printf("[Bad OPT_REDIRECT option, length %u != 4 + address size]", opt_len); + ND_PRINT((ndo, "[Bad OPT_REDIRECT option, length %u != 4 + address size]", opt_len)); return; } - TCHECK2(*bp, addr_size); + ND_TCHECK2(*bp, addr_size); nla = bp; bp += addr_size; inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf)); - (void)printf(" REDIRECT %s", (char *)nla); + ND_PRINT((ndo, " REDIRECT %s", (char *)nla)); opts_len -= 4 + addr_size; break; case PGM_OPT_PARITY_PRM: if (opt_len != 8) { - (void)printf("[Bad OPT_PARITY_PRM option, length %u != 8]", opt_len); + ND_PRINT((ndo, "[Bad OPT_PARITY_PRM option, length %u != 8]", opt_len)); return; } bp += 2; len = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); - (void)printf(" PARITY MAXTGS %u", len); + ND_PRINT((ndo, " PARITY MAXTGS %u", len)); opts_len -= 8; break; case PGM_OPT_PARITY_GRP: if (opt_len != 8) { - (void)printf("[Bad OPT_PARITY_GRP option, length %u != 8]", opt_len); + ND_PRINT((ndo, "[Bad OPT_PARITY_GRP option, length %u != 8]", opt_len)); return; } bp += 2; seq = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); - (void)printf(" PARITY GROUP %u", seq); + ND_PRINT((ndo, " PARITY GROUP %u", seq)); opts_len -= 8; break; case PGM_OPT_CURR_TGSIZE: if (opt_len != 8) { - (void)printf("[Bad OPT_CURR_TGSIZE option, length %u != 8]", opt_len); + ND_PRINT((ndo, "[Bad OPT_CURR_TGSIZE option, length %u != 8]", opt_len)); return; } bp += 2; len = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); - (void)printf(" PARITY ATGS %u", len); + ND_PRINT((ndo, " PARITY ATGS %u", len)); opts_len -= 8; break; case PGM_OPT_NBR_UNREACH: if (opt_len != 4) { - (void)printf("[Bad OPT_NBR_UNREACH option, length %u != 4]", opt_len); + ND_PRINT((ndo, "[Bad OPT_NBR_UNREACH option, length %u != 4]", opt_len)); return; } bp += 2; - (void)printf(" NBR_UNREACH"); + ND_PRINT((ndo, " NBR_UNREACH")); opts_len -= 4; break; case PGM_OPT_PATH_NLA: - (void)printf(" PATH_NLA [%d]", opt_len); + ND_PRINT((ndo, " PATH_NLA [%d]", opt_len)); bp += opt_len; opts_len -= opt_len; break; case PGM_OPT_SYN: if (opt_len != 4) { - (void)printf("[Bad OPT_SYN option, length %u != 4]", opt_len); + ND_PRINT((ndo, "[Bad OPT_SYN option, length %u != 4]", opt_len)); return; } bp += 2; - (void)printf(" SYN"); + ND_PRINT((ndo, " SYN")); opts_len -= 4; break; case PGM_OPT_FIN: if (opt_len != 4) { - (void)printf("[Bad OPT_FIN option, length %u != 4]", opt_len); + ND_PRINT((ndo, "[Bad OPT_FIN option, length %u != 4]", opt_len)); return; } bp += 2; - (void)printf(" FIN"); + ND_PRINT((ndo, " FIN")); opts_len -= 4; break; case PGM_OPT_RST: if (opt_len != 4) { - (void)printf("[Bad OPT_RST option, length %u != 4]", opt_len); + ND_PRINT((ndo, "[Bad OPT_RST option, length %u != 4]", opt_len)); return; } bp += 2; - (void)printf(" RST"); + ND_PRINT((ndo, " RST")); opts_len -= 4; break; case PGM_OPT_CR: - (void)printf(" CR"); + ND_PRINT((ndo, " CR")); bp += opt_len; opts_len -= opt_len; break; case PGM_OPT_CRQST: if (opt_len != 4) { - (void)printf("[Bad OPT_CRQST option, length %u != 4]", opt_len); + ND_PRINT((ndo, "[Bad OPT_CRQST option, length %u != 4]", opt_len)); return; } bp += 2; - (void)printf(" CRQST"); + ND_PRINT((ndo, " CRQST")); opts_len -= 4; break; @@ -755,15 +753,15 @@ pgm_print(register const u_char *bp, register u_int length, } bp += (2 * sizeof(u_int16_t)); if (opt_len != 12 + addr_size) { - (void)printf("[Bad OPT_PGMCC_DATA option, length %u != 12 + address size]", opt_len); + ND_PRINT((ndo, "[Bad OPT_PGMCC_DATA option, length %u != 12 + address size]", opt_len)); return; } - TCHECK2(*bp, addr_size); + ND_TCHECK2(*bp, addr_size); nla = bp; bp += addr_size; inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf)); - (void)printf(" PGMCC DATA %u %s", offset, (char*)nla); + ND_PRINT((ndo, " PGMCC DATA %u %s", offset, (char*)nla)); opts_len -= 16; break; @@ -788,20 +786,20 @@ pgm_print(register const u_char *bp, register u_int length, } bp += (2 * sizeof(u_int16_t)); if (opt_len != 12 + addr_size) { - (void)printf("[Bad OPT_PGMCC_FEEDBACK option, length %u != 12 + address size]", opt_len); + ND_PRINT((ndo, "[Bad OPT_PGMCC_FEEDBACK option, length %u != 12 + address size]", opt_len)); return; } - TCHECK2(*bp, addr_size); + ND_TCHECK2(*bp, addr_size); nla = bp; bp += addr_size; inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf)); - (void)printf(" PGMCC FEEDBACK %u %s", offset, (char*)nla); + ND_PRINT((ndo, " PGMCC FEEDBACK %u %s", offset, (char*)nla)); opts_len -= 16; break; default: - (void)printf(" OPT_%02X [%d] ", opt_type, opt_len); + ND_PRINT((ndo, " OPT_%02X [%d] ", opt_type, opt_len)); bp += opt_len; opts_len -= opt_len; break; @@ -812,15 +810,15 @@ pgm_print(register const u_char *bp, register u_int length, } } - (void)printf(" [%u]", length); - if (packettype == PT_PGM_ZMTP1 && + ND_PRINT((ndo, " [%u]", length)); + if (ndo->ndo_packettype == PT_PGM_ZMTP1 && (pgm->pgm_type == PGM_ODATA || pgm->pgm_type == PGM_RDATA)) - zmtp1_print_datagram(gndo, bp, EXTRACT_16BITS(&pgm->pgm_length)); + zmtp1_print_datagram(ndo, bp, EXTRACT_16BITS(&pgm->pgm_length)); return; trunc: - fputs("[|pgm]", stdout); + ND_PRINT((ndo, "[|pgm]")); if (ch != '\0') - putchar('>'); + ND_PRINT((ndo, ">")); } diff --git a/print-pptp.c b/print-pptp.c index 6ec38f93..eae6bde3 100644 --- a/print-pptp.c +++ b/print-pptp.c @@ -21,14 +21,13 @@ * PPTP support contributed by Motonori Shindo (mshindo@mshindo.net) */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <tcpdump-stdinc.h> -#include <stdio.h> - #include "interface.h" #include "extract.h" @@ -266,217 +265,236 @@ struct pptp_msg_sli { /******************************************/ /* In these attribute-specific print-out functions, it't not necessary - to do TCHECK because they are already checked in the caller of + to do ND_TCHECK because they are already checked in the caller of these functions. */ static void -pptp_bearer_cap_print(const u_int32_t *bearer_cap) +pptp_bearer_cap_print(netdissect_options *ndo, + const u_int32_t *bearer_cap) { - printf(" BEARER_CAP("); + ND_PRINT((ndo, " BEARER_CAP(")); if (EXTRACT_32BITS(bearer_cap) & PPTP_BEARER_CAP_DIGITAL_MASK) { - printf("D"); + ND_PRINT((ndo, "D")); } if (EXTRACT_32BITS(bearer_cap) & PPTP_BEARER_CAP_ANALOG_MASK) { - printf("A"); + ND_PRINT((ndo, "A")); } - printf(")"); + ND_PRINT((ndo, ")")); } static void -pptp_bearer_type_print(const u_int32_t *bearer_type) +pptp_bearer_type_print(netdissect_options *ndo, + const u_int32_t *bearer_type) { - printf(" BEARER_TYPE("); + ND_PRINT((ndo, " BEARER_TYPE(")); switch (EXTRACT_32BITS(bearer_type)) { case 1: - printf("A"); /* Analog */ + ND_PRINT((ndo, "A")); /* Analog */ break; case 2: - printf("D"); /* Digital */ + ND_PRINT((ndo, "D")); /* Digital */ break; case 3: - printf("Any"); + ND_PRINT((ndo, "Any")); break; default: - printf("?"); + ND_PRINT((ndo, "?")); break; } - printf(")"); + ND_PRINT((ndo, ")")); } static void -pptp_call_id_print(const u_int16_t *call_id) +pptp_call_id_print(netdissect_options *ndo, + const u_int16_t *call_id) { - printf(" CALL_ID(%u)", EXTRACT_16BITS(call_id)); + ND_PRINT((ndo, " CALL_ID(%u)", EXTRACT_16BITS(call_id))); } static void -pptp_call_ser_print(const u_int16_t *call_ser) +pptp_call_ser_print(netdissect_options *ndo, + const u_int16_t *call_ser) { - printf(" CALL_SER_NUM(%u)", EXTRACT_16BITS(call_ser)); + ND_PRINT((ndo, " CALL_SER_NUM(%u)", EXTRACT_16BITS(call_ser))); } static void -pptp_cause_code_print(const u_int16_t *cause_code) +pptp_cause_code_print(netdissect_options *ndo, + const u_int16_t *cause_code) { - printf(" CAUSE_CODE(%u)", EXTRACT_16BITS(cause_code)); + ND_PRINT((ndo, " CAUSE_CODE(%u)", EXTRACT_16BITS(cause_code))); } static void -pptp_conn_speed_print(const u_int32_t *conn_speed) +pptp_conn_speed_print(netdissect_options *ndo, + const u_int32_t *conn_speed) { - printf(" CONN_SPEED(%u)", EXTRACT_32BITS(conn_speed)); + ND_PRINT((ndo, " CONN_SPEED(%u)", EXTRACT_32BITS(conn_speed))); } static void -pptp_err_code_print(const u_int8_t *err_code) +pptp_err_code_print(netdissect_options *ndo, + const u_int8_t *err_code) { - printf(" ERR_CODE(%u", *err_code); - if (vflag) { + ND_PRINT((ndo, " ERR_CODE(%u", *err_code)); + if (ndo->ndo_vflag) { switch (*err_code) { case 0: - printf(":None"); + ND_PRINT((ndo, ":None")); break; case 1: - printf(":Not-Connected"); + ND_PRINT((ndo, ":Not-Connected")); break; case 2: - printf(":Bad-Format"); + ND_PRINT((ndo, ":Bad-Format")); break; case 3: - printf(":Bad-Valude"); + ND_PRINT((ndo, ":Bad-Valude")); break; case 4: - printf(":No-Resource"); + ND_PRINT((ndo, ":No-Resource")); break; case 5: - printf(":Bad-Call-ID"); + ND_PRINT((ndo, ":Bad-Call-ID")); break; case 6: - printf(":PAC-Error"); + ND_PRINT((ndo, ":PAC-Error")); break; default: - printf(":?"); + ND_PRINT((ndo, ":?")); break; } } - printf(")"); + ND_PRINT((ndo, ")")); } static void -pptp_firm_rev_print(const u_int16_t *firm_rev) +pptp_firm_rev_print(netdissect_options *ndo, + const u_int16_t *firm_rev) { - printf(" FIRM_REV(%u)", EXTRACT_16BITS(firm_rev)); + ND_PRINT((ndo, " FIRM_REV(%u)", EXTRACT_16BITS(firm_rev))); } static void -pptp_framing_cap_print(const u_int32_t *framing_cap) +pptp_framing_cap_print(netdissect_options *ndo, + const u_int32_t *framing_cap) { - printf(" FRAME_CAP("); + ND_PRINT((ndo, " FRAME_CAP(")); if (EXTRACT_32BITS(framing_cap) & PPTP_FRAMING_CAP_ASYNC_MASK) { - printf("A"); /* Async */ + ND_PRINT((ndo, "A")); /* Async */ } if (EXTRACT_32BITS(framing_cap) & PPTP_FRAMING_CAP_SYNC_MASK) { - printf("S"); /* Sync */ + ND_PRINT((ndo, "S")); /* Sync */ } - printf(")"); + ND_PRINT((ndo, ")")); } static void -pptp_framing_type_print(const u_int32_t *framing_type) +pptp_framing_type_print(netdissect_options *ndo, + const u_int32_t *framing_type) { - printf(" FRAME_TYPE("); + ND_PRINT((ndo, " FRAME_TYPE(")); switch (EXTRACT_32BITS(framing_type)) { case 1: - printf("A"); /* Async */ + ND_PRINT((ndo, "A")); /* Async */ break; case 2: - printf("S"); /* Sync */ + ND_PRINT((ndo, "S")); /* Sync */ break; case 3: - printf("E"); /* Either */ + ND_PRINT((ndo, "E")); /* Either */ break; default: - printf("?"); + ND_PRINT((ndo, "?")); break; } - printf(")"); + ND_PRINT((ndo, ")")); } static void -pptp_hostname_print(const u_char *hostname) +pptp_hostname_print(netdissect_options *ndo, + const u_char *hostname) { - printf(" HOSTNAME(%.64s)", hostname); + ND_PRINT((ndo, " HOSTNAME(%.64s)", hostname)); } static void -pptp_id_print(const u_int32_t *id) +pptp_id_print(netdissect_options *ndo, + const u_int32_t *id) { - printf(" ID(%u)", EXTRACT_32BITS(id)); + ND_PRINT((ndo, " ID(%u)", EXTRACT_32BITS(id))); } static void -pptp_max_channel_print(const u_int16_t *max_channel) +pptp_max_channel_print(netdissect_options *ndo, + const u_int16_t *max_channel) { - printf(" MAX_CHAN(%u)", EXTRACT_16BITS(max_channel)); + ND_PRINT((ndo, " MAX_CHAN(%u)", EXTRACT_16BITS(max_channel))); } static void -pptp_peer_call_id_print(const u_int16_t *peer_call_id) +pptp_peer_call_id_print(netdissect_options *ndo, + const u_int16_t *peer_call_id) { - printf(" PEER_CALL_ID(%u)", EXTRACT_16BITS(peer_call_id)); + ND_PRINT((ndo, " PEER_CALL_ID(%u)", EXTRACT_16BITS(peer_call_id))); } static void -pptp_phy_chan_id_print(const u_int32_t *phy_chan_id) +pptp_phy_chan_id_print(netdissect_options *ndo, + const u_int32_t *phy_chan_id) { - printf(" PHY_CHAN_ID(%u)", EXTRACT_32BITS(phy_chan_id)); + ND_PRINT((ndo, " PHY_CHAN_ID(%u)", EXTRACT_32BITS(phy_chan_id))); } static void -pptp_pkt_proc_delay_print(const u_int16_t *pkt_proc_delay) +pptp_pkt_proc_delay_print(netdissect_options *ndo, + const u_int16_t *pkt_proc_delay) { - printf(" PROC_DELAY(%u)", EXTRACT_16BITS(pkt_proc_delay)); + ND_PRINT((ndo, " PROC_DELAY(%u)", EXTRACT_16BITS(pkt_proc_delay))); } static void -pptp_proto_ver_print(const u_int16_t *proto_ver) +pptp_proto_ver_print(netdissect_options *ndo, + const u_int16_t *proto_ver) { - printf(" PROTO_VER(%u.%u)", /* Version.Revision */ + ND_PRINT((ndo, " PROTO_VER(%u.%u)", /* Version.Revision */ EXTRACT_16BITS(proto_ver) >> 8, - EXTRACT_16BITS(proto_ver) & 0xff); + EXTRACT_16BITS(proto_ver) & 0xff)); } static void -pptp_recv_winsiz_print(const u_int16_t *recv_winsiz) +pptp_recv_winsiz_print(netdissect_options *ndo, + const u_int16_t *recv_winsiz) { - printf(" RECV_WIN(%u)", EXTRACT_16BITS(recv_winsiz)); + ND_PRINT((ndo, " RECV_WIN(%u)", EXTRACT_16BITS(recv_winsiz))); } static void -pptp_result_code_print(const u_int8_t *result_code, int ctrl_msg_type) +pptp_result_code_print(netdissect_options *ndo, + const u_int8_t *result_code, int ctrl_msg_type) { - printf(" RESULT_CODE(%u", *result_code); - if (vflag) { + ND_PRINT((ndo, " RESULT_CODE(%u", *result_code)); + if (ndo->ndo_vflag) { switch (ctrl_msg_type) { case PPTP_CTRL_MSG_TYPE_SCCRP: switch (*result_code) { case 1: - printf(":Successful channel establishment"); + ND_PRINT((ndo, ":Successful channel establishment")); break; case 2: - printf(":General error"); + ND_PRINT((ndo, ":General error")); break; case 3: - printf(":Command channel already exists"); + ND_PRINT((ndo, ":Command channel already exists")); break; case 4: - printf(":Requester is not authorized to establish a command channel"); + ND_PRINT((ndo, ":Requester is not authorized to establish a command channel")); break; case 5: - printf(":The protocol version of the requester is not supported"); + ND_PRINT((ndo, ":The protocol version of the requester is not supported")); break; default: - printf(":?"); + ND_PRINT((ndo, ":?")); break; } break; @@ -484,76 +502,76 @@ pptp_result_code_print(const u_int8_t *result_code, int ctrl_msg_type) case PPTP_CTRL_MSG_TYPE_ECHORP: switch (*result_code) { case 1: - printf(":OK"); + ND_PRINT((ndo, ":OK")); break; case 2: - printf(":General Error"); + ND_PRINT((ndo, ":General Error")); break; default: - printf(":?"); + ND_PRINT((ndo, ":?")); break; } break; case PPTP_CTRL_MSG_TYPE_OCRP: switch (*result_code) { case 1: - printf(":Connected"); + ND_PRINT((ndo, ":Connected")); break; case 2: - printf(":General Error"); + ND_PRINT((ndo, ":General Error")); break; case 3: - printf(":No Carrier"); + ND_PRINT((ndo, ":No Carrier")); break; case 4: - printf(":Busy"); + ND_PRINT((ndo, ":Busy")); break; case 5: - printf(":No Dial Tone"); + ND_PRINT((ndo, ":No Dial Tone")); break; case 6: - printf(":Time-out"); + ND_PRINT((ndo, ":Time-out")); break; case 7: - printf(":Do Not Accept"); + ND_PRINT((ndo, ":Do Not Accept")); break; default: - printf(":?"); + ND_PRINT((ndo, ":?")); break; } break; case PPTP_CTRL_MSG_TYPE_ICRP: switch (*result_code) { case 1: - printf(":Connect"); + ND_PRINT((ndo, ":Connect")); break; case 2: - printf(":General Error"); + ND_PRINT((ndo, ":General Error")); break; case 3: - printf(":Do Not Accept"); + ND_PRINT((ndo, ":Do Not Accept")); break; default: - printf(":?"); + ND_PRINT((ndo, ":?")); break; } break; case PPTP_CTRL_MSG_TYPE_CDN: switch (*result_code) { case 1: - printf(":Lost Carrier"); + ND_PRINT((ndo, ":Lost Carrier")); break; case 2: - printf(":General Error"); + ND_PRINT((ndo, ":General Error")); break; case 3: - printf(":Admin Shutdown"); + ND_PRINT((ndo, ":Admin Shutdown")); break; case 4: - printf(":Request"); + ND_PRINT((ndo, ":Request")); break; default: - printf(":?"); + ND_PRINT((ndo, ":?")); break; } break; @@ -562,486 +580,504 @@ pptp_result_code_print(const u_int8_t *result_code, int ctrl_msg_type) break; } } - printf(")"); + ND_PRINT((ndo, ")")); } static void -pptp_subaddr_print(const u_char *subaddr) +pptp_subaddr_print(netdissect_options *ndo, + const u_char *subaddr) { - printf(" SUB_ADDR(%.64s)", subaddr); + ND_PRINT((ndo, " SUB_ADDR(%.64s)", subaddr)); } static void -pptp_vendor_print(const u_char *vendor) +pptp_vendor_print(netdissect_options *ndo, + const u_char *vendor) { - printf(" VENDOR(%.64s)", vendor); + ND_PRINT((ndo, " VENDOR(%.64s)", vendor)); } /************************************/ /* PPTP message print out functions */ /************************************/ static void -pptp_sccrq_print(const u_char *dat) +pptp_sccrq_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_sccrq *ptr = (struct pptp_msg_sccrq *)dat; - TCHECK(ptr->proto_ver); - pptp_proto_ver_print(&ptr->proto_ver); - TCHECK(ptr->reserved1); - TCHECK(ptr->framing_cap); - pptp_framing_cap_print(&ptr->framing_cap); - TCHECK(ptr->bearer_cap); - pptp_bearer_cap_print(&ptr->bearer_cap); - TCHECK(ptr->max_channel); - pptp_max_channel_print(&ptr->max_channel); - TCHECK(ptr->firm_rev); - pptp_firm_rev_print(&ptr->firm_rev); - TCHECK(ptr->hostname); - pptp_hostname_print(&ptr->hostname[0]); - TCHECK(ptr->vendor); - pptp_vendor_print(&ptr->vendor[0]); + ND_TCHECK(ptr->proto_ver); + pptp_proto_ver_print(ndo, &ptr->proto_ver); + ND_TCHECK(ptr->reserved1); + ND_TCHECK(ptr->framing_cap); + pptp_framing_cap_print(ndo, &ptr->framing_cap); + ND_TCHECK(ptr->bearer_cap); + pptp_bearer_cap_print(ndo, &ptr->bearer_cap); + ND_TCHECK(ptr->max_channel); + pptp_max_channel_print(ndo, &ptr->max_channel); + ND_TCHECK(ptr->firm_rev); + pptp_firm_rev_print(ndo, &ptr->firm_rev); + ND_TCHECK(ptr->hostname); + pptp_hostname_print(ndo, &ptr->hostname[0]); + ND_TCHECK(ptr->vendor); + pptp_vendor_print(ndo, &ptr->vendor[0]); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_sccrp_print(const u_char *dat) +pptp_sccrp_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_sccrp *ptr = (struct pptp_msg_sccrp *)dat; - TCHECK(ptr->proto_ver); - pptp_proto_ver_print(&ptr->proto_ver); - TCHECK(ptr->result_code); - pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_SCCRP); - TCHECK(ptr->err_code); - pptp_err_code_print(&ptr->err_code); - TCHECK(ptr->framing_cap); - pptp_framing_cap_print(&ptr->framing_cap); - TCHECK(ptr->bearer_cap); - pptp_bearer_cap_print(&ptr->bearer_cap); - TCHECK(ptr->max_channel); - pptp_max_channel_print(&ptr->max_channel); - TCHECK(ptr->firm_rev); - pptp_firm_rev_print(&ptr->firm_rev); - TCHECK(ptr->hostname); - pptp_hostname_print(&ptr->hostname[0]); - TCHECK(ptr->vendor); - pptp_vendor_print(&ptr->vendor[0]); + ND_TCHECK(ptr->proto_ver); + pptp_proto_ver_print(ndo, &ptr->proto_ver); + ND_TCHECK(ptr->result_code); + pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_SCCRP); + ND_TCHECK(ptr->err_code); + pptp_err_code_print(ndo, &ptr->err_code); + ND_TCHECK(ptr->framing_cap); + pptp_framing_cap_print(ndo, &ptr->framing_cap); + ND_TCHECK(ptr->bearer_cap); + pptp_bearer_cap_print(ndo, &ptr->bearer_cap); + ND_TCHECK(ptr->max_channel); + pptp_max_channel_print(ndo, &ptr->max_channel); + ND_TCHECK(ptr->firm_rev); + pptp_firm_rev_print(ndo, &ptr->firm_rev); + ND_TCHECK(ptr->hostname); + pptp_hostname_print(ndo, &ptr->hostname[0]); + ND_TCHECK(ptr->vendor); + pptp_vendor_print(ndo, &ptr->vendor[0]); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_stopccrq_print(const u_char *dat) +pptp_stopccrq_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_stopccrq *ptr = (struct pptp_msg_stopccrq *)dat; - TCHECK(ptr->reason); - printf(" REASON(%u", ptr->reason); - if (vflag) { + ND_TCHECK(ptr->reason); + ND_PRINT((ndo, " REASON(%u", ptr->reason)); + if (ndo->ndo_vflag) { switch (ptr->reason) { case 1: - printf(":None"); + ND_PRINT((ndo, ":None")); break; case 2: - printf(":Stop-Protocol"); + ND_PRINT((ndo, ":Stop-Protocol")); break; case 3: - printf(":Stop-Local-Shutdown"); + ND_PRINT((ndo, ":Stop-Local-Shutdown")); break; default: - printf(":?"); + ND_PRINT((ndo, ":?")); break; } } - printf(")"); - TCHECK(ptr->reserved1); - TCHECK(ptr->reserved2); + ND_PRINT((ndo, ")")); + ND_TCHECK(ptr->reserved1); + ND_TCHECK(ptr->reserved2); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_stopccrp_print(const u_char *dat) +pptp_stopccrp_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_stopccrp *ptr = (struct pptp_msg_stopccrp *)dat; - TCHECK(ptr->result_code); - pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_StopCCRP); - TCHECK(ptr->err_code); - pptp_err_code_print(&ptr->err_code); - TCHECK(ptr->reserved1); + ND_TCHECK(ptr->result_code); + pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_StopCCRP); + ND_TCHECK(ptr->err_code); + pptp_err_code_print(ndo, &ptr->err_code); + ND_TCHECK(ptr->reserved1); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_echorq_print(const u_char *dat) +pptp_echorq_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_echorq *ptr = (struct pptp_msg_echorq *)dat; - TCHECK(ptr->id); - pptp_id_print(&ptr->id); + ND_TCHECK(ptr->id); + pptp_id_print(ndo, &ptr->id); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_echorp_print(const u_char *dat) +pptp_echorp_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_echorp *ptr = (struct pptp_msg_echorp *)dat; - TCHECK(ptr->id); - pptp_id_print(&ptr->id); - TCHECK(ptr->result_code); - pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_ECHORP); - TCHECK(ptr->err_code); - pptp_err_code_print(&ptr->err_code); - TCHECK(ptr->reserved1); + ND_TCHECK(ptr->id); + pptp_id_print(ndo, &ptr->id); + ND_TCHECK(ptr->result_code); + pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_ECHORP); + ND_TCHECK(ptr->err_code); + pptp_err_code_print(ndo, &ptr->err_code); + ND_TCHECK(ptr->reserved1); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_ocrq_print(const u_char *dat) +pptp_ocrq_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_ocrq *ptr = (struct pptp_msg_ocrq *)dat; - TCHECK(ptr->call_id); - pptp_call_id_print(&ptr->call_id); - TCHECK(ptr->call_ser); - pptp_call_ser_print(&ptr->call_ser); - TCHECK(ptr->min_bps); - printf(" MIN_BPS(%u)", EXTRACT_32BITS(&ptr->min_bps)); - TCHECK(ptr->max_bps); - printf(" MAX_BPS(%u)", EXTRACT_32BITS(&ptr->max_bps)); - TCHECK(ptr->bearer_type); - pptp_bearer_type_print(&ptr->bearer_type); - TCHECK(ptr->framing_type); - pptp_framing_type_print(&ptr->framing_type); - TCHECK(ptr->recv_winsiz); - pptp_recv_winsiz_print(&ptr->recv_winsiz); - TCHECK(ptr->pkt_proc_delay); - pptp_pkt_proc_delay_print(&ptr->pkt_proc_delay); - TCHECK(ptr->phone_no_len); - printf(" PHONE_NO_LEN(%u)", EXTRACT_16BITS(&ptr->phone_no_len)); - TCHECK(ptr->reserved1); - TCHECK(ptr->phone_no); - printf(" PHONE_NO(%.64s)", ptr->phone_no); - TCHECK(ptr->subaddr); - pptp_subaddr_print(&ptr->subaddr[0]); + ND_TCHECK(ptr->call_id); + pptp_call_id_print(ndo, &ptr->call_id); + ND_TCHECK(ptr->call_ser); + pptp_call_ser_print(ndo, &ptr->call_ser); + ND_TCHECK(ptr->min_bps); + ND_PRINT((ndo, " MIN_BPS(%u)", EXTRACT_32BITS(&ptr->min_bps))); + ND_TCHECK(ptr->max_bps); + ND_PRINT((ndo, " MAX_BPS(%u)", EXTRACT_32BITS(&ptr->max_bps))); + ND_TCHECK(ptr->bearer_type); + pptp_bearer_type_print(ndo, &ptr->bearer_type); + ND_TCHECK(ptr->framing_type); + pptp_framing_type_print(ndo, &ptr->framing_type); + ND_TCHECK(ptr->recv_winsiz); + pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz); + ND_TCHECK(ptr->pkt_proc_delay); + pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay); + ND_TCHECK(ptr->phone_no_len); + ND_PRINT((ndo, " PHONE_NO_LEN(%u)", EXTRACT_16BITS(&ptr->phone_no_len))); + ND_TCHECK(ptr->reserved1); + ND_TCHECK(ptr->phone_no); + ND_PRINT((ndo, " PHONE_NO(%.64s)", ptr->phone_no)); + ND_TCHECK(ptr->subaddr); + pptp_subaddr_print(ndo, &ptr->subaddr[0]); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_ocrp_print(const u_char *dat) +pptp_ocrp_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_ocrp *ptr = (struct pptp_msg_ocrp *)dat; - TCHECK(ptr->call_id); - pptp_call_id_print(&ptr->call_id); - TCHECK(ptr->peer_call_id); - pptp_peer_call_id_print(&ptr->peer_call_id); - TCHECK(ptr->result_code); - pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_OCRP); - TCHECK(ptr->err_code); - pptp_err_code_print(&ptr->err_code); - TCHECK(ptr->cause_code); - pptp_cause_code_print(&ptr->cause_code); - TCHECK(ptr->conn_speed); - pptp_conn_speed_print(&ptr->conn_speed); - TCHECK(ptr->recv_winsiz); - pptp_recv_winsiz_print(&ptr->recv_winsiz); - TCHECK(ptr->pkt_proc_delay); - pptp_pkt_proc_delay_print(&ptr->pkt_proc_delay); - TCHECK(ptr->phy_chan_id); - pptp_phy_chan_id_print(&ptr->phy_chan_id); + ND_TCHECK(ptr->call_id); + pptp_call_id_print(ndo, &ptr->call_id); + ND_TCHECK(ptr->peer_call_id); + pptp_peer_call_id_print(ndo, &ptr->peer_call_id); + ND_TCHECK(ptr->result_code); + pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_OCRP); + ND_TCHECK(ptr->err_code); + pptp_err_code_print(ndo, &ptr->err_code); + ND_TCHECK(ptr->cause_code); + pptp_cause_code_print(ndo, &ptr->cause_code); + ND_TCHECK(ptr->conn_speed); + pptp_conn_speed_print(ndo, &ptr->conn_speed); + ND_TCHECK(ptr->recv_winsiz); + pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz); + ND_TCHECK(ptr->pkt_proc_delay); + pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay); + ND_TCHECK(ptr->phy_chan_id); + pptp_phy_chan_id_print(ndo, &ptr->phy_chan_id); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_icrq_print(const u_char *dat) +pptp_icrq_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_icrq *ptr = (struct pptp_msg_icrq *)dat; - TCHECK(ptr->call_id); - pptp_call_id_print(&ptr->call_id); - TCHECK(ptr->call_ser); - pptp_call_ser_print(&ptr->call_ser); - TCHECK(ptr->bearer_type); - pptp_bearer_type_print(&ptr->bearer_type); - TCHECK(ptr->phy_chan_id); - pptp_phy_chan_id_print(&ptr->phy_chan_id); - TCHECK(ptr->dialed_no_len); - printf(" DIALED_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialed_no_len)); - TCHECK(ptr->dialing_no_len); - printf(" DIALING_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialing_no_len)); - TCHECK(ptr->dialed_no); - printf(" DIALED_NO(%.64s)", ptr->dialed_no); - TCHECK(ptr->dialing_no); - printf(" DIALING_NO(%.64s)", ptr->dialing_no); - TCHECK(ptr->subaddr); - pptp_subaddr_print(&ptr->subaddr[0]); + ND_TCHECK(ptr->call_id); + pptp_call_id_print(ndo, &ptr->call_id); + ND_TCHECK(ptr->call_ser); + pptp_call_ser_print(ndo, &ptr->call_ser); + ND_TCHECK(ptr->bearer_type); + pptp_bearer_type_print(ndo, &ptr->bearer_type); + ND_TCHECK(ptr->phy_chan_id); + pptp_phy_chan_id_print(ndo, &ptr->phy_chan_id); + ND_TCHECK(ptr->dialed_no_len); + ND_PRINT((ndo, " DIALED_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialed_no_len))); + ND_TCHECK(ptr->dialing_no_len); + ND_PRINT((ndo, " DIALING_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialing_no_len))); + ND_TCHECK(ptr->dialed_no); + ND_PRINT((ndo, " DIALED_NO(%.64s)", ptr->dialed_no)); + ND_TCHECK(ptr->dialing_no); + ND_PRINT((ndo, " DIALING_NO(%.64s)", ptr->dialing_no)); + ND_TCHECK(ptr->subaddr); + pptp_subaddr_print(ndo, &ptr->subaddr[0]); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_icrp_print(const u_char *dat) +pptp_icrp_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_icrp *ptr = (struct pptp_msg_icrp *)dat; - TCHECK(ptr->call_id); - pptp_call_id_print(&ptr->call_id); - TCHECK(ptr->peer_call_id); - pptp_peer_call_id_print(&ptr->peer_call_id); - TCHECK(ptr->result_code); - pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_ICRP); - TCHECK(ptr->err_code); - pptp_err_code_print(&ptr->err_code); - TCHECK(ptr->recv_winsiz); - pptp_recv_winsiz_print(&ptr->recv_winsiz); - TCHECK(ptr->pkt_proc_delay); - pptp_pkt_proc_delay_print(&ptr->pkt_proc_delay); - TCHECK(ptr->reserved1); + ND_TCHECK(ptr->call_id); + pptp_call_id_print(ndo, &ptr->call_id); + ND_TCHECK(ptr->peer_call_id); + pptp_peer_call_id_print(ndo, &ptr->peer_call_id); + ND_TCHECK(ptr->result_code); + pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_ICRP); + ND_TCHECK(ptr->err_code); + pptp_err_code_print(ndo, &ptr->err_code); + ND_TCHECK(ptr->recv_winsiz); + pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz); + ND_TCHECK(ptr->pkt_proc_delay); + pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay); + ND_TCHECK(ptr->reserved1); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_iccn_print(const u_char *dat) +pptp_iccn_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_iccn *ptr = (struct pptp_msg_iccn *)dat; - TCHECK(ptr->peer_call_id); - pptp_peer_call_id_print(&ptr->peer_call_id); - TCHECK(ptr->reserved1); - TCHECK(ptr->conn_speed); - pptp_conn_speed_print(&ptr->conn_speed); - TCHECK(ptr->recv_winsiz); - pptp_recv_winsiz_print(&ptr->recv_winsiz); - TCHECK(ptr->pkt_proc_delay); - pptp_pkt_proc_delay_print(&ptr->pkt_proc_delay); - TCHECK(ptr->framing_type); - pptp_framing_type_print(&ptr->framing_type); + ND_TCHECK(ptr->peer_call_id); + pptp_peer_call_id_print(ndo, &ptr->peer_call_id); + ND_TCHECK(ptr->reserved1); + ND_TCHECK(ptr->conn_speed); + pptp_conn_speed_print(ndo, &ptr->conn_speed); + ND_TCHECK(ptr->recv_winsiz); + pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz); + ND_TCHECK(ptr->pkt_proc_delay); + pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay); + ND_TCHECK(ptr->framing_type); + pptp_framing_type_print(ndo, &ptr->framing_type); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_ccrq_print(const u_char *dat) +pptp_ccrq_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_ccrq *ptr = (struct pptp_msg_ccrq *)dat; - TCHECK(ptr->call_id); - pptp_call_id_print(&ptr->call_id); - TCHECK(ptr->reserved1); + ND_TCHECK(ptr->call_id); + pptp_call_id_print(ndo, &ptr->call_id); + ND_TCHECK(ptr->reserved1); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_cdn_print(const u_char *dat) +pptp_cdn_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_cdn *ptr = (struct pptp_msg_cdn *)dat; - TCHECK(ptr->call_id); - pptp_call_id_print(&ptr->call_id); - TCHECK(ptr->result_code); - pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_CDN); - TCHECK(ptr->err_code); - pptp_err_code_print(&ptr->err_code); - TCHECK(ptr->cause_code); - pptp_cause_code_print(&ptr->cause_code); - TCHECK(ptr->reserved1); - TCHECK(ptr->call_stats); - printf(" CALL_STATS(%.128s)", ptr->call_stats); + ND_TCHECK(ptr->call_id); + pptp_call_id_print(ndo, &ptr->call_id); + ND_TCHECK(ptr->result_code); + pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_CDN); + ND_TCHECK(ptr->err_code); + pptp_err_code_print(ndo, &ptr->err_code); + ND_TCHECK(ptr->cause_code); + pptp_cause_code_print(ndo, &ptr->cause_code); + ND_TCHECK(ptr->reserved1); + ND_TCHECK(ptr->call_stats); + ND_PRINT((ndo, " CALL_STATS(%.128s)", ptr->call_stats)); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_wen_print(const u_char *dat) +pptp_wen_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_wen *ptr = (struct pptp_msg_wen *)dat; - TCHECK(ptr->peer_call_id); - pptp_peer_call_id_print(&ptr->peer_call_id); - TCHECK(ptr->reserved1); - TCHECK(ptr->crc_err); - printf(" CRC_ERR(%u)", EXTRACT_32BITS(&ptr->crc_err)); - TCHECK(ptr->framing_err); - printf(" FRAMING_ERR(%u)", EXTRACT_32BITS(&ptr->framing_err)); - TCHECK(ptr->hardware_overrun); - printf(" HARDWARE_OVERRUN(%u)", EXTRACT_32BITS(&ptr->hardware_overrun)); - TCHECK(ptr->buffer_overrun); - printf(" BUFFER_OVERRUN(%u)", EXTRACT_32BITS(&ptr->buffer_overrun)); - TCHECK(ptr->timeout_err); - printf(" TIMEOUT_ERR(%u)", EXTRACT_32BITS(&ptr->timeout_err)); - TCHECK(ptr->align_err); - printf(" ALIGN_ERR(%u)", EXTRACT_32BITS(&ptr->align_err)); + ND_TCHECK(ptr->peer_call_id); + pptp_peer_call_id_print(ndo, &ptr->peer_call_id); + ND_TCHECK(ptr->reserved1); + ND_TCHECK(ptr->crc_err); + ND_PRINT((ndo, " CRC_ERR(%u)", EXTRACT_32BITS(&ptr->crc_err))); + ND_TCHECK(ptr->framing_err); + ND_PRINT((ndo, " FRAMING_ERR(%u)", EXTRACT_32BITS(&ptr->framing_err))); + ND_TCHECK(ptr->hardware_overrun); + ND_PRINT((ndo, " HARDWARE_OVERRUN(%u)", EXTRACT_32BITS(&ptr->hardware_overrun))); + ND_TCHECK(ptr->buffer_overrun); + ND_PRINT((ndo, " BUFFER_OVERRUN(%u)", EXTRACT_32BITS(&ptr->buffer_overrun))); + ND_TCHECK(ptr->timeout_err); + ND_PRINT((ndo, " TIMEOUT_ERR(%u)", EXTRACT_32BITS(&ptr->timeout_err))); + ND_TCHECK(ptr->align_err); + ND_PRINT((ndo, " ALIGN_ERR(%u)", EXTRACT_32BITS(&ptr->align_err))); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } static void -pptp_sli_print(const u_char *dat) +pptp_sli_print(netdissect_options *ndo, + const u_char *dat) { struct pptp_msg_sli *ptr = (struct pptp_msg_sli *)dat; - TCHECK(ptr->peer_call_id); - pptp_peer_call_id_print(&ptr->peer_call_id); - TCHECK(ptr->reserved1); - TCHECK(ptr->send_accm); - printf(" SEND_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->send_accm)); - TCHECK(ptr->recv_accm); - printf(" RECV_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->recv_accm)); + ND_TCHECK(ptr->peer_call_id); + pptp_peer_call_id_print(ndo, &ptr->peer_call_id); + ND_TCHECK(ptr->reserved1); + ND_TCHECK(ptr->send_accm); + ND_PRINT((ndo, " SEND_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->send_accm))); + ND_TCHECK(ptr->recv_accm); + ND_PRINT((ndo, " RECV_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->recv_accm))); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } void -pptp_print(const u_char *dat) +pptp_print(netdissect_options *ndo, + const u_char *dat) { const struct pptp_hdr *hdr; u_int32_t mc; u_int16_t ctrl_msg_type; - printf(": pptp"); + ND_PRINT((ndo, ": pptp")); hdr = (struct pptp_hdr *)dat; - TCHECK(hdr->length); - if (vflag) { - printf(" Length=%u", EXTRACT_16BITS(&hdr->length)); + ND_TCHECK(hdr->length); + if (ndo->ndo_vflag) { + ND_PRINT((ndo, " Length=%u", EXTRACT_16BITS(&hdr->length))); } - TCHECK(hdr->msg_type); - if (vflag) { + ND_TCHECK(hdr->msg_type); + if (ndo->ndo_vflag) { switch(EXTRACT_16BITS(&hdr->msg_type)) { case PPTP_MSG_TYPE_CTRL: - printf(" CTRL-MSG"); + ND_PRINT((ndo, " CTRL-MSG")); break; case PPTP_MSG_TYPE_MGMT: - printf(" MGMT-MSG"); + ND_PRINT((ndo, " MGMT-MSG")); break; default: - printf(" UNKNOWN-MSG-TYPE"); + ND_PRINT((ndo, " UNKNOWN-MSG-TYPE")); break; } } - TCHECK(hdr->magic_cookie); + ND_TCHECK(hdr->magic_cookie); mc = EXTRACT_32BITS(&hdr->magic_cookie); if (mc != PPTP_MAGIC_COOKIE) { - printf(" UNEXPECTED Magic-Cookie!!(%08x)", mc); + ND_PRINT((ndo, " UNEXPECTED Magic-Cookie!!(%08x)", mc)); } - if (vflag || mc != PPTP_MAGIC_COOKIE) { - printf(" Magic-Cookie=%08x", mc); + if (ndo->ndo_vflag || mc != PPTP_MAGIC_COOKIE) { + ND_PRINT((ndo, " Magic-Cookie=%08x", mc)); } - TCHECK(hdr->ctrl_msg_type); + ND_TCHECK(hdr->ctrl_msg_type); ctrl_msg_type = EXTRACT_16BITS(&hdr->ctrl_msg_type); if (ctrl_msg_type < PPTP_MAX_MSGTYPE_INDEX) { - printf(" CTRL_MSGTYPE=%s", - pptp_message_type_string[ctrl_msg_type]); + ND_PRINT((ndo, " CTRL_MSGTYPE=%s", + pptp_message_type_string[ctrl_msg_type])); } else { - printf(" UNKNOWN_CTRL_MSGTYPE(%u)", ctrl_msg_type); + ND_PRINT((ndo, " UNKNOWN_CTRL_MSGTYPE(%u)", ctrl_msg_type)); } - TCHECK(hdr->reserved0); + ND_TCHECK(hdr->reserved0); dat += 12; switch(ctrl_msg_type) { case PPTP_CTRL_MSG_TYPE_SCCRQ: - pptp_sccrq_print(dat); + pptp_sccrq_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_SCCRP: - pptp_sccrp_print(dat); + pptp_sccrp_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_StopCCRQ: - pptp_stopccrq_print(dat); + pptp_stopccrq_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_StopCCRP: - pptp_stopccrp_print(dat); + pptp_stopccrp_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_ECHORQ: - pptp_echorq_print(dat); + pptp_echorq_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_ECHORP: - pptp_echorp_print(dat); + pptp_echorp_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_OCRQ: - pptp_ocrq_print(dat); + pptp_ocrq_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_OCRP: - pptp_ocrp_print(dat); + pptp_ocrp_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_ICRQ: - pptp_icrq_print(dat); + pptp_icrq_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_ICRP: - pptp_icrp_print(dat); + pptp_icrp_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_ICCN: - pptp_iccn_print(dat); + pptp_iccn_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_CCRQ: - pptp_ccrq_print(dat); + pptp_ccrq_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_CDN: - pptp_cdn_print(dat); + pptp_cdn_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_WEN: - pptp_wen_print(dat); + pptp_wen_print(ndo, dat); break; case PPTP_CTRL_MSG_TYPE_SLI: - pptp_sli_print(dat); + pptp_sli_print(ndo, dat); break; default: /* do nothing */ @@ -1051,5 +1087,5 @@ pptp_print(const u_char *dat) return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } diff --git a/print-rip.c b/print-rip.c index b1931a63..8399081c 100644 --- a/print-rip.c +++ b/print-rip.c @@ -19,6 +19,7 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -26,7 +27,6 @@ #include <tcpdump-stdinc.h> #include <stdio.h> -#include <string.h> #include "interface.h" #include "addrtoname.h" @@ -93,37 +93,39 @@ struct rip_netinfo { }; static void -rip_entry_print_v1(register const struct rip_netinfo *ni) +rip_entry_print_v1(netdissect_options *ndo, + register const struct rip_netinfo *ni) { register u_short family; /* RFC 1058 */ family = EXTRACT_16BITS(&ni->rip_family); if (family != BSD_AFNUM_INET && family != 0) { - printf("\n\t AFI %s, ", tok2str(bsd_af_values, "Unknown (%u)", family)); - print_unknown_data(gndo,(u_int8_t *)&ni->rip_family,"\n\t ",RIP_ROUTELEN); + ND_PRINT((ndo, "\n\t AFI %s, ", tok2str(bsd_af_values, "Unknown (%u)", family))); + print_unknown_data(ndo, (u_int8_t *)&ni->rip_family, "\n\t ", RIP_ROUTELEN); return; } if (EXTRACT_16BITS(&ni->rip_tag) || EXTRACT_32BITS(&ni->rip_dest_mask) || EXTRACT_32BITS(&ni->rip_router)) { /* MBZ fields not zero */ - print_unknown_data(gndo,(u_int8_t *)&ni->rip_family,"\n\t ",RIP_ROUTELEN); + print_unknown_data(ndo, (u_int8_t *)&ni->rip_family, "\n\t ", RIP_ROUTELEN); return; } if (family == 0) { - printf("\n\t AFI 0, %s, metric: %u", + ND_PRINT((ndo, "\n\t AFI 0, %s, metric: %u", ipaddr_string(&ni->rip_dest), - EXTRACT_32BITS(&ni->rip_metric)); + EXTRACT_32BITS(&ni->rip_metric))); return; } /* BSD_AFNUM_INET */ - printf("\n\t %s, metric: %u", + ND_PRINT((ndo, "\n\t %s, metric: %u", ipaddr_string(&ni->rip_dest), - EXTRACT_32BITS(&ni->rip_metric)); + EXTRACT_32BITS(&ni->rip_metric))); } static unsigned -rip_entry_print_v2(register const struct rip_netinfo *ni, const unsigned remaining) +rip_entry_print_v2(netdissect_options *ndo, + register const struct rip_netinfo *ni, const unsigned remaining) { register u_short family; @@ -133,69 +135,70 @@ rip_entry_print_v2(register const struct rip_netinfo *ni, const unsigned remaini if (auth_type == 2) { register u_char *p = (u_char *)&ni->rip_dest; u_int i = 0; - printf("\n\t Simple Text Authentication data: "); + ND_PRINT((ndo, "\n\t Simple Text Authentication data: ")); for (; i < RIP_AUTHLEN; p++, i++) putchar (ND_ISPRINT(*p) ? *p : '.'); } else if (auth_type == 3) { - printf("\n\t Auth header:"); - printf(" Packet Len %u,", EXTRACT_16BITS((u_int8_t *)ni + 4)); - printf(" Key-ID %u,", *((u_int8_t *)ni + 6)); - printf(" Auth Data Len %u,", *((u_int8_t *)ni + 7)); - printf(" SeqNo %u,", EXTRACT_32BITS(&ni->rip_dest_mask)); - printf(" MBZ %u,", EXTRACT_32BITS(&ni->rip_router)); - printf(" MBZ %u", EXTRACT_32BITS(&ni->rip_metric)); + ND_PRINT((ndo, "\n\t Auth header:")); + ND_PRINT((ndo, " Packet Len %u,", EXTRACT_16BITS((u_int8_t *)ni + 4))); + ND_PRINT((ndo, " Key-ID %u,", *((u_int8_t *)ni + 6))); + ND_PRINT((ndo, " Auth Data Len %u,", *((u_int8_t *)ni + 7))); + ND_PRINT((ndo, " SeqNo %u,", EXTRACT_32BITS(&ni->rip_dest_mask))); + ND_PRINT((ndo, " MBZ %u,", EXTRACT_32BITS(&ni->rip_router))); + ND_PRINT((ndo, " MBZ %u", EXTRACT_32BITS(&ni->rip_metric))); } else if (auth_type == 1) { - printf("\n\t Auth trailer:"); - print_unknown_data(gndo,(u_int8_t *)&ni->rip_dest,"\n\t ",remaining); + ND_PRINT((ndo, "\n\t Auth trailer:")); + print_unknown_data(ndo, (u_int8_t *)&ni->rip_dest, "\n\t ", remaining); return remaining; /* AT spans till the packet end */ - } else { - printf("\n\t Unknown (%u) Authentication data:", - EXTRACT_16BITS(&ni->rip_tag)); - print_unknown_data(gndo,(u_int8_t *)&ni->rip_dest,"\n\t ",remaining); + } else { + ND_PRINT((ndo, "\n\t Unknown (%u) Authentication data:", + EXTRACT_16BITS(&ni->rip_tag))); + print_unknown_data(ndo, (u_int8_t *)&ni->rip_dest, "\n\t ", remaining); } } else if (family != BSD_AFNUM_INET && family != 0) { - printf("\n\t AFI %s", tok2str(bsd_af_values, "Unknown (%u)", family)); - print_unknown_data(gndo,(u_int8_t *)&ni->rip_tag,"\n\t ",RIP_ROUTELEN-2); + ND_PRINT((ndo, "\n\t AFI %s", tok2str(bsd_af_values, "Unknown (%u)", family))); + print_unknown_data(ndo, (u_int8_t *)&ni->rip_tag, "\n\t ", RIP_ROUTELEN-2); } else { /* BSD_AFNUM_INET or AFI 0 */ - printf("\n\t AFI %s, %15s/%-2d, tag 0x%04x, metric: %u, next-hop: ", + ND_PRINT((ndo, "\n\t AFI %s, %15s/%-2d, tag 0x%04x, metric: %u, next-hop: ", tok2str(bsd_af_values, "%u", family), ipaddr_string(&ni->rip_dest), mask2plen(EXTRACT_32BITS(&ni->rip_dest_mask)), EXTRACT_16BITS(&ni->rip_tag), - EXTRACT_32BITS(&ni->rip_metric)); + EXTRACT_32BITS(&ni->rip_metric))); if (EXTRACT_32BITS(&ni->rip_router)) - printf("%s", ipaddr_string(&ni->rip_router)); - else - printf("self"); + ND_PRINT((ndo, "%s", ipaddr_string(&ni->rip_router))); + else + ND_PRINT((ndo, "self")); } return sizeof (*ni); } void -rip_print(const u_char *dat, u_int length) +rip_print(netdissect_options *ndo, + const u_char *dat, u_int length) { register const struct rip *rp; register const struct rip_netinfo *ni; register u_int i, j; - if (snapend < dat) { - printf(" %s", tstr); + if (ndo->ndo_snapend < dat) { + ND_PRINT((ndo, " %s", tstr)); return; } - i = snapend - dat; + i = ndo->ndo_snapend - dat; if (i > length) i = length; if (i < sizeof(*rp)) { - printf(" %s", tstr); + ND_PRINT((ndo, " %s", tstr)); return; } i -= sizeof(*rp); rp = (struct rip *)dat; - printf("%sRIPv%u", - (vflag >= 1) ? "\n\t" : "", - rp->rip_vers); + ND_PRINT((ndo, "%sRIPv%u", + (ndo->ndo_vflag >= 1) ? "\n\t" : "", + rp->rip_vers)); switch (rp->rip_vers) { case 0: @@ -210,38 +213,38 @@ rip_print(const u_char *dat, u_int length) * * so perhaps we should just dump the packet, in hex. */ - print_unknown_data(gndo,(u_int8_t *)&rp->rip_cmd,"\n\t",length); + print_unknown_data(ndo, (u_int8_t *)&rp->rip_cmd, "\n\t", length); break; default: /* dump version and lets see if we know the commands name*/ - printf(", %s, length: %u", + ND_PRINT((ndo, ", %s, length: %u", tok2str(rip_cmd_values, "unknown command (%u)", rp->rip_cmd), - length); + length)); - if (vflag < 1) + if (ndo->ndo_vflag < 1) return; switch (rp->rip_cmd) { case RIPCMD_REQUEST: case RIPCMD_RESPONSE: j = length / sizeof(*ni); - printf(", routes: %u%s", j, rp->rip_vers == 2 ? " or less" : ""); + ND_PRINT((ndo, ", routes: %u%s", j, rp->rip_vers == 2 ? " or less" : "")); ni = (struct rip_netinfo *)(rp + 1); for (; i >= sizeof(*ni); ++ni) { if (rp->rip_vers == 1) { - rip_entry_print_v1(ni); + rip_entry_print_v1(ndo, ni); i -= sizeof(*ni); } else if (rp->rip_vers == 2) - i -= rip_entry_print_v2(ni, i); + i -= rip_entry_print_v2(ndo, ni, i); else break; } if (i) - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); break; case RIPCMD_TRACEOFF: @@ -252,15 +255,15 @@ rip_print(const u_char *dat, u_int length) case RIPCMD_TRACEON: /* fall through */ default: - if (vflag <= 1) { - if(!print_unknown_data(gndo,(u_int8_t *)rp,"\n\t",length)) + if (ndo->ndo_vflag <= 1) { + if(!print_unknown_data(ndo, (u_int8_t *)rp, "\n\t", length)) return; } break; } /* do we want to see an additionally hexdump ? */ - if (vflag> 1) { - if(!print_unknown_data(gndo,(u_int8_t *)rp,"\n\t",length)) + if (ndo->ndo_vflag> 1) { + if(!print_unknown_data(ndo, (u_int8_t *)rp, "\n\t", length)) return; } } diff --git a/print-tcp.c b/print-tcp.c index 34ea9ae3..6773f969 100644 --- a/print-tcp.c +++ b/print-tcp.c @@ -675,7 +675,7 @@ tcp_print(register const u_char *bp, register u_int length, } else if (sport == BGP_PORT || dport == BGP_PORT) bgp_print(bp, length); else if (sport == PPTP_PORT || dport == PPTP_PORT) - pptp_print(bp); + pptp_print(gndo, bp); #ifdef TCPDUMP_DO_SMB else if (sport == NETBIOS_SSN_PORT || dport == NETBIOS_SSN_PORT) nbt_tcp_print(bp, length); @@ -700,7 +700,7 @@ tcp_print(register const u_char *bp, register u_int length, rpki_rtr_print(gndo, bp, length); } else if (length > 0 && (sport == LDP_PORT || dport == LDP_PORT)) { - ldp_print(bp, length); + ldp_print(gndo, bp, length); } else if ((sport == NFS_PORT || dport == NFS_PORT) && length >= 4 && TTEST2(*bp, 4)) { diff --git a/print-udp.c b/print-udp.c index 4079cb19..33d861a1 100644 --- a/print-udp.c +++ b/print-udp.c @@ -473,7 +473,7 @@ udp_print(netdissect_options *ndo, register const u_char *bp, u_int length, case PT_PGM: case PT_PGM_ZMTP1: udpipaddr_print(ndo, ip, sport, dport); - pgm_print(cp, length, bp2); + pgm_print(ndo, cp, length, bp2); break; case PT_LMP: udpipaddr_print(ndo, ip, sport, dport); @@ -574,7 +574,7 @@ udp_print(netdissect_options *ndo, register const u_char *bp, u_int length, else if (ISPORT(IPPORT_BOOTPC) || ISPORT(IPPORT_BOOTPS)) bootp_print((const u_char *)(up + 1), length); else if (ISPORT(RIP_PORT)) - rip_print((const u_char *)(up + 1), length); + rip_print(ndo, (const u_char *)(up + 1), length); else if (ISPORT(AODV_PORT)) aodv_print((const u_char *)(up + 1), length, #ifdef INET6 @@ -643,7 +643,7 @@ udp_print(netdissect_options *ndo, register const u_char *bp, u_int length, else if (ISPORT(LWRES_PORT)) lwres_print((const u_char *)(up + 1), length); else if (ISPORT(LDP_PORT)) - ldp_print((const u_char *)(up + 1), length); + ldp_print(ndo, (const u_char *)(up + 1), length); else if (ISPORT(OLSR_PORT)) olsr_print((const u_char *)(up + 1), length, #if INET6 @@ -663,11 +663,11 @@ udp_print(netdissect_options *ndo, register const u_char *bp, u_int length, else if (ISPORT(SFLOW_PORT)) sflow_print((const u_char *)(up + 1), length); else if (dport == LWAPP_CONTROL_PORT) - lwapp_control_print((const u_char *)(up + 1), length, 1); + lwapp_control_print(ndo, (const u_char *)(up + 1), length, 1); else if (sport == LWAPP_CONTROL_PORT) - lwapp_control_print((const u_char *)(up + 1), length, 0); + lwapp_control_print(ndo, (const u_char *)(up + 1), length, 0); else if (ISPORT(LWAPP_DATA_PORT)) - lwapp_data_print((const u_char *)(up + 1), length); + lwapp_data_print(ndo, (const u_char *)(up + 1), length); else if (ISPORT(SIP_PORT)) sip_print((const u_char *)(up + 1), length); else if (ISPORT(SYSLOG_PORT)) |