175115Sfenner/* 275115Sfenner * Copyright (c) 2000 William C. Fenner. 375115Sfenner * All rights reserved. 475115Sfenner * 575115Sfenner * Kevin Steves <ks@hp.se> July 2000 675115Sfenner * Modified to: 775115Sfenner * - print version, type string and packet length 875115Sfenner * - print IP address count if > 1 (-v) 975115Sfenner * - verify checksum (-v) 1075115Sfenner * - print authentication string (-v) 1175115Sfenner * 1275115Sfenner * Redistribution and use in source and binary forms, with or without 1375115Sfenner * modification, are permitted provided that: (1) source code 1475115Sfenner * distributions retain the above copyright notice and this paragraph 1575115Sfenner * in its entirety, and (2) distributions including binary code include 1675115Sfenner * the above copyright notice and this paragraph in its entirety in 1775115Sfenner * the documentation or other materials provided with the distribution. 1875115Sfenner * The name of William C. Fenner may not be used to endorse or 1975115Sfenner * promote products derived from this software without specific prior 2075115Sfenner * written permission. THIS SOFTWARE IS PROVIDED ``AS IS'' AND 2175115Sfenner * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 2275115Sfenner * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 2375115Sfenner * FOR A PARTICULAR PURPOSE. 2475115Sfenner */ 2575115Sfenner 2675115Sfenner#ifndef lint 27127668Sbmsstatic const char rcsid[] _U_ = 28190207Srpaulo "@(#) $Header: /tcpdump/master/tcpdump/print-vrrp.c,v 1.10 2005-05-06 07:56:54 guy Exp $"; 2975115Sfenner#endif 3075115Sfenner 3175115Sfenner#ifdef HAVE_CONFIG_H 3275115Sfenner#include "config.h" 3375115Sfenner#endif 3475115Sfenner 35127668Sbms#include <tcpdump-stdinc.h> 36127668Sbms 3775115Sfenner#include <stdio.h> 3875115Sfenner#include <stdlib.h> 3975115Sfenner 4075115Sfenner#include "interface.h" 4175115Sfenner#include "extract.h" 4275115Sfenner#include "addrtoname.h" 4375115Sfenner 4475115Sfenner/* 4575115Sfenner * RFC 2338: 4675115Sfenner * 0 1 2 3 4775115Sfenner * 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 4875115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4975115Sfenner * |Version| Type | Virtual Rtr ID| Priority | Count IP Addrs| 5075115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5175115Sfenner * | Auth Type | Adver Int | Checksum | 5275115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5375115Sfenner * | IP Address (1) | 5475115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5575115Sfenner * | . | 5675115Sfenner * | . | 5775115Sfenner * | . | 5875115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5975115Sfenner * | IP Address (n) | 6075115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6175115Sfenner * | Authentication Data (1) | 6275115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6375115Sfenner * | Authentication Data (2) | 6475115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6575115Sfenner */ 6698524Sfenner 6798524Sfenner/* Type */ 6898524Sfenner#define VRRP_TYPE_ADVERTISEMENT 1 6998524Sfenner 7098524Sfennerstatic const struct tok type2str[] = { 71127668Sbms { VRRP_TYPE_ADVERTISEMENT, "Advertisement" }, 7298524Sfenner { 0, NULL } 7398524Sfenner}; 7498524Sfenner 7598524Sfenner/* Auth Type */ 7698524Sfenner#define VRRP_AUTH_NONE 0 7798524Sfenner#define VRRP_AUTH_SIMPLE 1 7898524Sfenner#define VRRP_AUTH_AH 2 7998524Sfenner 8098524Sfennerstatic const struct tok auth2str[] = { 8198524Sfenner { VRRP_AUTH_NONE, "none" }, 8298524Sfenner { VRRP_AUTH_SIMPLE, "simple" }, 8398524Sfenner { VRRP_AUTH_AH, "ah" }, 8498524Sfenner { 0, NULL } 8598524Sfenner}; 8698524Sfenner 8775115Sfennervoid 8875115Sfennervrrp_print(register const u_char *bp, register u_int len, int ttl) 8975115Sfenner{ 9075115Sfenner int version, type, auth_type; 9198524Sfenner const char *type_s; 9275115Sfenner 9375115Sfenner TCHECK(bp[0]); 9475115Sfenner version = (bp[0] & 0xf0) >> 4; 9575115Sfenner type = bp[0] & 0x0f; 96127668Sbms type_s = tok2str(type2str, "unknown type (%u)", type); 97127668Sbms printf("VRRPv%u, %s", version, type_s); 9875115Sfenner if (ttl != 255) 99127668Sbms printf(", (ttl %u)", ttl); 10098524Sfenner if (version != 2 || type != VRRP_TYPE_ADVERTISEMENT) 10175115Sfenner return; 10275115Sfenner TCHECK(bp[2]); 103127668Sbms printf(", vrid %u, prio %u", bp[1], bp[2]); 10475115Sfenner TCHECK(bp[5]); 10575115Sfenner auth_type = bp[4]; 106127668Sbms printf(", authtype %s", tok2str(auth2str, NULL, auth_type)); 107127668Sbms printf(", intvl %us, length %u", bp[5],len); 10875115Sfenner if (vflag) { 10975115Sfenner int naddrs = bp[3]; 11075115Sfenner int i; 11175115Sfenner char c; 11275115Sfenner 113235530Sdelphij if (TTEST2(bp[0], len)) { 114235530Sdelphij struct cksum_vec vec[1]; 115235530Sdelphij 116235530Sdelphij vec[0].ptr = bp; 117235530Sdelphij vec[0].len = len; 118235530Sdelphij if (in_cksum(vec, 1)) 119235530Sdelphij printf(", (bad vrrp cksum %x)", 120235530Sdelphij EXTRACT_16BITS(&bp[6])); 121235530Sdelphij } 122127668Sbms printf(", addrs"); 12375115Sfenner if (naddrs > 1) 12475115Sfenner printf("(%d)", naddrs); 12575115Sfenner printf(":"); 12675115Sfenner c = ' '; 12775115Sfenner bp += 8; 12875115Sfenner for (i = 0; i < naddrs; i++) { 12975115Sfenner TCHECK(bp[3]); 13075115Sfenner printf("%c%s", c, ipaddr_string(bp)); 13175115Sfenner c = ','; 13275115Sfenner bp += 4; 13375115Sfenner } 13498524Sfenner if (auth_type == VRRP_AUTH_SIMPLE) { /* simple text password */ 13575115Sfenner TCHECK(bp[7]); 13698524Sfenner printf(" auth \""); 137147899Ssam if (fn_printn(bp, 8, snapend)) { 138147899Ssam printf("\""); 139147899Ssam goto trunc; 140147899Ssam } 14198524Sfenner printf("\""); 14275115Sfenner } 14375115Sfenner } 14475115Sfenner return; 14575115Sfennertrunc: 14675115Sfenner printf("[|vrrp]"); 14775115Sfenner} 148