#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-pim.c,v 1.48 2005-07-11 20:15:33 hannes Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-pim.c,v 1.49 2006-02-13 01:31:35 hannes Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
{ 0, NULL}
};
+#define PIMV2_REGISTER_FLAG_LEN 4
+#define PIMV2_REGISTER_FLAG_BORDER 0x80000000
+#define PIMV2_REGISTER_FLAG_NULL 0x40000000
+
+static struct tok pimv2_register_flag_values[] = {
+ { PIMV2_REGISTER_FLAG_BORDER, "Border" },
+ { PIMV2_REGISTER_FLAG_NULL, "Null" },
+ { 0, NULL}
+};
/*
* XXX: We consider a case where IPv6 is not ready yet for portability,
#include "ip.h"
-static void pimv2_print(register const u_char *bp, register u_int len);
+static void pimv2_print(register const u_char *bp, register u_int len, u_int cksum);
static void
pimv1_join_prune_print(register const u_char *bp, register u_int len)
}
void
-pim_print(register const u_char *bp, register u_int len)
+pim_print(register const u_char *bp, register u_int len, u_int cksum)
{
register const u_char *ep;
register struct pim *pim = (struct pim *)bp;
switch (PIM_VER(pim->pim_typever)) {
case 2:
if (!vflag) {
- printf("PIMv%u, %s, length: %u",
+ 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",
+ 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);
+ pimv2_print(bp, len, cksum);
}
break;
default:
- printf("PIMv%u, length: %u",
+ printf("PIMv%u, length %u",
PIM_VER(pim->pim_typever),
len);
break;
}
static void
-pimv2_print(register const u_char *bp, register u_int len)
+pimv2_print(register const u_char *bp, register u_int len, u_int cksum)
{
register const u_char *ep;
register struct pim *pim = (struct pim *)bp;
if (pimv2_addr_len != 0)
(void)printf(", RFC2117-encoding");
+ printf(", cksum 0x%04x ", EXTRACT_16BITS(&pim->pim_cksum));
+ if (EXTRACT_16BITS(&pim->pim_cksum) == 0) {
+ printf("(unverified)");
+ } else {
+ printf("(%scorrect)", TTEST2(bp[0], len) && cksum ? "in" : "" );
+ }
+
switch (PIM_TYPE(pim->pim_typever)) {
case PIMV2_TYPE_HELLO:
{
olen = EXTRACT_16BITS(&bp[2]);
TCHECK2(bp[0], 4 + olen);
- printf("\n\t %s Option (%u), length: %u, Value: ",
+ printf("\n\t %s Option (%u), length %u, Value: ",
tok2str( pimv2_hello_option_values,"Unknown",otype),
otype,
olen);
{
struct ip *ip;
- if (vflag && bp + 8 <= ep) {
- (void)printf(" %s%s", bp[4] & 0x80 ? "B" : "",
- bp[4] & 0x40 ? "N" : "");
- }
- bp += 8; len -= 8;
+ if (!TTEST2(*(bp+4), PIMV2_REGISTER_FLAG_LEN))
+ goto trunc;
+
+ printf(", Flags [ %s ]\n\t",
+ tok2str(pimv2_register_flag_values,
+ "none",
+ EXTRACT_32BITS(bp+4)));
+ bp += 8; len -= 8;
/* encapsulated multicast packet */
- if (bp >= ep)
- break;
ip = (struct ip *)bp;
switch (IP_V(ip)) {
+ case 0: /* Null header */
+ (void)printf("IP-Null-header %s > %s",
+ ipaddr_string(&ip->ip_src),
+ ipaddr_string(&ip->ip_dst));
+ break;
+
case 4: /* IPv4 */
- printf(" ");
ip_print(gndo, bp, len);
break;
#ifdef INET6
case 6: /* IPv6 */
- printf(" ");
ip6_print(bp, len);
break;
#endif
- default:
- (void)printf(" IP ver %d", IP_V(ip));
- break;
+ default:
+ (void)printf("IP ver %d", IP_V(ip));
+ break;
}
break;
}