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