xref: /freebsd/contrib/tcpdump/print-vrrp.c (revision 3c602fabf9b894ff79f08a80cbb7ad3b1eb84e62)
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