summaryrefslogtreecommitdiffstats
path: root/contrib/tcpdump/print-pim.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tcpdump/print-pim.c')
-rw-r--r--contrib/tcpdump/print-pim.c292
1 files changed, 107 insertions, 185 deletions
diff --git a/contrib/tcpdump/print-pim.c b/contrib/tcpdump/print-pim.c
index 9bdbd630..4aa4983 100644
--- a/contrib/tcpdump/print-pim.c
+++ b/contrib/tcpdump/print-pim.c
@@ -17,11 +17,13 @@
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $FreeBSD$
*/
#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-pim.c,v 1.45 2005/04/06 21:32:42 mcr Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-pim.c,v 1.37.2.4 2004/03/24 02:52:37 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@@ -29,56 +31,6 @@ static const char rcsid[] _U_ =
#endif
#include <tcpdump-stdinc.h>
-#include "interface.h"
-
-#define PIMV2_TYPE_HELLO 0
-#define PIMV2_TYPE_REGISTER 1
-#define PIMV2_TYPE_REGISTER_STOP 2
-#define PIMV2_TYPE_JOIN_PRUNE 3
-#define PIMV2_TYPE_BOOTSTRAP 4
-#define PIMV2_TYPE_ASSERT 5
-#define PIMV2_TYPE_GRAFT 6
-#define PIMV2_TYPE_GRAFT_ACK 7
-#define PIMV2_TYPE_CANDIDATE_RP 8
-#define PIMV2_TYPE_PRUNE_REFRESH 9
-
-static struct tok pimv2_type_values[] = {
- { PIMV2_TYPE_HELLO, "Hello" },
- { PIMV2_TYPE_REGISTER, "Register" },
- { PIMV2_TYPE_REGISTER_STOP, "Register Stop" },
- { PIMV2_TYPE_JOIN_PRUNE, "Join / Prune" },
- { PIMV2_TYPE_BOOTSTRAP, "Bootstrap" },
- { PIMV2_TYPE_ASSERT, "Assert" },
- { PIMV2_TYPE_GRAFT, "Graft" },
- { PIMV2_TYPE_GRAFT_ACK, "Graft Acknowledgement" },
- { PIMV2_TYPE_CANDIDATE_RP, "Candidate RP Advertisement" },
- { PIMV2_TYPE_PRUNE_REFRESH, "Prune Refresh" },
- { 0, NULL}
-};
-
-#define PIMV2_HELLO_OPTION_HOLDTIME 1
-#define PIMV2_HELLO_OPTION_LANPRUNEDELAY 2
-#define PIMV2_HELLO_OPTION_DR_PRIORITY_OLD 18
-#define PIMV2_HELLO_OPTION_DR_PRIORITY 19
-#define PIMV2_HELLO_OPTION_GENID 20
-#define PIMV2_HELLO_OPTION_REFRESH_CAP 21
-#define PIMV2_HELLO_OPTION_BIDIR_CAP 22
-#define PIMV2_HELLO_OPTION_ADDRESS_LIST 24
-#define PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD 65001
-
-static struct tok pimv2_hello_option_values[] = {
- { PIMV2_HELLO_OPTION_HOLDTIME, "Hold Time" },
- { PIMV2_HELLO_OPTION_LANPRUNEDELAY, "LAN Prune Delay" },
- { PIMV2_HELLO_OPTION_DR_PRIORITY_OLD, "DR Priority (Old)" },
- { PIMV2_HELLO_OPTION_DR_PRIORITY, "DR Priority" },
- { PIMV2_HELLO_OPTION_GENID, "Generation ID" },
- { PIMV2_HELLO_OPTION_REFRESH_CAP, "State Refresh Capability" },
- { PIMV2_HELLO_OPTION_BIDIR_CAP, "Bi-Directional Capability" },
- { PIMV2_HELLO_OPTION_ADDRESS_LIST, "Address List" },
- { PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD, "Address List (Old)" },
- { 0, NULL}
-};
-
/*
* XXX: We consider a case where IPv6 is not ready yet for portability,
@@ -413,25 +365,12 @@ pim_print(register const u_char *bp, register u_int len)
#endif
switch (PIM_VER(pim->pim_typever)) {
- case 2:
- if (!vflag) {
- printf("PIMv%u, %s, length: %u",
- PIM_VER(pim->pim_typever),
- tok2str(pimv2_type_values,"Unknown Type",PIM_TYPE(pim->pim_typever)),
- len);
- return;
- } else {
- printf("PIMv%u, length: %u\n\t%s",
- PIM_VER(pim->pim_typever),
- len,
- tok2str(pimv2_type_values,"Unknown Type",PIM_TYPE(pim->pim_typever)));
- pimv2_print(bp, len);
- }
- break;
+ case 2: /* avoid hardcoding? */
+ (void)printf("pim v2");
+ pimv2_print(bp, len);
+ break;
default:
- printf("PIMv%u, length: %u",
- PIM_VER(pim->pim_typever),
- len);
+ (void)printf("pim v%d", PIM_VER(pim->pim_typever));
break;
}
return;
@@ -624,86 +563,94 @@ pimv2_print(register const u_char *bp, register u_int len)
TCHECK(pim->pim_rsv);
pimv2_addr_len = pim->pim_rsv;
if (pimv2_addr_len != 0)
- (void)printf(", RFC2117-encoding");
+ (void)printf("[RFC2117-encoding] ");
switch (PIM_TYPE(pim->pim_typever)) {
- case PIMV2_TYPE_HELLO:
+ case 0:
{
u_int16_t otype, olen;
+ (void)printf(" Hello");
bp += 4;
while (bp < ep) {
TCHECK2(bp[0], 4);
otype = EXTRACT_16BITS(&bp[0]);
olen = EXTRACT_16BITS(&bp[2]);
TCHECK2(bp[0], 4 + olen);
-
- printf("\n\t %s Option (%u), length: %u, Value: ",
- tok2str( pimv2_hello_option_values,"Unknown",otype),
- otype,
- olen);
- bp += 4;
-
switch (otype) {
- case PIMV2_HELLO_OPTION_HOLDTIME:
- relts_print(EXTRACT_16BITS(bp));
- break;
+ case 1: /* Hold time */
+ (void)printf(" (Hold-time ");
+ relts_print(EXTRACT_16BITS(&bp[4]));
+ (void)printf(")");
+ break;
- case PIMV2_HELLO_OPTION_LANPRUNEDELAY:
+ case 2: /* LAN Prune Delay */
+ (void)printf(" (LAN-Prune-Delay: ");
if (olen != 4) {
- (void)printf("ERROR: Option Lenght != 4 Bytes (%u)", olen);
+ (void)printf("!olen=%d!)", olen);
} else {
char t_bit;
u_int16_t lan_delay, override_interval;
- lan_delay = EXTRACT_16BITS(bp);
- override_interval = EXTRACT_16BITS(bp+2);
+ lan_delay = EXTRACT_16BITS(&bp[4]);
+ override_interval = EXTRACT_16BITS(&bp[6]);
t_bit = (lan_delay & 0x8000)? 1 : 0;
lan_delay &= ~0x8000;
- (void)printf("\n\t T-bit=%d, LAN delay %dms, Override interval %dms",
+ (void)printf("T-bit=%d lan-delay=%dms override-interval=%dms)",
t_bit, lan_delay, override_interval);
}
break;
- case PIMV2_HELLO_OPTION_DR_PRIORITY_OLD:
- case PIMV2_HELLO_OPTION_DR_PRIORITY:
- switch (olen) {
- case 0:
- printf("Bi-Directional Capability (Old)");
- break;
- case 4:
- printf("%u", EXTRACT_32BITS(bp));
- break;
- default:
- printf("ERROR: Option Lenght != 4 Bytes (%u)", olen);
- break;
- }
- break;
-
- case PIMV2_HELLO_OPTION_GENID:
- (void)printf("0x%08x", EXTRACT_32BITS(bp));
+ 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);
+ } else {
+ (void)printf("%d)", EXTRACT_32BITS(&bp[4]));
+ }
+ break;
+
+ case 20:
+ (void)printf(" (Genid: 0x%08x)", EXTRACT_32BITS(&bp[4]));
break;
- case PIMV2_HELLO_OPTION_REFRESH_CAP:
- (void)printf("v%d", *bp);
- if (*(bp+1) != 0) {
- (void)printf(", interval ");
- relts_print(*(bp+1));
+ case 21:
+ (void)printf(" (State Refresh Capable; v%d", bp[4]);
+ if (bp[5] != 0) {
+ (void)printf(" interval ");
+ relts_print(bp[5]);
}
- if (EXTRACT_16BITS(bp+2) != 0) {
- (void)printf(" ?0x%04x?", EXTRACT_16BITS(bp+2));
+ if (EXTRACT_16BITS(&bp[6]) != 0) {
+ (void)printf(" ?0x%04x?", EXTRACT_16BITS(&bp[6]));
}
+ (void)printf(")");
break;
- case PIMV2_HELLO_OPTION_BIDIR_CAP:
+ case 22: /* Bidir-Capable */
+ (void)printf(" (bidir-capable)");
break;
- case PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD:
- case PIMV2_HELLO_OPTION_ADDRESS_LIST:
+ 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;
- while (ptr < (bp+olen)) {
+ const u_char *ptr = &bp[4];
+ while (ptr < &bp[4 + olen]) {
int advance;
- printf("\n\t ");
+ printf(" ");
advance = pimv2_addr_print(ptr, pimv2_unicast, 0);
if (advance < 0) {
printf("...");
@@ -712,24 +659,23 @@ pimv2_print(register const u_char *bp, register u_int len)
ptr += advance;
}
}
+ (void)printf(")");
break;
default:
- if (vflag <= 1)
- print_unknown_data(bp,"\n\t ",olen);
- break;
+ unknown:
+ if (vflag)
+ (void)printf(" [Hello option %d]", otype);
}
- /* do we want to see an additionally hexdump ? */
- if (vflag> 1)
- print_unknown_data(bp,"\n\t ",olen);
- bp += olen;
+ bp += 4 + olen;
}
break;
}
- case PIMV2_TYPE_REGISTER:
+ case 1:
{
struct ip *ip;
+ (void)printf(" Register");
if (vflag && bp + 8 <= ep) {
(void)printf(" %s%s", bp[4] & 0x80 ? "B" : "",
bp[4] & 0x40 ? "N" : "");
@@ -743,7 +689,7 @@ pimv2_print(register const u_char *bp, register u_int len)
switch (IP_V(ip)) {
case 4: /* IPv4 */
printf(" ");
- ip_print(gndo, bp, len);
+ ip_print(bp, len);
break;
#ifdef INET6
case 6: /* IPv6 */
@@ -758,7 +704,8 @@ pimv2_print(register const u_char *bp, register u_int len)
break;
}
- case PIMV2_TYPE_REGISTER_STOP:
+ case 2:
+ (void)printf(" Register-Stop");
bp += 4; len -= 4;
if (bp >= ep)
break;
@@ -778,46 +725,9 @@ pimv2_print(register const u_char *bp, register u_int len)
bp += advance; len -= advance;
break;
- case PIMV2_TYPE_JOIN_PRUNE:
- case PIMV2_TYPE_GRAFT:
- case PIMV2_TYPE_GRAFT_ACK:
-
-
- /*
- * 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
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |PIM Ver| Type | Addr length | Checksum |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | Unicast-Upstream Neighbor Address |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | Reserved | Num groups | Holdtime |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | Encoded-Multicast Group Address-1 |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | Number of Joined Sources | Number of Pruned Sources |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | Encoded-Joined Source Address-1 |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | . |
- * | . |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | Encoded-Joined Source Address-n |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | Encoded-Pruned Source Address-1 |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | . |
- * | . |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | Encoded-Pruned Source Address-n |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | . |
- * | . |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | Encoded-Multicast Group Address-n |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- */
-
+ case 3:
+ case 6:
+ case 7:
{
u_int8_t ngroup;
u_int16_t holdtime;
@@ -825,11 +735,22 @@ pimv2_print(register const u_char *bp, register u_int len)
u_int16_t nprune;
int i, j;
+ switch (PIM_TYPE(pim->pim_typever)) {
+ case 3:
+ (void)printf(" Join/Prune");
+ break;
+ case 6:
+ (void)printf(" Graft");
+ break;
+ case 7:
+ (void)printf(" Graft-ACK");
+ break;
+ }
bp += 4; len -= 4;
if (PIM_TYPE(pim->pim_typever) != 7) { /*not for Graft-ACK*/
if (bp >= ep)
break;
- (void)printf(", upstream-neighbor: ");
+ (void)printf(" upstream-neighbor=");
if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
(void)printf("...");
break;
@@ -840,11 +761,11 @@ pimv2_print(register const u_char *bp, register u_int len)
break;
ngroup = bp[1];
holdtime = EXTRACT_16BITS(&bp[2]);
- (void)printf("\n\t %u group(s)", ngroup);
+ (void)printf(" groups=%u", ngroup);
if (PIM_TYPE(pim->pim_typever) != 7) { /*not for Graft-ACK*/
- (void)printf(", holdtime: ");
+ (void)printf(" holdtime=");
if (holdtime == 0xffff)
- (void)printf("infinite");
+ (void)printf("infty");
else
relts_print(holdtime);
}
@@ -852,7 +773,7 @@ pimv2_print(register const u_char *bp, register u_int len)
for (i = 0; i < ngroup; i++) {
if (bp >= ep)
goto jp_done;
- (void)printf("\n\t group #%u: ", i+1);
+ (void)printf(" (group%d: ", i);
if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {
(void)printf("...)");
goto jp_done;
@@ -864,32 +785,36 @@ pimv2_print(register const u_char *bp, register u_int len)
}
njoin = EXTRACT_16BITS(&bp[0]);
nprune = EXTRACT_16BITS(&bp[2]);
- (void)printf(", joined sources: %u, pruned sources: %u", njoin,nprune);
+ (void)printf(" join=%u", njoin);
bp += 4; len -= 4;
for (j = 0; j < njoin; j++) {
- (void)printf("\n\t joined source #%u: ",j+1);
+ (void)printf(" ");
if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) {
(void)printf("...)");
goto jp_done;
}
bp += advance; len -= advance;
}
+ (void)printf(" prune=%u", nprune);
for (j = 0; j < nprune; j++) {
- (void)printf("\n\t pruned source #%u: ",j+1);
+ (void)printf(" ");
if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) {
(void)printf("...)");
goto jp_done;
}
bp += advance; len -= advance;
}
+ (void)printf(")");
}
jp_done:
break;
}
- case PIMV2_TYPE_BOOTSTRAP:
+ case 4:
{
int i, j, frpcnt;
+
+ (void)printf(" Bootstrap");
bp += 4;
/* Fragment Tag, Hash Mask len, and BSR-priority */
@@ -963,7 +888,8 @@ pimv2_print(register const u_char *bp, register u_int len)
bs_done:
break;
}
- case PIMV2_TYPE_ASSERT:
+ case 5:
+ (void)printf(" Assert");
bp += 4; len -= 4;
if (bp >= ep)
break;
@@ -989,9 +915,11 @@ pimv2_print(register const u_char *bp, register u_int len)
(void)printf(" metric=%u", EXTRACT_32BITS(&bp[4]));
break;
- case PIMV2_TYPE_CANDIDATE_RP:
+ case 8:
{
int i, pfxcnt;
+
+ (void)printf(" Candidate-RP-Advertisement");
bp += 4;
/* Prefix-Cnt, Priority, and Holdtime */
@@ -1027,7 +955,8 @@ pimv2_print(register const u_char *bp, register u_int len)
break;
}
- case PIMV2_TYPE_PRUNE_REFRESH:
+ case 9:
+ (void)printf(" Prune-Refresh");
(void)printf(" src=");
if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {
(void)printf("...");
@@ -1062,10 +991,3 @@ pimv2_print(register const u_char *bp, register u_int len)
trunc:
(void)printf("[|pim]");
}
-
-/*
- * Local Variables:
- * c-style: whitesmith
- * c-basic-offset: 8
- * End:
- */
OpenPOWER on IntegriCloud