1 /* 2 * Copyright (c) 2000 William C. Fenner. 3 * All rights reserved. 4 * 5 * Kevin Steves <ks@hp.se> July 2000 6 * Modified to: 7 * - print version, type string and packet length 8 * - print IP address count if > 1 (-v) 9 * - verify checksum (-v) 10 * - print authentication string (-v) 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that: (1) source code 14 * distributions retain the above copyright notice and this paragraph 15 * in its entirety, and (2) distributions including binary code include 16 * the above copyright notice and this paragraph in its entirety in 17 * the documentation or other materials provided with the distribution. 18 * The name of William C. Fenner may not be used to endorse or 19 * promote products derived from this software without specific prior 20 * written permission. THIS SOFTWARE IS PROVIDED ``AS IS'' AND 21 * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 22 * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 * FOR A PARTICULAR PURPOSE. 24 */ 25 26 #ifndef lint 27 static const char rcsid[] _U_ = 28 "@(#) $Header: /tcpdump/master/tcpdump/print-vrrp.c,v 1.10 2005-05-06 07:56:54 guy Exp $"; 29 #endif 30 31 #ifdef HAVE_CONFIG_H 32 #include "config.h" 33 #endif 34 35 #include <tcpdump-stdinc.h> 36 37 #include <stdio.h> 38 #include <stdlib.h> 39 40 #include "interface.h" 41 #include "extract.h" 42 #include "addrtoname.h" 43 44 /* 45 * RFC 2338: 46 * 0 1 2 3 47 * 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 48 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 49 * |Version| Type | Virtual Rtr ID| Priority | Count IP Addrs| 50 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 51 * | Auth Type | Adver Int | Checksum | 52 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 53 * | IP Address (1) | 54 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 55 * | . | 56 * | . | 57 * | . | 58 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 59 * | IP Address (n) | 60 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 61 * | Authentication Data (1) | 62 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 63 * | Authentication Data (2) | 64 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 65 */ 66 67 /* Type */ 68 #define VRRP_TYPE_ADVERTISEMENT 1 69 70 static const struct tok type2str[] = { 71 { VRRP_TYPE_ADVERTISEMENT, "Advertisement" }, 72 { 0, NULL } 73 }; 74 75 /* Auth Type */ 76 #define VRRP_AUTH_NONE 0 77 #define VRRP_AUTH_SIMPLE 1 78 #define VRRP_AUTH_AH 2 79 80 static const struct tok auth2str[] = { 81 { VRRP_AUTH_NONE, "none" }, 82 { VRRP_AUTH_SIMPLE, "simple" }, 83 { VRRP_AUTH_AH, "ah" }, 84 { 0, NULL } 85 }; 86 87 void 88 vrrp_print(register const u_char *bp, register u_int len, int ttl) 89 { 90 int version, type, auth_type; 91 const char *type_s; 92 93 TCHECK(bp[0]); 94 version = (bp[0] & 0xf0) >> 4; 95 type = bp[0] & 0x0f; 96 type_s = tok2str(type2str, "unknown type (%u)", type); 97 printf("VRRPv%u, %s", version, type_s); 98 if (ttl != 255) 99 printf(", (ttl %u)", ttl); 100 if (version != 2 || type != VRRP_TYPE_ADVERTISEMENT) 101 return; 102 TCHECK(bp[2]); 103 printf(", vrid %u, prio %u", bp[1], bp[2]); 104 TCHECK(bp[5]); 105 auth_type = bp[4]; 106 printf(", authtype %s", tok2str(auth2str, NULL, auth_type)); 107 printf(", intvl %us, length %u", bp[5],len); 108 if (vflag) { 109 int naddrs = bp[3]; 110 int i; 111 char c; 112 113 if (TTEST2(bp[0], len)) { 114 struct cksum_vec vec[1]; 115 116 vec[0].ptr = bp; 117 vec[0].len = len; 118 if (in_cksum(vec, 1)) 119 printf(", (bad vrrp cksum %x)", 120 EXTRACT_16BITS(&bp[6])); 121 } 122 printf(", addrs"); 123 if (naddrs > 1) 124 printf("(%d)", naddrs); 125 printf(":"); 126 c = ' '; 127 bp += 8; 128 for (i = 0; i < naddrs; i++) { 129 TCHECK(bp[3]); 130 printf("%c%s", c, ipaddr_string(bp)); 131 c = ','; 132 bp += 4; 133 } 134 if (auth_type == VRRP_AUTH_SIMPLE) { /* simple text password */ 135 TCHECK(bp[7]); 136 printf(" auth \""); 137 if (fn_printn(bp, 8, snapend)) { 138 printf("\""); 139 goto trunc; 140 } 141 printf("\""); 142 } 143 } 144 return; 145 trunc: 146 printf("[|vrrp]"); 147 } 148