summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Shalayeff <mickey@cvs.openbsd.org>2000-12-07 21:52:39 +0000
committerMichael Shalayeff <mickey@cvs.openbsd.org>2000-12-07 21:52:39 +0000
commitbd85d2acff58226498b294b9d51749150ca83e5f (patch)
tree92b298a2c0b88b54d3322057a4083620063c6ba1
parent0353f09e77ff22774bad03b240fe70961379a98b (diff)
add vrrp printing; from tcpdump.org
-rw-r--r--usr.sbin/tcpdump/Makefile4
-rw-r--r--usr.sbin/tcpdump/interface.h7
-rw-r--r--usr.sbin/tcpdump/print-ip.c49
-rw-r--r--usr.sbin/tcpdump/print-vrrp.c125
4 files changed, 165 insertions, 20 deletions
diff --git a/usr.sbin/tcpdump/Makefile b/usr.sbin/tcpdump/Makefile
index 8538352b555..63689daf937 100644
--- a/usr.sbin/tcpdump/Makefile
+++ b/usr.sbin/tcpdump/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.23 2000/10/19 16:31:41 jason Exp $
+# $OpenBSD: Makefile,v 1.24 2000/12/07 21:52:38 mickey Exp $
#
# Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994
# The Regents of the University of California. All rights reserved.
@@ -39,7 +39,7 @@ SRCS= tcpdump.c addrtoname.c \
print-icmp.c print-sl.c print-ppp.c print-rip.c \
print-snmp.c print-ntp.c print-null.c print-egp.c print-ospf.c \
print-fddi.c print-llc.c print-sunrpc.c \
- print-wb.c print-decnet.c print-isoclns.c print-ipx.c \
+ print-vrrp.c print-wb.c print-decnet.c print-isoclns.c print-ipx.c \
print-atm.c print-dvmrp.c print-krb.c print-pim.c print-netbios.c \
util.c bpf_dump.c parsenfsfh.c version.c machdep.c print-igrp.c \
print-gre.c print-radius.c print-enc.c print-cnfp.c \
diff --git a/usr.sbin/tcpdump/interface.h b/usr.sbin/tcpdump/interface.h
index faff4f3c59c..2e31910fa20 100644
--- a/usr.sbin/tcpdump/interface.h
+++ b/usr.sbin/tcpdump/interface.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: interface.h,v 1.18 2000/10/19 16:31:42 jason Exp $ */
+/* $OpenBSD: interface.h,v 1.19 2000/12/07 21:52:38 mickey Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
@@ -20,7 +20,7 @@
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * @(#) $Header: /cvs/OpenBSD/src/usr.sbin/tcpdump/interface.h,v 1.18 2000/10/19 16:31:42 jason Exp $ (LBL)
+ * @(#) $Header: /cvs/OpenBSD/src/usr.sbin/tcpdump/interface.h,v 1.19 2000/12/07 21:52:38 mickey Exp $ (LBL)
*/
#ifndef tcpdump_interface_h
@@ -199,6 +199,7 @@ extern void isoclns_print(const u_char *, u_int, u_int, const u_char *,
const u_char *);
extern void krb_print(const u_char *, u_int);
extern void l2tp_print(const u_char *dat, u_int length);
+extern void vrrp_print(const u_char *bp, u_int len, int ttl);
extern void nfsreply_print(const u_char *, u_int, const u_char *);
extern void nfsreq_print(const u_char *, u_int, const u_char *);
extern void ns_print(const u_char *, u_int);
@@ -238,3 +239,5 @@ extern int rt6_print(const u_char *, const u_char *);
extern void ospf6_print(const u_char *, u_int);
extern void dhcp6_print(const u_char *, u_int, u_short, u_short);
#endif /*INET6*/
+
+extern u_short in_cksum(const u_short *addr, register int len, u_short csum);
diff --git a/usr.sbin/tcpdump/print-ip.c b/usr.sbin/tcpdump/print-ip.c
index eeed57e1e98..b2d6cfbf1c0 100644
--- a/usr.sbin/tcpdump/print-ip.c
+++ b/usr.sbin/tcpdump/print-ip.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: print-ip.c,v 1.11 2000/10/03 14:31:57 ho Exp $ */
+/* $OpenBSD: print-ip.c,v 1.12 2000/12/07 21:52:38 mickey Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
@@ -23,7 +23,7 @@
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /cvs/OpenBSD/src/usr.sbin/tcpdump/print-ip.c,v 1.11 2000/10/03 14:31:57 ho Exp $ (LBL)";
+ "@(#) $Header: /cvs/OpenBSD/src/usr.sbin/tcpdump/print-ip.c,v 1.12 2000/12/07 21:52:38 mickey Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -318,23 +318,34 @@ ip_optprint(register const u_char *cp, u_int length)
* compute an IP header checksum.
* don't modifiy the packet.
*/
-static int
-in_cksum(const struct ip *ip)
+u_short
+in_cksum(const u_short *addr, register int len, u_short csum)
{
- register const u_short *sp = (u_short *)ip;
- register u_int32_t sum = 0;
- register int count;
+ int nleft = len;
+ const u_short *w = addr;
+ u_short answer;
+ int sum = csum;
+
+ /*
+ * Our algorithm is simple, using a 32 bit accumulator (sum),
+ * we add sequential 16 bit words to it, and at the end, fold
+ * back all the carry bits from the top 16 bits into the lower
+ * 16 bits.
+ */
+ while (nleft > 1) {
+ sum += *w++;
+ nleft -= 2;
+ }
+ if (nleft == 1)
+ sum += htons(*(u_char *)w<<8);
/*
- * No need for endian conversions.
+ * add back carry outs from top 16 bits to low 16 bits
*/
- for (count = ip->ip_hl * 2; --count >= 0; )
- sum += *sp++;
- while (sum > 0xffff)
- sum = (sum & 0xffff) + (sum >> 16);
- sum = ~sum & 0xffff;
-
- return (sum);
+ sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
+ sum += (sum >> 16); /* add carry */
+ answer = ~sum; /* truncate to 16 bits */
+ return (answer);
}
/*
@@ -520,6 +531,12 @@ ip_print(register const u_char *bp, register u_int length)
return;
}
break;
+#ifndef IPPROTO_VRRP
+#define IPPROTO_VRRP 112
+#endif
+ case IPPROTO_VRRP:
+ vrrp_print(cp, len, ip->ip_ttl);
+ break;
default:
(void)printf("%s > %s:", ipaddr_string(&ip->ip_src),
@@ -581,7 +598,7 @@ ip_print(register const u_char *bp, register u_int length)
sep = ", ";
}
if ((u_char *)ip + hlen <= snapend) {
- sum = in_cksum(ip);
+ sum = in_cksum((const u_short *)ip, hlen, 0);
if (sum != 0) {
(void)printf("%sbad cksum %x!", sep,
ntohs(ip->ip_sum));
diff --git a/usr.sbin/tcpdump/print-vrrp.c b/usr.sbin/tcpdump/print-vrrp.c
new file mode 100644
index 00000000000..263a38a3876
--- /dev/null
+++ b/usr.sbin/tcpdump/print-vrrp.c
@@ -0,0 +1,125 @@
+/* $OpenBSD: print-vrrp.c,v 1.1 2000/12/07 21:52:38 mickey Exp $ */
+
+/*
+ * Copyright (c) 2000 William C. Fenner.
+ * All rights reserved.
+ *
+ * Kevin Steves <ks@hp.se> July 2000
+ * Modified to:
+ * - print version, type string and packet length
+ * - print IP address count if > 1 (-v)
+ * - verify checksum (-v)
+ * - print authentication string (-v)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code
+ * distributions retain the above copyright notice and this paragraph
+ * in its entirety, and (2) distributions including binary code include
+ * the above copyright notice and this paragraph in its entirety in
+ * the documentation or other materials provided with the distribution.
+ * The name of William C. Fenner may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission. 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.
+ *
+ * from tcpdump.org:
+ * Header: /tcpdump/master/tcpdump/print-vrrp.c,v 1.3 2000/10/10 05:05:08 guy Exp
+ */
+
+#ifndef lint
+static const char rcsid[] =
+ "@(#) $Header: /cvs/OpenBSD/src/usr.sbin/tcpdump/print-vrrp.c,v 1.1 2000/12/07 21:52:38 mickey Exp $";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <netinet/in.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+/*
+ * RFC 2338:
+ * 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
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |Version| Type | Virtual Rtr ID| Priority | Count IP Addrs|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Auth Type | Adver Int | Checksum |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IP Address (1) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | . |
+ * | . |
+ * | . |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | IP Address (n) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Authentication Data (1) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Authentication Data (2) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+void
+vrrp_print(register const u_char *bp, register u_int len, int ttl)
+{
+ int version, type, auth_type;
+ char *type_s;
+
+ TCHECK(bp[0]);
+ version = (bp[0] & 0xf0) >> 4;
+ type = bp[0] & 0x0f;
+ if (type == 1)
+ type_s = "advertise";
+ else
+ type_s = "unknown";
+ printf("VRRPv%d-%s %d: ", version, type_s, len);
+ if (ttl != 255)
+ printf("[ttl=%d!] ", ttl);
+ if (version != 2 || type != 1)
+ return;
+ TCHECK(bp[2]);
+ printf("vrid=%d prio=%d", bp[1], bp[2]);
+ TCHECK(bp[5]);
+ auth_type = bp[4];
+ if (auth_type != 0)
+ printf(" authtype=%d", auth_type);
+ printf(" intvl=%d", bp[5]);
+ if (vflag) {
+ int naddrs = bp[3];
+ int i;
+ char c;
+
+ if (TTEST2(bp[0], len) && in_cksum((const u_short*)bp, len, 0))
+ printf(" (bad vrrp cksum %x!)",
+ EXTRACT_16BITS(&bp[6]));
+ printf(" addrs");
+ if (naddrs > 1)
+ printf("(%d)", naddrs);
+ printf(":");
+ c = ' ';
+ bp += 8;
+ for (i = 0; i < naddrs; i++) {
+ TCHECK(bp[3]);
+ printf("%c%s", c, ipaddr_string(bp));
+ c = ',';
+ bp += 4;
+ }
+ if (auth_type == 1) { /* simple text password */
+ TCHECK(bp[7]);
+ printf(" auth %.8s", bp);
+ }
+ }
+ return;
+trunc:
+ printf("[|vrrp]");
+}