1685295f4SBill Fenner /* 2685295f4SBill Fenner * Copyright (c) 2000 William C. Fenner. 3685295f4SBill Fenner * All rights reserved. 4685295f4SBill Fenner * 5685295f4SBill Fenner * Kevin Steves <ks@hp.se> July 2000 6685295f4SBill Fenner * Modified to: 7685295f4SBill Fenner * - print version, type string and packet length 8685295f4SBill Fenner * - print IP address count if > 1 (-v) 9685295f4SBill Fenner * - verify checksum (-v) 10685295f4SBill Fenner * - print authentication string (-v) 11685295f4SBill Fenner * 12685295f4SBill Fenner * Redistribution and use in source and binary forms, with or without 13685295f4SBill Fenner * modification, are permitted provided that: (1) source code 14685295f4SBill Fenner * distributions retain the above copyright notice and this paragraph 15685295f4SBill Fenner * in its entirety, and (2) distributions including binary code include 16685295f4SBill Fenner * the above copyright notice and this paragraph in its entirety in 17685295f4SBill Fenner * the documentation or other materials provided with the distribution. 18685295f4SBill Fenner * The name of William C. Fenner may not be used to endorse or 19685295f4SBill Fenner * promote products derived from this software without specific prior 20685295f4SBill Fenner * written permission. THIS SOFTWARE IS PROVIDED ``AS IS'' AND 21685295f4SBill Fenner * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 22685295f4SBill Fenner * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23685295f4SBill Fenner * FOR A PARTICULAR PURPOSE. 24685295f4SBill Fenner */ 25685295f4SBill Fenner 26685295f4SBill Fenner #ifndef lint 275b0fe478SBruce M Simpson static const char rcsid[] _U_ = 28a5779b6eSRui Paulo "@(#) $Header: /tcpdump/master/tcpdump/print-vrrp.c,v 1.10 2005-05-06 07:56:54 guy Exp $"; 29685295f4SBill Fenner #endif 30685295f4SBill Fenner 31685295f4SBill Fenner #ifdef HAVE_CONFIG_H 32685295f4SBill Fenner #include "config.h" 33685295f4SBill Fenner #endif 34685295f4SBill Fenner 355b0fe478SBruce M Simpson #include <tcpdump-stdinc.h> 365b0fe478SBruce M Simpson 37685295f4SBill Fenner #include <stdio.h> 38685295f4SBill Fenner #include <stdlib.h> 39685295f4SBill Fenner 40685295f4SBill Fenner #include "interface.h" 41685295f4SBill Fenner #include "extract.h" 42685295f4SBill Fenner #include "addrtoname.h" 43685295f4SBill Fenner 44685295f4SBill Fenner /* 45685295f4SBill Fenner * RFC 2338: 46685295f4SBill Fenner * 0 1 2 3 47685295f4SBill Fenner * 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 48685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 49685295f4SBill Fenner * |Version| Type | Virtual Rtr ID| Priority | Count IP Addrs| 50685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 51685295f4SBill Fenner * | Auth Type | Adver Int | Checksum | 52685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 53685295f4SBill Fenner * | IP Address (1) | 54685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 55685295f4SBill Fenner * | . | 56685295f4SBill Fenner * | . | 57685295f4SBill Fenner * | . | 58685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 59685295f4SBill Fenner * | IP Address (n) | 60685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 61685295f4SBill Fenner * | Authentication Data (1) | 62685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 63685295f4SBill Fenner * | Authentication Data (2) | 64685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 65685295f4SBill Fenner */ 66a90e161bSBill Fenner 67a90e161bSBill Fenner /* Type */ 68a90e161bSBill Fenner #define VRRP_TYPE_ADVERTISEMENT 1 69a90e161bSBill Fenner 70a90e161bSBill Fenner static const struct tok type2str[] = { 715b0fe478SBruce M Simpson { VRRP_TYPE_ADVERTISEMENT, "Advertisement" }, 72a90e161bSBill Fenner { 0, NULL } 73a90e161bSBill Fenner }; 74a90e161bSBill Fenner 75a90e161bSBill Fenner /* Auth Type */ 76a90e161bSBill Fenner #define VRRP_AUTH_NONE 0 77a90e161bSBill Fenner #define VRRP_AUTH_SIMPLE 1 78a90e161bSBill Fenner #define VRRP_AUTH_AH 2 79a90e161bSBill Fenner 80a90e161bSBill Fenner static const struct tok auth2str[] = { 81a90e161bSBill Fenner { VRRP_AUTH_NONE, "none" }, 82a90e161bSBill Fenner { VRRP_AUTH_SIMPLE, "simple" }, 83a90e161bSBill Fenner { VRRP_AUTH_AH, "ah" }, 84a90e161bSBill Fenner { 0, NULL } 85a90e161bSBill Fenner }; 86a90e161bSBill Fenner 87685295f4SBill Fenner void 88685295f4SBill Fenner vrrp_print(register const u_char *bp, register u_int len, int ttl) 89685295f4SBill Fenner { 90685295f4SBill Fenner int version, type, auth_type; 91a90e161bSBill Fenner const char *type_s; 92685295f4SBill Fenner 93685295f4SBill Fenner TCHECK(bp[0]); 94685295f4SBill Fenner version = (bp[0] & 0xf0) >> 4; 95685295f4SBill Fenner type = bp[0] & 0x0f; 965b0fe478SBruce M Simpson type_s = tok2str(type2str, "unknown type (%u)", type); 975b0fe478SBruce M Simpson printf("VRRPv%u, %s", version, type_s); 98685295f4SBill Fenner if (ttl != 255) 995b0fe478SBruce M Simpson printf(", (ttl %u)", ttl); 100a90e161bSBill Fenner if (version != 2 || type != VRRP_TYPE_ADVERTISEMENT) 101685295f4SBill Fenner return; 102685295f4SBill Fenner TCHECK(bp[2]); 1035b0fe478SBruce M Simpson printf(", vrid %u, prio %u", bp[1], bp[2]); 104685295f4SBill Fenner TCHECK(bp[5]); 105685295f4SBill Fenner auth_type = bp[4]; 1065b0fe478SBruce M Simpson printf(", authtype %s", tok2str(auth2str, NULL, auth_type)); 1075b0fe478SBruce M Simpson printf(", intvl %us, length %u", bp[5],len); 108685295f4SBill Fenner if (vflag) { 109685295f4SBill Fenner int naddrs = bp[3]; 110685295f4SBill Fenner int i; 111685295f4SBill Fenner char c; 112685295f4SBill Fenner 113*cac3dcd5SXin LI if (TTEST2(bp[0], len)) { 114*cac3dcd5SXin LI struct cksum_vec vec[1]; 115*cac3dcd5SXin LI 116*cac3dcd5SXin LI vec[0].ptr = bp; 117*cac3dcd5SXin LI vec[0].len = len; 118*cac3dcd5SXin LI if (in_cksum(vec, 1)) 1195b0fe478SBruce M Simpson printf(", (bad vrrp cksum %x)", 120685295f4SBill Fenner EXTRACT_16BITS(&bp[6])); 121*cac3dcd5SXin LI } 1225b0fe478SBruce M Simpson printf(", addrs"); 123685295f4SBill Fenner if (naddrs > 1) 124685295f4SBill Fenner printf("(%d)", naddrs); 125685295f4SBill Fenner printf(":"); 126685295f4SBill Fenner c = ' '; 127685295f4SBill Fenner bp += 8; 128685295f4SBill Fenner for (i = 0; i < naddrs; i++) { 129685295f4SBill Fenner TCHECK(bp[3]); 130685295f4SBill Fenner printf("%c%s", c, ipaddr_string(bp)); 131685295f4SBill Fenner c = ','; 132685295f4SBill Fenner bp += 4; 133685295f4SBill Fenner } 134a90e161bSBill Fenner if (auth_type == VRRP_AUTH_SIMPLE) { /* simple text password */ 135685295f4SBill Fenner TCHECK(bp[7]); 136a90e161bSBill Fenner printf(" auth \""); 137f4d0c64aSSam Leffler if (fn_printn(bp, 8, snapend)) { 138f4d0c64aSSam Leffler printf("\""); 139f4d0c64aSSam Leffler goto trunc; 140f4d0c64aSSam Leffler } 141a90e161bSBill Fenner printf("\""); 142685295f4SBill Fenner } 143685295f4SBill Fenner } 144685295f4SBill Fenner return; 145685295f4SBill Fenner trunc: 146685295f4SBill Fenner printf("[|vrrp]"); 147685295f4SBill Fenner } 148