153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*	$OpenBSD: print-carp.c,v 1.6 2009/10/27 23:59:55 deraadt Exp $	*/
253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
353f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Copyright (c) 2000 William C. Fenner.
553f17a9db278d33517d9888dd77848f554522a38JP Abgrall *                All rights reserved.
653f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Kevin Steves <ks@hp.se> July 2000
853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Modified to:
953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * - print version, type string and packet length
1053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * - print IP address count if > 1 (-v)
1153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * - verify checksum (-v)
1253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * - print authentication string (-v)
1353f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
1453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Copyright (c) 2011 Advanced Computing Technologies
1553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * George V. Neille-Neil
1653f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
1753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Modified to:
1853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * - work correctly with CARP
1953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * - compile into the latest tcpdump
2053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * - print out the counter
2153f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
2253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Redistribution and use in source and binary forms, with or without
2353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * modification, are permitted provided that: (1) source code
2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * distributions retain the above copyright notice and this paragraph
2553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * in its entirety, and (2) distributions including binary code include
2653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the above copyright notice and this paragraph in its entirety in
2753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the documentation or other materials provided with the distribution.
2853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * The name of William C. Fenner may not be used to endorse or
2953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * promote products derived from this software without specific prior
3053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * written permission.  THIS SOFTWARE IS PROVIDED ``AS IS'' AND
3153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
3253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
3353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * FOR A PARTICULAR PURPOSE.
3453f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
3553f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
3653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
3753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_CONFIG_H
3853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "config.h"
3953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
4053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <tcpdump-stdinc.h>
4253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <stdio.h>
4453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <stdlib.h>
4553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "interface.h"
4753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "extract.h"
4853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "addrtoname.h"
4953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
5053f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid
5153f17a9db278d33517d9888dd77848f554522a38JP Abgrallcarp_print(register const u_char *bp, register u_int len, int ttl)
5253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
5353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int version, type;
5453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const char *type_s;
5553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
5653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	TCHECK(bp[0]);
5753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	version = (bp[0] & 0xf0) >> 4;
5853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	type = bp[0] & 0x0f;
5953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (type == 1)
6053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		type_s = "advertise";
6153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	else
6253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		type_s = "unknown";
6353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printf("CARPv%d-%s %d: ", version, type_s, len);
6453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ttl != 255)
6553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("[ttl=%d!] ", ttl);
6653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (version != 2 || type != 1)
6753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return;
6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	TCHECK(bp[2]);
6953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	TCHECK(bp[5]);
7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printf("vhid=%d advbase=%d advskew=%d authlen=%d ",
7153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    bp[1], bp[5], bp[2], bp[3]);
7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (vflag) {
7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		struct cksum_vec vec[1];
7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		vec[0].ptr = (const u_int8_t *)bp;
7553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		vec[0].len = len;
7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (TTEST2(bp[0], len) && in_cksum(vec, 1))
7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" (bad carp cksum %x!)",
7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				EXTRACT_16BITS(&bp[6]));
7953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printf("counter=%" PRIu64, EXTRACT_64BITS(&bp[8]));
8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
8253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return;
8353f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
8453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printf("[|carp]");
8553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
86