X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/339f6a65b25d0d3b5d235e19238b75d0afe5dac7..486704db7c840dcfb51f70f1812d9c3ad37ad39c:/print-dvmrp.c diff --git a/print-dvmrp.c b/print-dvmrp.c index 01265fd1..8e008326 100644 --- a/print-dvmrp.c +++ b/print-dvmrp.c @@ -19,25 +19,11 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -#ifndef lint -static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-dvmrp.c,v 1.21 2001-05-10 05:30:20 fenner Exp $ (LBL)"; -#endif - #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include -#include -#include - -#include - -#include -#include -#include -#include +#include #include "interface.h" #include "extract.h" @@ -67,26 +53,28 @@ static const char rcsid[] = #define DVMRP_NF_DISABLED 0x20 /* administratively disabled */ #define DVMRP_NF_QUERIER 0x40 /* I am the subnet's querier */ -static void print_probe(const u_char *, const u_char *, u_int); -static void print_report(const u_char *, const u_char *, u_int); -static void print_neighbors(const u_char *, const u_char *, u_int); -static void print_neighbors2(const u_char *, const u_char *, u_int); -static void print_prune(const u_char *, const u_char *, u_int); -static void print_graft(const u_char *, const u_char *, u_int); -static void print_graft_ack(const u_char *, const u_char *, u_int); +static int print_probe(netdissect_options *, const u_char *, const u_char *, u_int); +static int print_report(netdissect_options *, const u_char *, const u_char *, u_int); +static int print_neighbors(netdissect_options *, const u_char *, const u_char *, u_int); +static int print_neighbors2(netdissect_options *, const u_char *, const u_char *, u_int); +static int print_prune(netdissect_options *, const u_char *); +static int print_graft(netdissect_options *, const u_char *); +static int print_graft_ack(netdissect_options *, const u_char *); -static u_int32_t target_level; +static uint32_t target_level; void -dvmrp_print(register const u_char *bp, register u_int len) +dvmrp_print(netdissect_options *ndo, + register const u_char *bp, register u_int len) { register const u_char *ep; register u_char type; - ep = (const u_char *)snapend; + ep = (const u_char *)ndo->ndo_snapend; if (bp >= ep) return; + ND_TCHECK(bp[1]); type = bp[1]; /* Skip IGMP header */ @@ -96,77 +84,95 @@ dvmrp_print(register const u_char *bp, register u_int len) switch (type) { case DVMRP_PROBE: - printf(" Probe"); - if (vflag) - print_probe(bp, ep, len); + ND_PRINT((ndo, " Probe")); + if (ndo->ndo_vflag) { + if (print_probe(ndo, bp, ep, len) < 0) + goto trunc; + } break; case DVMRP_REPORT: - printf(" Report"); - if (vflag > 1) - print_report(bp, ep, len); + ND_PRINT((ndo, " Report")); + if (ndo->ndo_vflag > 1) { + if (print_report(ndo, bp, ep, len) < 0) + goto trunc; + } break; case DVMRP_ASK_NEIGHBORS: - printf(" Ask-neighbors(old)"); + ND_PRINT((ndo, " Ask-neighbors(old)")); break; case DVMRP_NEIGHBORS: - printf(" Neighbors(old)"); - print_neighbors(bp, ep, len); + ND_PRINT((ndo, " Neighbors(old)")); + if (print_neighbors(ndo, bp, ep, len) < 0) + goto trunc; break; case DVMRP_ASK_NEIGHBORS2: - printf(" Ask-neighbors2"); + ND_PRINT((ndo, " Ask-neighbors2")); break; case DVMRP_NEIGHBORS2: - printf(" Neighbors2"); + ND_PRINT((ndo, " Neighbors2")); /* * extract version and capabilities from IGMP group * address field */ bp -= 4; + ND_TCHECK2(bp[0], 4); target_level = (bp[0] << 24) | (bp[1] << 16) | (bp[2] << 8) | bp[3]; bp += 4; - print_neighbors2(bp, ep, len); + if (print_neighbors2(ndo, bp, ep, len) < 0) + goto trunc; break; case DVMRP_PRUNE: - printf(" Prune"); - print_prune(bp, ep, len); + ND_PRINT((ndo, " Prune")); + if (print_prune(ndo, bp) < 0) + goto trunc; break; case DVMRP_GRAFT: - printf(" Graft"); - print_graft(bp, ep, len); + ND_PRINT((ndo, " Graft")); + if (print_graft(ndo, bp) < 0) + goto trunc; break; case DVMRP_GRAFT_ACK: - printf(" Graft-ACK"); - print_graft_ack(bp, ep, len); + ND_PRINT((ndo, " Graft-ACK")); + if (print_graft_ack(ndo, bp) < 0) + goto trunc; break; default: - printf(" [type %d]", type); + ND_PRINT((ndo, " [type %d]", type)); break; } + return; + +trunc: + ND_PRINT((ndo, "[|dvmrp]")); + return; } -static void -print_report(register const u_char *bp, register const u_char *ep, - register u_int len) +static int +print_report(netdissect_options *ndo, + register const u_char *bp, register const u_char *ep, + register u_int len) { - register u_int32_t mask, origin; - register int metric, i, width, done; + register uint32_t mask, origin; + register int metric, done; + register u_int i, width; while (len > 0) { if (len < 3) { - printf(" [|]"); - return; + ND_PRINT((ndo, " [|]")); + return (0); } - mask = (u_int32_t)0xff << 24 | bp[0] << 16 | bp[1] << 8 | bp[2]; + ND_TCHECK2(bp[0], 3); + mask = (uint32_t)0xff << 24 | bp[0] << 16 | bp[1] << 8 | bp[2]; width = 1; if (bp[0]) width = 2; @@ -175,70 +181,75 @@ print_report(register const u_char *bp, register const u_char *ep, if (bp[2]) width = 4; - printf("\n\tMask %s", intoa(htonl(mask))); + ND_PRINT((ndo, "\n\tMask %s", intoa(htonl(mask)))); bp += 3; len -= 3; do { if (bp + width + 1 > ep) { - printf(" [|]"); - return; + ND_PRINT((ndo, " [|]")); + return (0); } if (len < width + 1) { - printf("\n\t [Truncated Report]"); - return; + ND_PRINT((ndo, "\n\t [Truncated Report]")); + return (0); } origin = 0; - for (i = 0; i < width; ++i) + for (i = 0; i < width; ++i) { + ND_TCHECK(*bp); origin = origin << 8 | *bp++; + } for ( ; i < 4; ++i) origin <<= 8; + ND_TCHECK(*bp); metric = *bp++; done = metric & 0x80; metric &= 0x7f; - printf("\n\t %s metric %d", intoa(htonl(origin)), - metric); + ND_PRINT((ndo, "\n\t %s metric %d", intoa(htonl(origin)), + metric)); len -= width + 1; } while (!done); } + return (0); +trunc: + return (-1); } -static void -print_probe(register const u_char *bp, register const u_char *ep, - register u_int len) +static int +print_probe(netdissect_options *ndo, + register const u_char *bp, register const u_char *ep, + register u_int len) { - register u_int32_t genid; + register uint32_t genid; - TCHECK2(bp[0], 4); + ND_TCHECK2(bp[0], 4); if ((len < 4) || ((bp + 4) > ep)) { /* { (ctags) */ - printf(" [|}"); - return; + ND_PRINT((ndo, " [|}")); + return (0); } genid = (bp[0] << 24) | (bp[1] << 16) | (bp[2] << 8) | bp[3]; bp += 4; len -= 4; - if (vflag > 1) - printf("\n\t"); - else - printf(" "); - printf("genid %u", genid); - if (vflag < 2) - return; + ND_PRINT((ndo, ndo->ndo_vflag > 1 ? "\n\t" : " ")); + ND_PRINT((ndo, "genid %u", genid)); + if (ndo->ndo_vflag < 2) + return (0); while ((len > 0) && (bp < ep)) { - TCHECK2(bp[0], 4); - printf("\n\tneighbor %s", ipaddr_string(bp)); + ND_TCHECK2(bp[0], 4); + ND_PRINT((ndo, "\n\tneighbor %s", ipaddr_string(ndo, bp))); bp += 4; len -= 4; } - return; + return (0); trunc: - (void)printf("[|dvmrp]"); + return (-1); } -static void -print_neighbors(register const u_char *bp, register const u_char *ep, - register u_int len) +static int +print_neighbors(netdissect_options *ndo, + register const u_char *bp, register const u_char *ep, + register u_int len) { const u_char *laddr; register u_char metric; @@ -246,7 +257,7 @@ print_neighbors(register const u_char *bp, register const u_char *ep, register int ncount; while (len > 0 && bp < ep) { - TCHECK2(bp[0], 7); + ND_TCHECK2(bp[0], 7); laddr = bp; bp += 4; metric = *bp++; @@ -254,33 +265,34 @@ print_neighbors(register const u_char *bp, register const u_char *ep, ncount = *bp++; len -= 7; while (--ncount >= 0) { - TCHECK2(bp[0], 4); - printf(" [%s ->", ipaddr_string(laddr)); - printf(" %s, (%d/%d)]", - ipaddr_string(bp), metric, thresh); + ND_TCHECK2(bp[0], 4); + ND_PRINT((ndo, " [%s ->", ipaddr_string(ndo, laddr))); + ND_PRINT((ndo, " %s, (%d/%d)]", + ipaddr_string(ndo, bp), metric, thresh)); bp += 4; len -= 4; } } - return; + return (0); trunc: - (void)printf("[|dvmrp]"); + return (-1); } -static void -print_neighbors2(register const u_char *bp, register const u_char *ep, - register u_int len) +static int +print_neighbors2(netdissect_options *ndo, + register const u_char *bp, register const u_char *ep, + register u_int len) { const u_char *laddr; register u_char metric, thresh, flags; register int ncount; - printf(" (v %d.%d):", + ND_PRINT((ndo, " (v %d.%d):", (int)target_level & 0xff, - (int)(target_level >> 8) & 0xff); + (int)(target_level >> 8) & 0xff)); while (len > 0 && bp < ep) { - TCHECK2(bp[0], 8); + ND_TCHECK2(bp[0], 8); laddr = bp; bp += 4; metric = *bp++; @@ -289,65 +301,65 @@ print_neighbors2(register const u_char *bp, register const u_char *ep, ncount = *bp++; len -= 8; while (--ncount >= 0 && (len >= 4) && (bp + 4) <= ep) { - printf(" [%s -> ", ipaddr_string(laddr)); - printf("%s (%d/%d", ipaddr_string(bp), - metric, thresh); + ND_PRINT((ndo, " [%s -> ", ipaddr_string(ndo, laddr))); + ND_PRINT((ndo, "%s (%d/%d", ipaddr_string(ndo, bp), + metric, thresh)); if (flags & DVMRP_NF_TUNNEL) - printf("/tunnel"); + ND_PRINT((ndo, "/tunnel")); if (flags & DVMRP_NF_SRCRT) - printf("/srcrt"); + ND_PRINT((ndo, "/srcrt")); if (flags & DVMRP_NF_QUERIER) - printf("/querier"); + ND_PRINT((ndo, "/querier")); if (flags & DVMRP_NF_DISABLED) - printf("/disabled"); + ND_PRINT((ndo, "/disabled")); if (flags & DVMRP_NF_DOWN) - printf("/down"); - printf(")]"); + ND_PRINT((ndo, "/down")); + ND_PRINT((ndo, ")]")); bp += 4; len -= 4; } if (ncount != -1) { - printf(" [|]"); - return; + ND_PRINT((ndo, " [|]")); + return (0); } } - return; + return (0); trunc: - (void)printf("[|dvmrp]"); + return (-1); } -static void -print_prune(register const u_char *bp, register const u_char *ep, - register u_int len) +static int +print_prune(netdissect_options *ndo, + register const u_char *bp) { - TCHECK2(bp[0], 12); - printf(" src %s grp %s", ipaddr_string(bp), ipaddr_string(bp + 4)); + ND_TCHECK2(bp[0], 12); + ND_PRINT((ndo, " src %s grp %s", ipaddr_string(ndo, bp), ipaddr_string(ndo, bp + 4))); bp += 8; - (void)printf(" timer "); - relts_print(EXTRACT_32BITS(bp)); - return; + ND_PRINT((ndo, " timer ")); + relts_print(ndo, EXTRACT_32BITS(bp)); + return (0); trunc: - (void)printf("[|dvmrp]"); + return (-1); } -static void -print_graft(register const u_char *bp, register const u_char *ep, - register u_int len) +static int +print_graft(netdissect_options *ndo, + register const u_char *bp) { - TCHECK2(bp[0], 8); - printf(" src %s grp %s", ipaddr_string(bp), ipaddr_string(bp + 4)); - return; + ND_TCHECK2(bp[0], 8); + ND_PRINT((ndo, " src %s grp %s", ipaddr_string(ndo, bp), ipaddr_string(ndo, bp + 4))); + return (0); trunc: - (void)printf("[|dvmrp]"); + return (-1); } -static void -print_graft_ack(register const u_char *bp, register const u_char *ep, - register u_int len) +static int +print_graft_ack(netdissect_options *ndo, + register const u_char *bp) { - TCHECK2(bp[0], 8); - printf(" src %s grp %s", ipaddr_string(bp), ipaddr_string(bp + 4)); - return; + ND_TCHECK2(bp[0], 8); + ND_PRINT((ndo, " src %s grp %s", ipaddr_string(ndo, bp), ipaddr_string(ndo, bp + 4))); + return (0); trunc: - (void)printf("[|dvmrp]"); + return (-1); }