*/
#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)";
+static const char rcsid[] _U_ =
+ "@(#) $Header: /tcpdump/master/tcpdump/print-pim.c,v 1.39 2003-11-16 09:36:32 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
+#include <tcpdump-stdinc.h>
/*
* XXX: We consider a case where IPv6 is not ready yet for portability,
#include <stdio.h>
#include <stdlib.h>
-#include <unistd.h>
#include "interface.h"
#include "addrtoname.h"
}
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;
bp += 12;
len -= 12;
for (njp = 0; njp < (njoin + nprune); njp++) {
- char *type;
+ const char *type;
if (njp < njoin)
type = "Join ";
/*
* 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)
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;
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;
}
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
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]);
(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);
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;
(void)printf(" (bidir-capable)");
break;
+ case 24: /* Address List */
+ case 65001: /* Address List (old implementations) */
+ (void)printf(" (%saddr-list",
+ otype == 65001 ? "old" : "");
+ if (vflag > 1) {
+ const u_char *ptr = &bp[4];
+ while (ptr < &bp[4 + olen]) {
+ int advance;
+
+ printf(" ");
+ advance = pimv2_addr_print(ptr, pimv2_unicast, 0);
+ if (advance < 0) {
+ printf("...");
+ break;
+ }
+ ptr += advance;
+ }
+ }
+ (void)printf(")");
+ break;
default:
+ unknown:
if (vflag)
(void)printf(" [Hello option %d]", otype);
}