12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 2000 William C. Fenner. 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Kevin Steves <ks@hp.se> July 2000 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Modified to: 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * - print version, type string and packet length 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * - print IP address count if > 1 (-v) 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * - verify checksum (-v) 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * - print authentication string (-v) 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions retain the above copyright notice and this paragraph 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in its entirety, and (2) distributions including binary code include 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the above copyright notice and this paragraph in its entirety in 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the documentation or other materials provided with the distribution. 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The name of William C. Fenner may not be used to endorse or 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * promote products derived from this software without specific prior 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission. THIS SOFTWARE IS PROVIDED ``AS IS'' AND 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR A PARTICULAR PURPOSE. 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "@(#) $Header: /tcpdump/master/tcpdump/print-vrrp.c,v 1.9.2.1 2005/05/06 07:57:20 guy Exp $"; 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h> 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * RFC 2338: 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 1 2 3 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 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 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |Version| Type | Virtual Rtr ID| Priority | Count IP Addrs| 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Auth Type | Adver Int | Checksum | 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | IP Address (1) | 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | . | 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | . | 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | . | 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | IP Address (n) | 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Authentication Data (1) | 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Authentication Data (2) | 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Type */ 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define VRRP_TYPE_ADVERTISEMENT 1 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok type2str[] = { 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { VRRP_TYPE_ADVERTISEMENT, "Advertisement" }, 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Auth Type */ 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define VRRP_AUTH_NONE 0 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define VRRP_AUTH_SIMPLE 1 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define VRRP_AUTH_AH 2 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok auth2str[] = { 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { VRRP_AUTH_NONE, "none" }, 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { VRRP_AUTH_SIMPLE, "simple" }, 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { VRRP_AUTH_AH, "ah" }, 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvrrp_print(register const u_char *bp, register u_int len, int ttl) 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int version, type, auth_type; 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *type_s; 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp[0]); 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project version = (bp[0] & 0xf0) >> 4; 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project type = bp[0] & 0x0f; 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project type_s = tok2str(type2str, "unknown type (%u)", type); 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("VRRPv%u, %s", version, type_s); 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ttl != 255) 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", (ttl %u)", ttl); 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (version != 2 || type != VRRP_TYPE_ADVERTISEMENT) 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp[2]); 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", vrid %u, prio %u", bp[1], bp[2]); 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp[5]); 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project auth_type = bp[4]; 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", authtype %s", tok2str(auth2str, NULL, auth_type)); 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", intvl %us, length %u", bp[5],len); 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) { 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int naddrs = bp[3]; 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char c; 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (TTEST2(bp[0], len) && in_cksum((const u_short*)bp, len, 0)) 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", (bad vrrp cksum %x)", 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&bp[6])); 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", addrs"); 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (naddrs > 1) 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(%d)", naddrs); 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(":"); 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = ' '; 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += 8; 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < naddrs; i++) { 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp[3]); 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%c%s", c, ipaddr_string(bp)); 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = ','; 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += 4; 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (auth_type == VRRP_AUTH_SIMPLE) { /* simple text password */ 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp[7]); 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" auth \""); 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fn_printn(bp, 8, snapend)) { 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\""); 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\""); 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|vrrp]"); 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 142