print-vrrp.c revision 98524
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 2775115Sfennerstatic const char rcsid[] = 2898524Sfenner "@(#) $Header: /tcpdump/master/tcpdump/print-vrrp.c,v 1.5 2001/07/23 22:27:30 fenner Exp $"; 2975115Sfenner#endif 3075115Sfenner 3175115Sfenner#ifdef HAVE_CONFIG_H 3275115Sfenner#include "config.h" 3375115Sfenner#endif 3475115Sfenner 3575115Sfenner#include <stdio.h> 3675115Sfenner#include <stdlib.h> 3775115Sfenner#include <unistd.h> 3875115Sfenner 3975115Sfenner#include <netinet/in.h> 4075115Sfenner 4175115Sfenner#include "interface.h" 4275115Sfenner#include "extract.h" 4375115Sfenner#include "addrtoname.h" 4475115Sfenner 4575115Sfenner/* 4675115Sfenner * RFC 2338: 4775115Sfenner * 0 1 2 3 4875115Sfenner * 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 4975115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5075115Sfenner * |Version| Type | Virtual Rtr ID| Priority | Count IP Addrs| 5175115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5275115Sfenner * | Auth Type | Adver Int | Checksum | 5375115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5475115Sfenner * | IP Address (1) | 5575115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5675115Sfenner * | . | 5775115Sfenner * | . | 5875115Sfenner * | . | 5975115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6075115Sfenner * | IP Address (n) | 6175115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6275115Sfenner * | Authentication Data (1) | 6375115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6475115Sfenner * | Authentication Data (2) | 6575115Sfenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6675115Sfenner */ 6798524Sfenner 6898524Sfenner/* Type */ 6998524Sfenner#define VRRP_TYPE_ADVERTISEMENT 1 7098524Sfenner 7198524Sfennerstatic const struct tok type2str[] = { 7298524Sfenner { VRRP_TYPE_ADVERTISEMENT, "advertisement" }, 7398524Sfenner { 0, NULL } 7498524Sfenner}; 7598524Sfenner 7698524Sfenner/* Auth Type */ 7798524Sfenner#define VRRP_AUTH_NONE 0 7898524Sfenner#define VRRP_AUTH_SIMPLE 1 7998524Sfenner#define VRRP_AUTH_AH 2 8098524Sfenner 8198524Sfennerstatic const struct tok auth2str[] = { 8298524Sfenner { VRRP_AUTH_NONE, "none" }, 8398524Sfenner { VRRP_AUTH_SIMPLE, "simple" }, 8498524Sfenner { VRRP_AUTH_AH, "ah" }, 8598524Sfenner { 0, NULL } 8698524Sfenner}; 8798524Sfenner 8875115Sfennervoid 8975115Sfennervrrp_print(register const u_char *bp, register u_int len, int ttl) 9075115Sfenner{ 9175115Sfenner int version, type, auth_type; 9298524Sfenner const char *type_s; 9375115Sfenner 9475115Sfenner TCHECK(bp[0]); 9575115Sfenner version = (bp[0] & 0xf0) >> 4; 9675115Sfenner type = bp[0] & 0x0f; 9798524Sfenner type_s = tok2str(type2str, "type#%d", type); 9875115Sfenner printf("VRRPv%d-%s %d: ", version, type_s, len); 9975115Sfenner if (ttl != 255) 10075115Sfenner printf("[ttl=%d!] ", ttl); 10198524Sfenner if (version != 2 || type != VRRP_TYPE_ADVERTISEMENT) 10275115Sfenner return; 10375115Sfenner TCHECK(bp[2]); 10475115Sfenner printf("vrid=%d prio=%d", bp[1], bp[2]); 10575115Sfenner TCHECK(bp[5]); 10675115Sfenner auth_type = bp[4]; 10798524Sfenner printf(" authtype=%s", tok2str(auth2str, NULL, auth_type)); 10875115Sfenner printf(" intvl=%d", bp[5]); 10975115Sfenner if (vflag) { 11075115Sfenner int naddrs = bp[3]; 11175115Sfenner int i; 11275115Sfenner char c; 11375115Sfenner 11475115Sfenner if (TTEST2(bp[0], len) && in_cksum((const u_short*)bp, len, 0)) 11575115Sfenner printf(" (bad vrrp cksum %x!)", 11675115Sfenner EXTRACT_16BITS(&bp[6])); 11775115Sfenner printf(" addrs"); 11875115Sfenner if (naddrs > 1) 11975115Sfenner printf("(%d)", naddrs); 12075115Sfenner printf(":"); 12175115Sfenner c = ' '; 12275115Sfenner bp += 8; 12375115Sfenner for (i = 0; i < naddrs; i++) { 12475115Sfenner TCHECK(bp[3]); 12575115Sfenner printf("%c%s", c, ipaddr_string(bp)); 12675115Sfenner c = ','; 12775115Sfenner bp += 4; 12875115Sfenner } 12998524Sfenner if (auth_type == VRRP_AUTH_SIMPLE) { /* simple text password */ 13075115Sfenner TCHECK(bp[7]); 13198524Sfenner printf(" auth \""); 13298524Sfenner fn_printn(bp, 8, NULL); 13398524Sfenner printf("\""); 13475115Sfenner } 13575115Sfenner } 13675115Sfenner return; 13775115Sfennertrunc: 13875115Sfenner printf("[|vrrp]"); 13975115Sfenner} 140