xref: /minix3/external/bsd/tcpdump/dist/print-hsrp.c (revision b636d99d91c3d54204248f643c14627405d4afd1)
1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek  * Copyright (C) 2001 Julian Cowley
3*b636d99dSDavid van Moolenbroek  * All rights reserved.
4*b636d99dSDavid van Moolenbroek  *
5*b636d99dSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
6*b636d99dSDavid van Moolenbroek  * modification, are permitted provided that the following conditions
7*b636d99dSDavid van Moolenbroek  * are met:
8*b636d99dSDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
9*b636d99dSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
10*b636d99dSDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
11*b636d99dSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
12*b636d99dSDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
13*b636d99dSDavid van Moolenbroek  * 3. Neither the name of the project nor the names of its contributors
14*b636d99dSDavid van Moolenbroek  *    may be used to endorse or promote products derived from this software
15*b636d99dSDavid van Moolenbroek  *    without specific prior written permission.
16*b636d99dSDavid van Moolenbroek  *
17*b636d99dSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
18*b636d99dSDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*b636d99dSDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*b636d99dSDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
21*b636d99dSDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*b636d99dSDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23*b636d99dSDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24*b636d99dSDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25*b636d99dSDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26*b636d99dSDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27*b636d99dSDavid van Moolenbroek  * SUCH DAMAGE.
28*b636d99dSDavid van Moolenbroek  */
29*b636d99dSDavid van Moolenbroek 
30*b636d99dSDavid van Moolenbroek /* Cisco Hot Standby Router Protocol (HSRP). */
31*b636d99dSDavid van Moolenbroek 
32*b636d99dSDavid van Moolenbroek #include <sys/cdefs.h>
33*b636d99dSDavid van Moolenbroek #ifndef lint
34*b636d99dSDavid van Moolenbroek __RCSID("$NetBSD: print-hsrp.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
35*b636d99dSDavid van Moolenbroek #endif
36*b636d99dSDavid van Moolenbroek 
37*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
38*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
39*b636d99dSDavid van Moolenbroek #include "config.h"
40*b636d99dSDavid van Moolenbroek #endif
41*b636d99dSDavid van Moolenbroek 
42*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
43*b636d99dSDavid van Moolenbroek 
44*b636d99dSDavid van Moolenbroek #include "interface.h"
45*b636d99dSDavid van Moolenbroek #include "addrtoname.h"
46*b636d99dSDavid van Moolenbroek 
47*b636d99dSDavid van Moolenbroek /* HSRP op code types. */
48*b636d99dSDavid van Moolenbroek static const char *op_code_str[] = {
49*b636d99dSDavid van Moolenbroek 	"hello",
50*b636d99dSDavid van Moolenbroek 	"coup",
51*b636d99dSDavid van Moolenbroek 	"resign"
52*b636d99dSDavid van Moolenbroek };
53*b636d99dSDavid van Moolenbroek 
54*b636d99dSDavid van Moolenbroek /* HSRP states and associated names. */
55*b636d99dSDavid van Moolenbroek static const struct tok states[] = {
56*b636d99dSDavid van Moolenbroek 	{  0, "initial" },
57*b636d99dSDavid van Moolenbroek 	{  1, "learn" },
58*b636d99dSDavid van Moolenbroek 	{  2, "listen" },
59*b636d99dSDavid van Moolenbroek 	{  4, "speak" },
60*b636d99dSDavid van Moolenbroek 	{  8, "standby" },
61*b636d99dSDavid van Moolenbroek 	{ 16, "active" },
62*b636d99dSDavid van Moolenbroek 	{  0, NULL }
63*b636d99dSDavid van Moolenbroek };
64*b636d99dSDavid van Moolenbroek 
65*b636d99dSDavid van Moolenbroek /*
66*b636d99dSDavid van Moolenbroek  * RFC 2281:
67*b636d99dSDavid van Moolenbroek  *
68*b636d99dSDavid van Moolenbroek  *  0                   1                   2                   3
69*b636d99dSDavid van Moolenbroek  *  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
70*b636d99dSDavid van Moolenbroek  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71*b636d99dSDavid van Moolenbroek  * |   Version     |   Op Code     |     State     |   Hellotime   |
72*b636d99dSDavid van Moolenbroek  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
73*b636d99dSDavid van Moolenbroek  * |   Holdtime    |   Priority    |     Group     |   Reserved    |
74*b636d99dSDavid van Moolenbroek  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
75*b636d99dSDavid van Moolenbroek  * |                      Authentication  Data                     |
76*b636d99dSDavid van Moolenbroek  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77*b636d99dSDavid van Moolenbroek  * |                      Authentication  Data                     |
78*b636d99dSDavid van Moolenbroek  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79*b636d99dSDavid van Moolenbroek  * |                      Virtual IP Address                       |
80*b636d99dSDavid van Moolenbroek  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
81*b636d99dSDavid van Moolenbroek  */
82*b636d99dSDavid van Moolenbroek 
83*b636d99dSDavid van Moolenbroek #define HSRP_AUTH_SIZE	8
84*b636d99dSDavid van Moolenbroek 
85*b636d99dSDavid van Moolenbroek /* HSRP protocol header. */
86*b636d99dSDavid van Moolenbroek struct hsrp {
87*b636d99dSDavid van Moolenbroek 	uint8_t		hsrp_version;
88*b636d99dSDavid van Moolenbroek 	uint8_t		hsrp_op_code;
89*b636d99dSDavid van Moolenbroek 	uint8_t		hsrp_state;
90*b636d99dSDavid van Moolenbroek 	uint8_t		hsrp_hellotime;
91*b636d99dSDavid van Moolenbroek 	uint8_t		hsrp_holdtime;
92*b636d99dSDavid van Moolenbroek 	uint8_t		hsrp_priority;
93*b636d99dSDavid van Moolenbroek 	uint8_t		hsrp_group;
94*b636d99dSDavid van Moolenbroek 	uint8_t		hsrp_reserved;
95*b636d99dSDavid van Moolenbroek 	uint8_t		hsrp_authdata[HSRP_AUTH_SIZE];
96*b636d99dSDavid van Moolenbroek 	struct in_addr	hsrp_virtaddr;
97*b636d99dSDavid van Moolenbroek };
98*b636d99dSDavid van Moolenbroek 
99*b636d99dSDavid van Moolenbroek void
hsrp_print(netdissect_options * ndo,register const uint8_t * bp,register u_int len)100*b636d99dSDavid van Moolenbroek hsrp_print(netdissect_options *ndo, register const uint8_t *bp, register u_int len)
101*b636d99dSDavid van Moolenbroek {
102*b636d99dSDavid van Moolenbroek 	struct hsrp *hp = (struct hsrp *) bp;
103*b636d99dSDavid van Moolenbroek 
104*b636d99dSDavid van Moolenbroek 	ND_TCHECK(hp->hsrp_version);
105*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "HSRPv%d", hp->hsrp_version));
106*b636d99dSDavid van Moolenbroek 	if (hp->hsrp_version != 0)
107*b636d99dSDavid van Moolenbroek 		return;
108*b636d99dSDavid van Moolenbroek 	ND_TCHECK(hp->hsrp_op_code);
109*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "-"));
110*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "%s ", tok2strary(op_code_str, "unknown (%d)", hp->hsrp_op_code)));
111*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "%d: ", len));
112*b636d99dSDavid van Moolenbroek 	ND_TCHECK(hp->hsrp_state);
113*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "state=%s ", tok2str(states, "Unknown (%d)", hp->hsrp_state)));
114*b636d99dSDavid van Moolenbroek 	ND_TCHECK(hp->hsrp_group);
115*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "group=%d ", hp->hsrp_group));
116*b636d99dSDavid van Moolenbroek 	ND_TCHECK(hp->hsrp_reserved);
117*b636d99dSDavid van Moolenbroek 	if (hp->hsrp_reserved != 0) {
118*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "[reserved=%d!] ", hp->hsrp_reserved));
119*b636d99dSDavid van Moolenbroek 	}
120*b636d99dSDavid van Moolenbroek 	ND_TCHECK(hp->hsrp_virtaddr);
121*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "addr=%s", ipaddr_string(ndo, &hp->hsrp_virtaddr)));
122*b636d99dSDavid van Moolenbroek 	if (ndo->ndo_vflag) {
123*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " hellotime="));
124*b636d99dSDavid van Moolenbroek 		relts_print(ndo, hp->hsrp_hellotime);
125*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " holdtime="));
126*b636d99dSDavid van Moolenbroek 		relts_print(ndo, hp->hsrp_holdtime);
127*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " priority=%d", hp->hsrp_priority));
128*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " auth=\""));
129*b636d99dSDavid van Moolenbroek 		if (fn_printn(ndo, hp->hsrp_authdata, sizeof(hp->hsrp_authdata),
130*b636d99dSDavid van Moolenbroek 		    ndo->ndo_snapend)) {
131*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, "\""));
132*b636d99dSDavid van Moolenbroek 			goto trunc;
133*b636d99dSDavid van Moolenbroek 		}
134*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "\""));
135*b636d99dSDavid van Moolenbroek 	}
136*b636d99dSDavid van Moolenbroek 	return;
137*b636d99dSDavid van Moolenbroek trunc:
138*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "[|hsrp]"));
139*b636d99dSDavid van Moolenbroek }
140