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