print-carp.c revision 235530
1113656Sdeischen/*	$OpenBSD: print-carp.c,v 1.6 2009/10/27 23:59:55 deraadt Exp $	*/
2113656Sdeischen
3113656Sdeischen/*
4113656Sdeischen * Copyright (c) 2000 William C. Fenner.
5113656Sdeischen *                All rights reserved.
6113656Sdeischen *
7113656Sdeischen * Kevin Steves <ks@hp.se> July 2000
8113656Sdeischen * Modified to:
9113656Sdeischen * - print version, type string and packet length
10113656Sdeischen * - print IP address count if > 1 (-v)
11113656Sdeischen * - verify checksum (-v)
12113656Sdeischen * - print authentication string (-v)
13113656Sdeischen *
14113656Sdeischen * Copyright (c) 2011 Advanced Computing Technologies
15113656Sdeischen * George V. Neille-Neil
16113656Sdeischen *
17113656Sdeischen * Modified to:
18113656Sdeischen * - work correctly with CARP
19113656Sdeischen * - compile into the latest tcpdump
20113656Sdeischen * - print out the counter
21113656Sdeischen *
22113656Sdeischen * Redistribution and use in source and binary forms, with or without
23113656Sdeischen * modification, are permitted provided that: (1) source code
24113656Sdeischen * distributions retain the above copyright notice and this paragraph
25113656Sdeischen * in its entirety, and (2) distributions including binary code include
26113656Sdeischen * the above copyright notice and this paragraph in its entirety in
27113656Sdeischen * the documentation or other materials provided with the distribution.
28113656Sdeischen * The name of William C. Fenner may not be used to endorse or
29113656Sdeischen * promote products derived from this software without specific prior
30113656Sdeischen * written permission.  THIS SOFTWARE IS PROVIDED ``AS IS'' AND
31113656Sdeischen * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
32113656Sdeischen * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
33113656Sdeischen * FOR A PARTICULAR PURPOSE.
34118277Sdeischen *
35113656Sdeischen */
36113656Sdeischen
37118277Sdeischen#ifdef HAVE_CONFIG_H
38118277Sdeischen#include "config.h"
39113656Sdeischen#endif
40118510Sdeischen
41118510Sdeischen#include <tcpdump-stdinc.h>
42113656Sdeischen
43118510Sdeischen#include <stdio.h>
44118510Sdeischen#include <stdlib.h>
45116771Smarcel#include <unistd.h>
46118510Sdeischen
47118510Sdeischen#include <netinet/in.h>
48118510Sdeischen
49118510Sdeischen#include "interface.h"
50116771Smarcel#include "extract.h"
51118510Sdeischen#include "addrtoname.h"
52116771Smarcel
53118510Sdeischenvoid
54118510Sdeischencarp_print(register const u_char *bp, register u_int len, int ttl)
55118510Sdeischen{
56118510Sdeischen	int version, type;
57118510Sdeischen	const char *type_s;
58118510Sdeischen
59116771Smarcel	TCHECK(bp[0]);
60116771Smarcel	version = (bp[0] & 0xf0) >> 4;
61118510Sdeischen	type = bp[0] & 0x0f;
62118510Sdeischen	if (type == 1)
63118510Sdeischen		type_s = "advertise";
64118510Sdeischen	else
65118510Sdeischen		type_s = "unknown";
66118510Sdeischen	printf("CARPv%d-%s %d: ", version, type_s, len);
67118510Sdeischen	if (ttl != 255)
68118277Sdeischen		printf("[ttl=%d!] ", ttl);
69118510Sdeischen	if (version != 2 || type != 1)
70118510Sdeischen		return;
71118510Sdeischen	TCHECK(bp[2]);
72118510Sdeischen	TCHECK(bp[5]);
73118510Sdeischen	printf("vhid=%d advbase=%d advskew=%d authlen=%d ",
74118510Sdeischen	    bp[1], bp[5], bp[2], bp[3]);
75118510Sdeischen	if (vflag) {
76118510Sdeischen		struct cksum_vec vec[1];
77118510Sdeischen		vec[0].ptr = (const u_int8_t *)bp;
78118510Sdeischen		vec[0].len = len;
79118510Sdeischen		if (TTEST2(bp[0], len) && in_cksum(vec, 1))
80118510Sdeischen			printf(" (bad carp cksum %x!)",
81118510Sdeischen				EXTRACT_16BITS(&bp[6]));
82118510Sdeischen	}
83118510Sdeischen	printf("counter=%" PRIu64, EXTRACT_64BITS(&bp[8]));
84118510Sdeischen
85118510Sdeischen	return;
86118510Sdeischentrunc:
87118510Sdeischen	printf("[|carp]");
88118510Sdeischen}
89118510Sdeischen