1
0
mirror of https://github.com/openbsd/src.git synced 2025-01-09 22:38:01 -08:00

add vrrp printing; from tcpdump.org

This commit is contained in:
mickey 2000-12-07 21:52:38 +00:00
parent 1ac40323a1
commit f366d6b49b
4 changed files with 165 additions and 20 deletions

View File

@ -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 \

View File

@ -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: /home/cvs/src/usr.sbin/tcpdump/interface.h,v 1.18 2000/10/19 16:31:42 jason Exp $ (LBL)
* @(#) $Header: /home/cvs/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);

View File

@ -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: /home/cvs/src/usr.sbin/tcpdump/print-ip.c,v 1.11 2000/10/03 14:31:57 ho Exp $ (LBL)";
"@(#) $Header: /home/cvs/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));

View File

@ -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: /home/cvs/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]");
}