diff options
author | pst <pst@FreeBSD.org> | 1996-08-19 21:39:00 +0000 |
---|---|---|
committer | pst <pst@FreeBSD.org> | 1996-08-19 21:39:00 +0000 |
commit | f47481b22a181d4a84c2efcdf075dcab684e2e4d (patch) | |
tree | cc5c54f6ccc3b290b58b87d364f92bbfe13823ce | |
parent | a8df284d77886c79ba3bde2acb1c1f6c3cb399cb (diff) | |
download | FreeBSD-src-f47481b22a181d4a84c2efcdf075dcab684e2e4d.zip FreeBSD-src-f47481b22a181d4a84c2efcdf075dcab684e2e4d.tar.gz |
Improvements to IGMP message decoding.
Add support for the router-alert option.
Submitted by: Bill Fenner <fenner@parc.xerox.com>
-rw-r--r-- | contrib/tcpdump/print-ip.c | 93 |
1 files changed, 86 insertions, 7 deletions
diff --git a/contrib/tcpdump/print-ip.c b/contrib/tcpdump/print-ip.c index 935bb7c..4ad45bf 100644 --- a/contrib/tcpdump/print-ip.c +++ b/contrib/tcpdump/print-ip.c @@ -155,22 +155,95 @@ igmp_print(register const u_char *bp, register u_int len, TCHECK2(bp[0], 8); switch (bp[0]) { case 0x11: - (void)printf("igmp query"); + (void)printf("igmp %s query", bp[1] ? "v2" : "v1"); + if (bp[1] && bp[1] != 100) + (void)printf(" [intvl %d]", bp[1]); if (*(int *)&bp[4]) (void)printf(" [gaddr %s]", ipaddr_string(&bp[4])); if (len != 8) (void)printf(" [len %d]", len); break; case 0x12: - (void)printf("igmp report %s", ipaddr_string(&bp[4])); + case 0x16: + (void)printf("igmp %s report %s", + bp[0] & 0x0f == 6 ? "v2" : "v1", + ipaddr_string(&bp[4])); if (len != 8) (void)printf(" [len %d]", len); - break; - case 0x16: - (void)printf("igmp nreport %s", ipaddr_string(&bp[4])); + if (bp[1]) + (void)printf(" [b1=0x%x]", bp[1]); break; case 0x17: (void)printf("igmp leave %s", ipaddr_string(&bp[4])); + switch(bp[1]) { + case 1: + (void)printf(" probe"); + if (len < 8) + (void)printf(" [len %d]", len); + if (vflag) { + if (len > 8) + (void)printf(" genid 0x%08x", + ntohl(*(u_int32_t *)&bp[8])); + (void)printf(" [nf 0x%02x]", bp[5]); + } + if (len > 12) { + int i; + for (i = 12; i + 3 < len; i += 4) + (void)printf("\n\t%s", + ipaddr_string(&bp[i])); + } + break; + case 2: + (void)printf(" report"); + if (vflag) + (void)printf(" [nf 0x%02x]", bp[5]); + if (len < 8) + (void)printf(" [len %d]", len); + break; + case 3: + case 5: + (void)printf(" %sneighbor query", + bp[1] == 5 ? "new " : ""); + if (len < 8) + (void)printf(" [len %d]", len); + break; + case 4: + case 6: + (void)printf(" %sneighbor list", + bp[1] == 6 ? "new " : ""); + if (len < 8) + (void)printf(" [len %d]", len); + break; + case 7: + (void)printf(" prune %s from ", ipaddr_string(&bp[12])); + (void)printf(" %s timer %d", ipaddr_string(&bp[8]), + ntohl(*(u_int32_t *)&bp[16])); + if (len != 20) + (void)printf(" [len %d]", len); + break; + case 8: + (void)printf(" graft %s from ", ipaddr_string(&bp[12])); + (void)printf(" %s", ipaddr_string(&bp[8])); + if (len != 16) + (void)printf(" [len %d]", len); + break; + case 9: + (void)printf(" graft ack %s from ", + ipaddr_string(&bp[12])); + (void)printf(" %s", ipaddr_string(&bp[8])); + if (len != 16) + (void)printf(" [len %d]", len); + break; + default: + (void)printf("-%d", bp[1]); + if (len != 8) + (void)printf(" [len %d]", len); + break; + } + + if (bp[7] != 3 || (bp[7] == 3 && (bp[6] > 5 || bp[6] < 4))) + (void)printf(" [v%d.%d]", bp[7], bp[6]); + break; case 0x13: (void)printf("igmp dvmrp"); @@ -191,10 +264,10 @@ igmp_print(register const u_char *bp, register u_int len, break; default: (void)printf("igmp-%d", bp[0] & 0xf); + if (bp[1]) + (void)printf(" [b1=0x%02x]", bp[1]); break; } - if ((bp[0] >> 4) != 1) - (void)printf(" [v%d]", bp[0] >> 4); TCHECK2(bp[0], len); if (vflag) { @@ -296,6 +369,12 @@ ip_optprint(register const u_char *cp, u_int length) ip_printroute("LSRR", cp, len); break; + case IPOPT_RA: + printf(" RA{%d}", len); + if (cp[2] != 0 || cp[3] != 0) + printf(" [b23=0x04%x]", cp[2] << 8 | cp[3]); + break; + default: printf(" IPOPT-%d{%d}", cp[0], len); break; |