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 26*3c602fabSXin LI #define NETDISSECT_REWORKED 27685295f4SBill Fenner #ifdef HAVE_CONFIG_H 28685295f4SBill Fenner #include "config.h" 29685295f4SBill Fenner #endif 30685295f4SBill Fenner 315b0fe478SBruce M Simpson #include <tcpdump-stdinc.h> 325b0fe478SBruce M Simpson 33685295f4SBill Fenner #include "interface.h" 34685295f4SBill Fenner #include "extract.h" 35685295f4SBill Fenner #include "addrtoname.h" 36685295f4SBill Fenner 37*3c602fabSXin LI #include "ip.h" 38*3c602fabSXin LI #include "ipproto.h" 39685295f4SBill Fenner /* 40*3c602fabSXin LI * RFC 2338 (VRRP v2): 41*3c602fabSXin LI * 42685295f4SBill Fenner * 0 1 2 3 43685295f4SBill 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 44685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 45685295f4SBill Fenner * |Version| Type | Virtual Rtr ID| Priority | Count IP Addrs| 46685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 47685295f4SBill Fenner * | Auth Type | Adver Int | Checksum | 48685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 49685295f4SBill Fenner * | IP Address (1) | 50685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 51685295f4SBill Fenner * | . | 52685295f4SBill Fenner * | . | 53685295f4SBill Fenner * | . | 54685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 55685295f4SBill Fenner * | IP Address (n) | 56685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 57685295f4SBill Fenner * | Authentication Data (1) | 58685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 59685295f4SBill Fenner * | Authentication Data (2) | 60685295f4SBill Fenner * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 61*3c602fabSXin LI * 62*3c602fabSXin LI * 63*3c602fabSXin LI * RFC 5798 (VRRP v3): 64*3c602fabSXin LI * 65*3c602fabSXin LI * 0 1 2 3 66*3c602fabSXin LI * 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 67*3c602fabSXin LI * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 68*3c602fabSXin LI * | IPv4 Fields or IPv6 Fields | 69*3c602fabSXin LI * ... ... 70*3c602fabSXin LI * | | 71*3c602fabSXin LI * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 72*3c602fabSXin LI * |Version| Type | Virtual Rtr ID| Priority |Count IPvX Addr| 73*3c602fabSXin LI * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 74*3c602fabSXin LI * |(rsvd) | Max Adver Int | Checksum | 75*3c602fabSXin LI * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 76*3c602fabSXin LI * | | 77*3c602fabSXin LI * + + 78*3c602fabSXin LI * | IPvX Address(es) | 79*3c602fabSXin LI * + + 80*3c602fabSXin LI * | | 81*3c602fabSXin LI * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 82685295f4SBill Fenner */ 83a90e161bSBill Fenner 84a90e161bSBill Fenner /* Type */ 85a90e161bSBill Fenner #define VRRP_TYPE_ADVERTISEMENT 1 86a90e161bSBill Fenner 87a90e161bSBill Fenner static const struct tok type2str[] = { 885b0fe478SBruce M Simpson { VRRP_TYPE_ADVERTISEMENT, "Advertisement" }, 89a90e161bSBill Fenner { 0, NULL } 90a90e161bSBill Fenner }; 91a90e161bSBill Fenner 92a90e161bSBill Fenner /* Auth Type */ 93a90e161bSBill Fenner #define VRRP_AUTH_NONE 0 94a90e161bSBill Fenner #define VRRP_AUTH_SIMPLE 1 95a90e161bSBill Fenner #define VRRP_AUTH_AH 2 96a90e161bSBill Fenner 97a90e161bSBill Fenner static const struct tok auth2str[] = { 98a90e161bSBill Fenner { VRRP_AUTH_NONE, "none" }, 99a90e161bSBill Fenner { VRRP_AUTH_SIMPLE, "simple" }, 100a90e161bSBill Fenner { VRRP_AUTH_AH, "ah" }, 101a90e161bSBill Fenner { 0, NULL } 102a90e161bSBill Fenner }; 103a90e161bSBill Fenner 104685295f4SBill Fenner void 105*3c602fabSXin LI vrrp_print(netdissect_options *ndo, 106*3c602fabSXin LI register const u_char *bp, register u_int len, 107*3c602fabSXin LI register const u_char *bp2, int ttl) 108685295f4SBill Fenner { 109*3c602fabSXin LI int version, type, auth_type = VRRP_AUTH_NONE; /* keep compiler happy */ 110a90e161bSBill Fenner const char *type_s; 111685295f4SBill Fenner 112*3c602fabSXin LI ND_TCHECK(bp[0]); 113685295f4SBill Fenner version = (bp[0] & 0xf0) >> 4; 114685295f4SBill Fenner type = bp[0] & 0x0f; 1155b0fe478SBruce M Simpson type_s = tok2str(type2str, "unknown type (%u)", type); 116*3c602fabSXin LI ND_PRINT((ndo, "VRRPv%u, %s", version, type_s)); 117685295f4SBill Fenner if (ttl != 255) 118*3c602fabSXin LI ND_PRINT((ndo, ", (ttl %u)", ttl)); 119*3c602fabSXin LI if (version < 2 || version > 3 || type != VRRP_TYPE_ADVERTISEMENT) 120685295f4SBill Fenner return; 121*3c602fabSXin LI ND_TCHECK(bp[2]); 122*3c602fabSXin LI ND_PRINT((ndo, ", vrid %u, prio %u", bp[1], bp[2])); 123*3c602fabSXin LI ND_TCHECK(bp[5]); 124*3c602fabSXin LI 125*3c602fabSXin LI if (version == 2) { 126685295f4SBill Fenner auth_type = bp[4]; 127*3c602fabSXin LI ND_PRINT((ndo, ", authtype %s", tok2str(auth2str, NULL, auth_type))); 128*3c602fabSXin LI ND_PRINT((ndo, ", intvl %us, length %u", bp[5], len)); 129*3c602fabSXin LI } else { /* version == 3 */ 130*3c602fabSXin LI uint16_t intvl = (bp[4] & 0x0f) << 8 | bp[5]; 131*3c602fabSXin LI ND_PRINT((ndo, ", intvl %ucs, length %u", intvl, len)); 132*3c602fabSXin LI } 133*3c602fabSXin LI 134*3c602fabSXin LI if (ndo->ndo_vflag) { 135685295f4SBill Fenner int naddrs = bp[3]; 136685295f4SBill Fenner int i; 137685295f4SBill Fenner char c; 138685295f4SBill Fenner 139*3c602fabSXin LI if (version == 2 && ND_TTEST2(bp[0], len)) { 140cac3dcd5SXin LI struct cksum_vec vec[1]; 141cac3dcd5SXin LI 142cac3dcd5SXin LI vec[0].ptr = bp; 143cac3dcd5SXin LI vec[0].len = len; 144cac3dcd5SXin LI if (in_cksum(vec, 1)) 145*3c602fabSXin LI ND_PRINT((ndo, ", (bad vrrp cksum %x)", 146*3c602fabSXin LI EXTRACT_16BITS(&bp[6]))); 147cac3dcd5SXin LI } 148*3c602fabSXin LI 149*3c602fabSXin LI if (version == 3 && ND_TTEST2(bp[0], len)) { 150*3c602fabSXin LI uint16_t cksum = nextproto4_cksum(ndo, (struct ip *)bp2, bp, 151*3c602fabSXin LI len, len, IPPROTO_VRRP); 152*3c602fabSXin LI if (cksum) 153*3c602fabSXin LI ND_PRINT((ndo, ", (bad vrrp cksum %x)", 154*3c602fabSXin LI EXTRACT_16BITS(&bp[6]))); 155*3c602fabSXin LI } 156*3c602fabSXin LI 157*3c602fabSXin LI ND_PRINT((ndo, ", addrs")); 158685295f4SBill Fenner if (naddrs > 1) 159*3c602fabSXin LI ND_PRINT((ndo, "(%d)", naddrs)); 160*3c602fabSXin LI ND_PRINT((ndo, ":")); 161685295f4SBill Fenner c = ' '; 162685295f4SBill Fenner bp += 8; 163685295f4SBill Fenner for (i = 0; i < naddrs; i++) { 164*3c602fabSXin LI ND_TCHECK(bp[3]); 165*3c602fabSXin LI ND_PRINT((ndo, "%c%s", c, ipaddr_string(ndo, bp))); 166685295f4SBill Fenner c = ','; 167685295f4SBill Fenner bp += 4; 168685295f4SBill Fenner } 169*3c602fabSXin LI if (version == 2 && auth_type == VRRP_AUTH_SIMPLE) { /* simple text password */ 170*3c602fabSXin LI ND_TCHECK(bp[7]); 171*3c602fabSXin LI ND_PRINT((ndo, " auth \"")); 172*3c602fabSXin LI if (fn_printn(ndo, bp, 8, ndo->ndo_snapend)) { 173*3c602fabSXin LI ND_PRINT((ndo, "\"")); 174f4d0c64aSSam Leffler goto trunc; 175f4d0c64aSSam Leffler } 176*3c602fabSXin LI ND_PRINT((ndo, "\"")); 177685295f4SBill Fenner } 178685295f4SBill Fenner } 179685295f4SBill Fenner return; 180685295f4SBill Fenner trunc: 181*3c602fabSXin LI ND_PRINT((ndo, "[|vrrp]")); 182685295f4SBill Fenner } 183