X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/525194da30b85e3c00453287ff31014c8b9090f9..ad06a893cfd3acca3fba38d8b39b6b15dd3053ea:/print-pim.c diff --git a/print-pim.c b/print-pim.c index ca004947..87a611be 100644 --- a/print-pim.c +++ b/print-pim.c @@ -21,18 +21,14 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-pim.c,v 1.25 2001-04-27 02:18:27 fenner Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-pim.c,v 1.36 2002-12-11 07:14:06 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include -#include -#include - -#include +#include /* * XXX: We consider a case where IPv6 is not ready yet for portability, @@ -56,7 +52,6 @@ struct pim { #include #include -#include #include "interface.h" #include "addrtoname.h" @@ -96,10 +91,16 @@ pimv1_join_prune_print(register const u_char *bp, register u_int len) } TCHECK2(bp[0], 4); - (void)printf("\n Upstream Nbr: %s", ipaddr_string(bp)); + if (vflag > 1) + (void)printf("\n"); + (void)printf(" Upstream Nbr: %s", ipaddr_string(bp)); TCHECK2(bp[6], 2); - (void)printf("\n Hold time: "); + if (vflag > 1) + (void)printf("\n"); + (void)printf(" Hold time: "); relts_print(EXTRACT_16BITS(&bp[6])); + if (vflag < 2) + return; bp += 8; len -= 8; @@ -121,7 +122,7 @@ pimv1_join_prune_print(register const u_char *bp, register u_int len) bp += 12; len -= 12; for (njp = 0; njp < (njoin + nprune); njp++) { - char *type; + const char *type; if (njp < njoin) type = "Join "; @@ -252,7 +253,9 @@ trunc: /* * auto-RP is a cisco protocol, documented at - * ftp://ftpeng.cisco.com/ipmulticast/pim-autorp-spec01.txt + * ftp://ftpeng.cisco.com/ipmulticast/specs/pim-autorp-spec01.txt + * + * This implements version 1+, dated Sept 9, 1998. */ void cisco_autorp_print(register const u_char *bp, register u_int len) @@ -321,6 +324,8 @@ cisco_autorp_print(register const u_char *bp, register u_int len) case 3: printf(" PIMv1+2"); break; } + if (bp[4] & 0xfc) + (void)printf(" [rsvd=0x%02x]", bp[4] & 0xfc); TCHECK(bp[5]); nentries = bp[5]; bp += 6; len -= 6; @@ -329,6 +334,8 @@ cisco_autorp_print(register const u_char *bp, register u_int len) TCHECK2(bp[0], 6); (void)printf("%c%s%s/%d", s, bp[0] & 1 ? "!" : "", ipaddr_string(&bp[2]), bp[1]); + if (bp[0] & 0xfe) + (void)printf("[rsvd=0x%02x]", bp[0] & 0xfe); s = ','; bp += 6; len -= 6; } @@ -410,11 +417,6 @@ static int pimv2_addr_len; enum pimv2_addrtype { pimv2_unicast, pimv2_group, pimv2_source }; -#if 0 -static char *addrtypestr[] = { - "unicast", "group", "source" -}; -#endif /* 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 @@ -440,7 +442,7 @@ static int pimv2_addr_print(const u_char *bp, enum pimv2_addrtype at, int silent) { int af; - char *afstr; + const char *afstr; int len, hdrlen; TCHECK(bp[0]); @@ -577,7 +579,36 @@ pimv2_print(register const u_char *bp, register u_int len) (void)printf(")"); break; + case 2: /* LAN Prune Delay */ + (void)printf(" (LAN-Prune-Delay: "); + if (olen != 4) { + (void)printf("!olen=%d!)", olen); + } else { + char t_bit; + u_int16_t lan_delay, override_interval; + lan_delay = EXTRACT_16BITS(&bp[4]); + override_interval = EXTRACT_16BITS(&bp[6]); + t_bit = (lan_delay & 0x8000)? 1 : 0; + lan_delay &= ~0x8000; + (void)printf("T-bit=%d lan-delay=%dms override-interval=%dms)", + t_bit, lan_delay, override_interval); + } + break; + + case 18: /* Old DR-Priority */ + if (olen == 4) + (void)printf(" (OLD-DR-Priority: %d)", + EXTRACT_32BITS(&bp[4])); + else + goto unknown; + break; + + case 19: /* DR-Priority */ + if (olen == 0) { + (void)printf(" (OLD-bidir-capable)"); + break; + } (void)printf(" (DR-Priority: "); if (olen != 4) { (void)printf("!olen=%d!)", olen); @@ -591,9 +622,13 @@ pimv2_print(register const u_char *bp, register u_int len) break; case 21: - (void)printf(" (State Refresh Capable"); - if (EXTRACT_32BITS(&bp[4]) != 1) { - (void)printf(" ?0x%x?", EXTRACT_32BITS(&bp[4])); + (void)printf(" (State Refresh Capable; v%d", bp[4]); + if (bp[5] != 0) { + (void)printf(" interval "); + relts_print(bp[5]); + } + if (EXTRACT_16BITS(&bp[6]) != 0) { + (void)printf(" ?0x%04x?", EXTRACT_16BITS(&bp[6])); } (void)printf(")"); break; @@ -603,6 +638,7 @@ pimv2_print(register const u_char *bp, register u_int len) break; default: + unknown: if (vflag) (void)printf(" [Hello option %d]", otype); }