]> The Tcpdump Group git mirrors - tcpdump/blob - print-vrrp.c
remove tcpdump's own CVS keywords
[tcpdump] / print-vrrp.c
1 /*
2 * Copyright (c) 2000 William C. Fenner.
3 * All rights reserved.
4 *
5 * Kevin Steves <ks@hp.se> July 2000
6 * Modified to:
7 * - print version, type string and packet length
8 * - print IP address count if > 1 (-v)
9 * - verify checksum (-v)
10 * - print authentication string (-v)
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that: (1) source code
14 * distributions retain the above copyright notice and this paragraph
15 * in its entirety, and (2) distributions including binary code include
16 * the above copyright notice and this paragraph in its entirety in
17 * the documentation or other materials provided with the distribution.
18 * The name of William C. Fenner may not be used to endorse or
19 * promote products derived from this software without specific prior
20 * written permission. THIS SOFTWARE IS PROVIDED ``AS IS'' AND
21 * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
22 * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 * FOR A PARTICULAR PURPOSE.
24 */
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29
30 #include <tcpdump-stdinc.h>
31
32 #include <stdio.h>
33 #include <stdlib.h>
34
35 #include "interface.h"
36 #include "extract.h"
37 #include "addrtoname.h"
38
39 /*
40 * RFC 2338:
41 * 0 1 2 3
42 * 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
43 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44 * |Version| Type | Virtual Rtr ID| Priority | Count IP Addrs|
45 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46 * | Auth Type | Adver Int | Checksum |
47 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48 * | IP Address (1) |
49 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50 * | . |
51 * | . |
52 * | . |
53 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54 * | IP Address (n) |
55 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56 * | Authentication Data (1) |
57 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58 * | Authentication Data (2) |
59 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60 */
61
62 /* Type */
63 #define VRRP_TYPE_ADVERTISEMENT 1
64
65 static const struct tok type2str[] = {
66 { VRRP_TYPE_ADVERTISEMENT, "Advertisement" },
67 { 0, NULL }
68 };
69
70 /* Auth Type */
71 #define VRRP_AUTH_NONE 0
72 #define VRRP_AUTH_SIMPLE 1
73 #define VRRP_AUTH_AH 2
74
75 static const struct tok auth2str[] = {
76 { VRRP_AUTH_NONE, "none" },
77 { VRRP_AUTH_SIMPLE, "simple" },
78 { VRRP_AUTH_AH, "ah" },
79 { 0, NULL }
80 };
81
82 void
83 vrrp_print(register const u_char *bp, register u_int len, int ttl)
84 {
85 int version, type, auth_type;
86 const char *type_s;
87
88 TCHECK(bp[0]);
89 version = (bp[0] & 0xf0) >> 4;
90 type = bp[0] & 0x0f;
91 type_s = tok2str(type2str, "unknown type (%u)", type);
92 printf("VRRPv%u, %s", version, type_s);
93 if (ttl != 255)
94 printf(", (ttl %u)", ttl);
95 if (version != 2 || type != VRRP_TYPE_ADVERTISEMENT)
96 return;
97 TCHECK(bp[2]);
98 printf(", vrid %u, prio %u", bp[1], bp[2]);
99 TCHECK(bp[5]);
100 auth_type = bp[4];
101 printf(", authtype %s", tok2str(auth2str, NULL, auth_type));
102 printf(", intvl %us, length %u", bp[5],len);
103 if (vflag) {
104 int naddrs = bp[3];
105 int i;
106 char c;
107
108 if (TTEST2(bp[0], len)) {
109 struct cksum_vec vec[1];
110
111 vec[0].ptr = bp;
112 vec[0].len = len;
113 if (in_cksum(vec, 1))
114 printf(", (bad vrrp cksum %x)",
115 EXTRACT_16BITS(&bp[6]));
116 }
117 printf(", addrs");
118 if (naddrs > 1)
119 printf("(%d)", naddrs);
120 printf(":");
121 c = ' ';
122 bp += 8;
123 for (i = 0; i < naddrs; i++) {
124 TCHECK(bp[3]);
125 printf("%c%s", c, ipaddr_string(bp));
126 c = ',';
127 bp += 4;
128 }
129 if (auth_type == VRRP_AUTH_SIMPLE) { /* simple text password */
130 TCHECK(bp[7]);
131 printf(" auth \"");
132 if (fn_printn(bp, 8, snapend)) {
133 printf("\"");
134 goto trunc;
135 }
136 printf("\"");
137 }
138 }
139 return;
140 trunc:
141 printf("[|vrrp]");
142 }