key_debug.c revision 1.3.4.4 1 1.3.4.4 skrll /* $NetBSD: key_debug.c,v 1.3.4.4 2004/09/21 13:37:48 skrll Exp $ */
2 1.3.4.2 skrll /* $FreeBSD: src/sys/netipsec/key_debug.c,v 1.1.4.1 2003/01/24 05:11:36 sam Exp $ */
3 1.3.4.2 skrll /* $KAME: key_debug.c,v 1.26 2001/06/27 10:46:50 sakane Exp $ */
4 1.3.4.2 skrll
5 1.3.4.2 skrll /*
6 1.3.4.2 skrll * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7 1.3.4.2 skrll * All rights reserved.
8 1.3.4.2 skrll *
9 1.3.4.2 skrll * Redistribution and use in source and binary forms, with or without
10 1.3.4.2 skrll * modification, are permitted provided that the following conditions
11 1.3.4.2 skrll * are met:
12 1.3.4.2 skrll * 1. Redistributions of source code must retain the above copyright
13 1.3.4.2 skrll * notice, this list of conditions and the following disclaimer.
14 1.3.4.2 skrll * 2. Redistributions in binary form must reproduce the above copyright
15 1.3.4.2 skrll * notice, this list of conditions and the following disclaimer in the
16 1.3.4.2 skrll * documentation and/or other materials provided with the distribution.
17 1.3.4.2 skrll * 3. Neither the name of the project nor the names of its contributors
18 1.3.4.2 skrll * may be used to endorse or promote products derived from this software
19 1.3.4.2 skrll * without specific prior written permission.
20 1.3.4.2 skrll *
21 1.3.4.2 skrll * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
22 1.3.4.2 skrll * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 1.3.4.2 skrll * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 1.3.4.2 skrll * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
25 1.3.4.2 skrll * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 1.3.4.2 skrll * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 1.3.4.2 skrll * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 1.3.4.2 skrll * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 1.3.4.2 skrll * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 1.3.4.2 skrll * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 1.3.4.2 skrll * SUCH DAMAGE.
32 1.3.4.2 skrll */
33 1.3.4.2 skrll
34 1.3.4.2 skrll #ifdef _KERNEL
35 1.3.4.2 skrll #include <sys/cdefs.h>
36 1.3.4.4 skrll __KERNEL_RCSID(0, "$NetBSD: key_debug.c,v 1.3.4.4 2004/09/21 13:37:48 skrll Exp $");
37 1.3.4.2 skrll #endif
38 1.3.4.2 skrll
39 1.3.4.2 skrll #include "opt_inet.h"
40 1.3.4.2 skrll #ifdef __FreeBSD__
41 1.3.4.2 skrll #include "opt_inet6.h"
42 1.3.4.2 skrll #endif
43 1.3.4.2 skrll #include "opt_ipsec.h"
44 1.3.4.2 skrll
45 1.3.4.2 skrll #include <sys/types.h>
46 1.3.4.2 skrll #include <sys/param.h>
47 1.3.4.2 skrll #ifdef _KERNEL
48 1.3.4.2 skrll #include <sys/systm.h>
49 1.3.4.2 skrll #include <sys/mbuf.h>
50 1.3.4.2 skrll #include <sys/queue.h>
51 1.3.4.2 skrll #endif
52 1.3.4.2 skrll #include <sys/socket.h>
53 1.3.4.2 skrll
54 1.3.4.2 skrll #include <net/route.h>
55 1.3.4.2 skrll
56 1.3.4.2 skrll #include <netipsec/key_var.h>
57 1.3.4.2 skrll #include <netipsec/key_debug.h>
58 1.3.4.2 skrll
59 1.3.4.2 skrll #include <netinet/in.h>
60 1.3.4.2 skrll #include <netipsec/ipsec.h>
61 1.3.4.2 skrll
62 1.3.4.2 skrll #ifndef _KERNEL
63 1.3.4.2 skrll #include <ctype.h>
64 1.3.4.2 skrll #include <stdio.h>
65 1.3.4.2 skrll #include <stdlib.h>
66 1.3.4.2 skrll #endif /* !_KERNEL */
67 1.3.4.2 skrll
68 1.3.4.2 skrll static void kdebug_sadb_prop __P((struct sadb_ext *));
69 1.3.4.2 skrll static void kdebug_sadb_identity __P((struct sadb_ext *));
70 1.3.4.2 skrll static void kdebug_sadb_supported __P((struct sadb_ext *));
71 1.3.4.2 skrll static void kdebug_sadb_lifetime __P((struct sadb_ext *));
72 1.3.4.2 skrll static void kdebug_sadb_sa __P((struct sadb_ext *));
73 1.3.4.2 skrll static void kdebug_sadb_address __P((struct sadb_ext *));
74 1.3.4.2 skrll static void kdebug_sadb_key __P((struct sadb_ext *));
75 1.3.4.2 skrll static void kdebug_sadb_x_sa2 __P((struct sadb_ext *));
76 1.3.4.2 skrll
77 1.3.4.2 skrll #ifdef _KERNEL
78 1.3.4.2 skrll static void kdebug_secreplay __P((struct secreplay *));
79 1.3.4.2 skrll #endif
80 1.3.4.2 skrll
81 1.3.4.2 skrll #ifndef _KERNEL
82 1.3.4.2 skrll #define panic(param) { printf(param); exit(-1); }
83 1.3.4.2 skrll #endif
84 1.3.4.2 skrll
85 1.3.4.2 skrll /* NOTE: host byte order */
86 1.3.4.2 skrll
87 1.3.4.2 skrll /* %%%: about struct sadb_msg */
88 1.3.4.2 skrll void
89 1.3.4.2 skrll kdebug_sadb(base)
90 1.3.4.2 skrll struct sadb_msg *base;
91 1.3.4.2 skrll {
92 1.3.4.2 skrll struct sadb_ext *ext;
93 1.3.4.2 skrll int tlen, extlen;
94 1.3.4.2 skrll
95 1.3.4.2 skrll /* sanity check */
96 1.3.4.2 skrll if (base == NULL)
97 1.3.4.2 skrll panic("kdebug_sadb: NULL pointer was passed.\n");
98 1.3.4.2 skrll
99 1.3.4.2 skrll printf("sadb_msg{ version=%u type=%u errno=%u satype=%u\n",
100 1.3.4.2 skrll base->sadb_msg_version, base->sadb_msg_type,
101 1.3.4.2 skrll base->sadb_msg_errno, base->sadb_msg_satype);
102 1.3.4.2 skrll printf(" len=%u reserved=%u seq=%u pid=%u\n",
103 1.3.4.2 skrll base->sadb_msg_len, base->sadb_msg_reserved,
104 1.3.4.2 skrll base->sadb_msg_seq, base->sadb_msg_pid);
105 1.3.4.2 skrll
106 1.3.4.2 skrll tlen = PFKEY_UNUNIT64(base->sadb_msg_len) - sizeof(struct sadb_msg);
107 1.3.4.2 skrll ext = (struct sadb_ext *)((caddr_t)base + sizeof(struct sadb_msg));
108 1.3.4.2 skrll
109 1.3.4.2 skrll while (tlen > 0) {
110 1.3.4.2 skrll printf("sadb_ext{ len=%u type=%u }\n",
111 1.3.4.2 skrll ext->sadb_ext_len, ext->sadb_ext_type);
112 1.3.4.2 skrll
113 1.3.4.2 skrll if (ext->sadb_ext_len == 0) {
114 1.3.4.2 skrll printf("kdebug_sadb: invalid ext_len=0 was passed.\n");
115 1.3.4.2 skrll return;
116 1.3.4.2 skrll }
117 1.3.4.2 skrll if (ext->sadb_ext_len > tlen) {
118 1.3.4.2 skrll printf("kdebug_sadb: ext_len exceeds end of buffer.\n");
119 1.3.4.2 skrll return;
120 1.3.4.2 skrll }
121 1.3.4.2 skrll
122 1.3.4.2 skrll switch (ext->sadb_ext_type) {
123 1.3.4.2 skrll case SADB_EXT_SA:
124 1.3.4.2 skrll kdebug_sadb_sa(ext);
125 1.3.4.2 skrll break;
126 1.3.4.2 skrll case SADB_EXT_LIFETIME_CURRENT:
127 1.3.4.2 skrll case SADB_EXT_LIFETIME_HARD:
128 1.3.4.2 skrll case SADB_EXT_LIFETIME_SOFT:
129 1.3.4.2 skrll kdebug_sadb_lifetime(ext);
130 1.3.4.2 skrll break;
131 1.3.4.2 skrll case SADB_EXT_ADDRESS_SRC:
132 1.3.4.2 skrll case SADB_EXT_ADDRESS_DST:
133 1.3.4.2 skrll case SADB_EXT_ADDRESS_PROXY:
134 1.3.4.2 skrll kdebug_sadb_address(ext);
135 1.3.4.2 skrll break;
136 1.3.4.2 skrll case SADB_EXT_KEY_AUTH:
137 1.3.4.2 skrll case SADB_EXT_KEY_ENCRYPT:
138 1.3.4.2 skrll kdebug_sadb_key(ext);
139 1.3.4.2 skrll break;
140 1.3.4.2 skrll case SADB_EXT_IDENTITY_SRC:
141 1.3.4.2 skrll case SADB_EXT_IDENTITY_DST:
142 1.3.4.2 skrll kdebug_sadb_identity(ext);
143 1.3.4.2 skrll break;
144 1.3.4.2 skrll case SADB_EXT_SENSITIVITY:
145 1.3.4.2 skrll break;
146 1.3.4.2 skrll case SADB_EXT_PROPOSAL:
147 1.3.4.2 skrll kdebug_sadb_prop(ext);
148 1.3.4.2 skrll break;
149 1.3.4.2 skrll case SADB_EXT_SUPPORTED_AUTH:
150 1.3.4.2 skrll case SADB_EXT_SUPPORTED_ENCRYPT:
151 1.3.4.2 skrll kdebug_sadb_supported(ext);
152 1.3.4.2 skrll break;
153 1.3.4.2 skrll case SADB_EXT_SPIRANGE:
154 1.3.4.2 skrll case SADB_X_EXT_KMPRIVATE:
155 1.3.4.2 skrll break;
156 1.3.4.2 skrll case SADB_X_EXT_POLICY:
157 1.3.4.2 skrll kdebug_sadb_x_policy(ext);
158 1.3.4.2 skrll break;
159 1.3.4.2 skrll case SADB_X_EXT_SA2:
160 1.3.4.2 skrll kdebug_sadb_x_sa2(ext);
161 1.3.4.2 skrll break;
162 1.3.4.2 skrll default:
163 1.3.4.2 skrll printf("kdebug_sadb: invalid ext_type %u was passed.\n",
164 1.3.4.2 skrll ext->sadb_ext_type);
165 1.3.4.2 skrll return;
166 1.3.4.2 skrll }
167 1.3.4.2 skrll
168 1.3.4.2 skrll extlen = PFKEY_UNUNIT64(ext->sadb_ext_len);
169 1.3.4.2 skrll tlen -= extlen;
170 1.3.4.2 skrll ext = (struct sadb_ext *)((caddr_t)ext + extlen);
171 1.3.4.2 skrll }
172 1.3.4.2 skrll
173 1.3.4.2 skrll return;
174 1.3.4.2 skrll }
175 1.3.4.2 skrll
176 1.3.4.2 skrll static void
177 1.3.4.2 skrll kdebug_sadb_prop(ext)
178 1.3.4.2 skrll struct sadb_ext *ext;
179 1.3.4.2 skrll {
180 1.3.4.2 skrll struct sadb_prop *prop = (struct sadb_prop *)ext;
181 1.3.4.2 skrll struct sadb_comb *comb;
182 1.3.4.2 skrll int len;
183 1.3.4.2 skrll
184 1.3.4.2 skrll /* sanity check */
185 1.3.4.2 skrll if (ext == NULL)
186 1.3.4.2 skrll panic("kdebug_sadb_prop: NULL pointer was passed.\n");
187 1.3.4.2 skrll
188 1.3.4.2 skrll len = (PFKEY_UNUNIT64(prop->sadb_prop_len) - sizeof(*prop))
189 1.3.4.2 skrll / sizeof(*comb);
190 1.3.4.2 skrll comb = (struct sadb_comb *)(prop + 1);
191 1.3.4.2 skrll printf("sadb_prop{ replay=%u\n", prop->sadb_prop_replay);
192 1.3.4.2 skrll
193 1.3.4.2 skrll while (len--) {
194 1.3.4.2 skrll printf("sadb_comb{ auth=%u encrypt=%u "
195 1.3.4.2 skrll "flags=0x%04x reserved=0x%08x\n",
196 1.3.4.2 skrll comb->sadb_comb_auth, comb->sadb_comb_encrypt,
197 1.3.4.2 skrll comb->sadb_comb_flags, comb->sadb_comb_reserved);
198 1.3.4.2 skrll
199 1.3.4.2 skrll printf(" auth_minbits=%u auth_maxbits=%u "
200 1.3.4.2 skrll "encrypt_minbits=%u encrypt_maxbits=%u\n",
201 1.3.4.2 skrll comb->sadb_comb_auth_minbits,
202 1.3.4.2 skrll comb->sadb_comb_auth_maxbits,
203 1.3.4.2 skrll comb->sadb_comb_encrypt_minbits,
204 1.3.4.2 skrll comb->sadb_comb_encrypt_maxbits);
205 1.3.4.2 skrll
206 1.3.4.2 skrll printf(" soft_alloc=%u hard_alloc=%u "
207 1.3.4.2 skrll "soft_bytes=%lu hard_bytes=%lu\n",
208 1.3.4.2 skrll comb->sadb_comb_soft_allocations,
209 1.3.4.2 skrll comb->sadb_comb_hard_allocations,
210 1.3.4.2 skrll (unsigned long)comb->sadb_comb_soft_bytes,
211 1.3.4.2 skrll (unsigned long)comb->sadb_comb_hard_bytes);
212 1.3.4.2 skrll
213 1.3.4.2 skrll printf(" soft_alloc=%lu hard_alloc=%lu "
214 1.3.4.2 skrll "soft_bytes=%lu hard_bytes=%lu }\n",
215 1.3.4.2 skrll (unsigned long)comb->sadb_comb_soft_addtime,
216 1.3.4.2 skrll (unsigned long)comb->sadb_comb_hard_addtime,
217 1.3.4.2 skrll (unsigned long)comb->sadb_comb_soft_usetime,
218 1.3.4.2 skrll (unsigned long)comb->sadb_comb_hard_usetime);
219 1.3.4.2 skrll comb++;
220 1.3.4.2 skrll }
221 1.3.4.2 skrll printf("}\n");
222 1.3.4.2 skrll
223 1.3.4.2 skrll return;
224 1.3.4.2 skrll }
225 1.3.4.2 skrll
226 1.3.4.2 skrll static void
227 1.3.4.2 skrll kdebug_sadb_identity(ext)
228 1.3.4.2 skrll struct sadb_ext *ext;
229 1.3.4.2 skrll {
230 1.3.4.2 skrll struct sadb_ident *id = (struct sadb_ident *)ext;
231 1.3.4.2 skrll int len;
232 1.3.4.2 skrll
233 1.3.4.2 skrll /* sanity check */
234 1.3.4.2 skrll if (ext == NULL)
235 1.3.4.2 skrll panic("kdebug_sadb_identity: NULL pointer was passed.\n");
236 1.3.4.2 skrll
237 1.3.4.2 skrll len = PFKEY_UNUNIT64(id->sadb_ident_len) - sizeof(*id);
238 1.3.4.2 skrll printf("sadb_ident_%s{",
239 1.3.4.2 skrll id->sadb_ident_exttype == SADB_EXT_IDENTITY_SRC ? "src" : "dst");
240 1.3.4.2 skrll switch (id->sadb_ident_type) {
241 1.3.4.2 skrll default:
242 1.3.4.2 skrll printf(" type=%d id=%lu",
243 1.3.4.2 skrll id->sadb_ident_type, (u_long)id->sadb_ident_id);
244 1.3.4.2 skrll if (len) {
245 1.3.4.2 skrll #ifdef _KERNEL
246 1.3.4.2 skrll ipsec_hexdump((caddr_t)(id + 1), len); /*XXX cast ?*/
247 1.3.4.2 skrll #else
248 1.3.4.2 skrll char *p, *ep;
249 1.3.4.2 skrll printf("\n str=\"");
250 1.3.4.2 skrll p = (char *)(id + 1);
251 1.3.4.2 skrll ep = p + len;
252 1.3.4.2 skrll for (/*nothing*/; *p && p < ep; p++) {
253 1.3.4.2 skrll if (isprint(*p))
254 1.3.4.2 skrll printf("%c", *p & 0xff);
255 1.3.4.2 skrll else
256 1.3.4.2 skrll printf("\\%03o", *p & 0xff);
257 1.3.4.2 skrll }
258 1.3.4.2 skrll #endif
259 1.3.4.2 skrll printf("\"");
260 1.3.4.2 skrll }
261 1.3.4.2 skrll break;
262 1.3.4.2 skrll }
263 1.3.4.2 skrll
264 1.3.4.2 skrll printf(" }\n");
265 1.3.4.2 skrll
266 1.3.4.2 skrll return;
267 1.3.4.2 skrll }
268 1.3.4.2 skrll
269 1.3.4.2 skrll static void
270 1.3.4.2 skrll kdebug_sadb_supported(ext)
271 1.3.4.2 skrll struct sadb_ext *ext;
272 1.3.4.2 skrll {
273 1.3.4.2 skrll struct sadb_supported *sup = (struct sadb_supported *)ext;
274 1.3.4.2 skrll struct sadb_alg *alg;
275 1.3.4.2 skrll int len;
276 1.3.4.2 skrll
277 1.3.4.2 skrll /* sanity check */
278 1.3.4.2 skrll if (ext == NULL)
279 1.3.4.2 skrll panic("kdebug_sadb_supported: NULL pointer was passed.\n");
280 1.3.4.2 skrll
281 1.3.4.2 skrll len = (PFKEY_UNUNIT64(sup->sadb_supported_len) - sizeof(*sup))
282 1.3.4.2 skrll / sizeof(*alg);
283 1.3.4.2 skrll alg = (struct sadb_alg *)(sup + 1);
284 1.3.4.2 skrll printf("sadb_sup{\n");
285 1.3.4.2 skrll while (len--) {
286 1.3.4.2 skrll printf(" { id=%d ivlen=%d min=%d max=%d }\n",
287 1.3.4.2 skrll alg->sadb_alg_id, alg->sadb_alg_ivlen,
288 1.3.4.2 skrll alg->sadb_alg_minbits, alg->sadb_alg_maxbits);
289 1.3.4.2 skrll alg++;
290 1.3.4.2 skrll }
291 1.3.4.2 skrll printf("}\n");
292 1.3.4.2 skrll
293 1.3.4.2 skrll return;
294 1.3.4.2 skrll }
295 1.3.4.2 skrll
296 1.3.4.2 skrll static void
297 1.3.4.2 skrll kdebug_sadb_lifetime(ext)
298 1.3.4.2 skrll struct sadb_ext *ext;
299 1.3.4.2 skrll {
300 1.3.4.2 skrll struct sadb_lifetime *lft = (struct sadb_lifetime *)ext;
301 1.3.4.2 skrll
302 1.3.4.2 skrll /* sanity check */
303 1.3.4.2 skrll if (ext == NULL)
304 1.3.4.2 skrll printf("kdebug_sadb_lifetime: NULL pointer was passed.\n");
305 1.3.4.2 skrll
306 1.3.4.2 skrll printf("sadb_lifetime{ alloc=%u, bytes=%u\n",
307 1.3.4.2 skrll lft->sadb_lifetime_allocations,
308 1.3.4.2 skrll (u_int32_t)lft->sadb_lifetime_bytes);
309 1.3.4.2 skrll printf(" addtime=%u, usetime=%u }\n",
310 1.3.4.2 skrll (u_int32_t)lft->sadb_lifetime_addtime,
311 1.3.4.2 skrll (u_int32_t)lft->sadb_lifetime_usetime);
312 1.3.4.2 skrll
313 1.3.4.2 skrll return;
314 1.3.4.2 skrll }
315 1.3.4.2 skrll
316 1.3.4.2 skrll static void
317 1.3.4.2 skrll kdebug_sadb_sa(ext)
318 1.3.4.2 skrll struct sadb_ext *ext;
319 1.3.4.2 skrll {
320 1.3.4.2 skrll struct sadb_sa *sa = (struct sadb_sa *)ext;
321 1.3.4.2 skrll
322 1.3.4.2 skrll /* sanity check */
323 1.3.4.2 skrll if (ext == NULL)
324 1.3.4.2 skrll panic("kdebug_sadb_sa: NULL pointer was passed.\n");
325 1.3.4.2 skrll
326 1.3.4.2 skrll printf("sadb_sa{ spi=%u replay=%u state=%u\n",
327 1.3.4.2 skrll (u_int32_t)ntohl(sa->sadb_sa_spi), sa->sadb_sa_replay,
328 1.3.4.2 skrll sa->sadb_sa_state);
329 1.3.4.2 skrll printf(" auth=%u encrypt=%u flags=0x%08x }\n",
330 1.3.4.2 skrll sa->sadb_sa_auth, sa->sadb_sa_encrypt, sa->sadb_sa_flags);
331 1.3.4.2 skrll
332 1.3.4.2 skrll return;
333 1.3.4.2 skrll }
334 1.3.4.2 skrll
335 1.3.4.2 skrll static void
336 1.3.4.2 skrll kdebug_sadb_address(ext)
337 1.3.4.2 skrll struct sadb_ext *ext;
338 1.3.4.2 skrll {
339 1.3.4.2 skrll struct sadb_address *addr = (struct sadb_address *)ext;
340 1.3.4.2 skrll
341 1.3.4.2 skrll /* sanity check */
342 1.3.4.2 skrll if (ext == NULL)
343 1.3.4.2 skrll panic("kdebug_sadb_address: NULL pointer was passed.\n");
344 1.3.4.2 skrll
345 1.3.4.2 skrll printf("sadb_address{ proto=%u prefixlen=%u reserved=0x%02x%02x }\n",
346 1.3.4.2 skrll addr->sadb_address_proto, addr->sadb_address_prefixlen,
347 1.3.4.2 skrll ((u_char *)&addr->sadb_address_reserved)[0],
348 1.3.4.2 skrll ((u_char *)&addr->sadb_address_reserved)[1]);
349 1.3.4.2 skrll
350 1.3.4.2 skrll kdebug_sockaddr((struct sockaddr *)((caddr_t)ext + sizeof(*addr)));
351 1.3.4.2 skrll
352 1.3.4.2 skrll return;
353 1.3.4.2 skrll }
354 1.3.4.2 skrll
355 1.3.4.2 skrll static void
356 1.3.4.2 skrll kdebug_sadb_key(ext)
357 1.3.4.2 skrll struct sadb_ext *ext;
358 1.3.4.2 skrll {
359 1.3.4.2 skrll struct sadb_key *key = (struct sadb_key *)ext;
360 1.3.4.2 skrll
361 1.3.4.2 skrll /* sanity check */
362 1.3.4.2 skrll if (ext == NULL)
363 1.3.4.2 skrll panic("kdebug_sadb_key: NULL pointer was passed.\n");
364 1.3.4.2 skrll
365 1.3.4.2 skrll printf("sadb_key{ bits=%u reserved=%u\n",
366 1.3.4.2 skrll key->sadb_key_bits, key->sadb_key_reserved);
367 1.3.4.2 skrll printf(" key=");
368 1.3.4.2 skrll
369 1.3.4.2 skrll /* sanity check 2 */
370 1.3.4.2 skrll if ((key->sadb_key_bits >> 3) >
371 1.3.4.2 skrll (PFKEY_UNUNIT64(key->sadb_key_len) - sizeof(struct sadb_key))) {
372 1.3.4.2 skrll printf("kdebug_sadb_key: key length mismatch, bit:%d len:%ld.\n",
373 1.3.4.2 skrll key->sadb_key_bits >> 3,
374 1.3.4.2 skrll (long)PFKEY_UNUNIT64(key->sadb_key_len) - sizeof(struct sadb_key));
375 1.3.4.2 skrll }
376 1.3.4.2 skrll
377 1.3.4.2 skrll ipsec_hexdump((caddr_t)key + sizeof(struct sadb_key),
378 1.3.4.2 skrll key->sadb_key_bits >> 3);
379 1.3.4.2 skrll printf(" }\n");
380 1.3.4.2 skrll return;
381 1.3.4.2 skrll }
382 1.3.4.2 skrll
383 1.3.4.2 skrll static void
384 1.3.4.2 skrll kdebug_sadb_x_sa2(ext)
385 1.3.4.2 skrll struct sadb_ext *ext;
386 1.3.4.2 skrll {
387 1.3.4.2 skrll struct sadb_x_sa2 *sa2 = (struct sadb_x_sa2 *)ext;
388 1.3.4.2 skrll
389 1.3.4.2 skrll /* sanity check */
390 1.3.4.2 skrll if (ext == NULL)
391 1.3.4.2 skrll panic("kdebug_sadb_x_sa2: NULL pointer was passed.\n");
392 1.3.4.2 skrll
393 1.3.4.2 skrll printf("sadb_x_sa2{ mode=%u reqid=%u\n",
394 1.3.4.2 skrll sa2->sadb_x_sa2_mode, sa2->sadb_x_sa2_reqid);
395 1.3.4.2 skrll printf(" reserved1=%u reserved2=%u sequence=%u }\n",
396 1.3.4.2 skrll sa2->sadb_x_sa2_reserved1, sa2->sadb_x_sa2_reserved2,
397 1.3.4.2 skrll sa2->sadb_x_sa2_sequence);
398 1.3.4.2 skrll
399 1.3.4.2 skrll return;
400 1.3.4.2 skrll }
401 1.3.4.2 skrll
402 1.3.4.2 skrll void
403 1.3.4.2 skrll kdebug_sadb_x_policy(ext)
404 1.3.4.2 skrll struct sadb_ext *ext;
405 1.3.4.2 skrll {
406 1.3.4.2 skrll struct sadb_x_policy *xpl = (struct sadb_x_policy *)ext;
407 1.3.4.2 skrll struct sockaddr *addr;
408 1.3.4.2 skrll
409 1.3.4.2 skrll /* sanity check */
410 1.3.4.2 skrll if (ext == NULL)
411 1.3.4.2 skrll panic("kdebug_sadb_x_policy: NULL pointer was passed.\n");
412 1.3.4.2 skrll
413 1.3.4.2 skrll printf("sadb_x_policy{ type=%u dir=%u id=%x }\n",
414 1.3.4.2 skrll xpl->sadb_x_policy_type, xpl->sadb_x_policy_dir,
415 1.3.4.2 skrll xpl->sadb_x_policy_id);
416 1.3.4.2 skrll
417 1.3.4.2 skrll if (xpl->sadb_x_policy_type == IPSEC_POLICY_IPSEC) {
418 1.3.4.2 skrll int tlen;
419 1.3.4.2 skrll struct sadb_x_ipsecrequest *xisr;
420 1.3.4.2 skrll
421 1.3.4.2 skrll tlen = PFKEY_UNUNIT64(xpl->sadb_x_policy_len) - sizeof(*xpl);
422 1.3.4.2 skrll xisr = (struct sadb_x_ipsecrequest *)(xpl + 1);
423 1.3.4.2 skrll
424 1.3.4.2 skrll while (tlen > 0) {
425 1.3.4.2 skrll printf(" { len=%u proto=%u mode=%u level=%u reqid=%u\n",
426 1.3.4.2 skrll xisr->sadb_x_ipsecrequest_len,
427 1.3.4.2 skrll xisr->sadb_x_ipsecrequest_proto,
428 1.3.4.2 skrll xisr->sadb_x_ipsecrequest_mode,
429 1.3.4.2 skrll xisr->sadb_x_ipsecrequest_level,
430 1.3.4.2 skrll xisr->sadb_x_ipsecrequest_reqid);
431 1.3.4.2 skrll
432 1.3.4.2 skrll if (xisr->sadb_x_ipsecrequest_len > sizeof(*xisr)) {
433 1.3.4.2 skrll addr = (struct sockaddr *)(xisr + 1);
434 1.3.4.2 skrll kdebug_sockaddr(addr);
435 1.3.4.2 skrll addr = (struct sockaddr *)((caddr_t)addr
436 1.3.4.2 skrll + addr->sa_len);
437 1.3.4.2 skrll kdebug_sockaddr(addr);
438 1.3.4.2 skrll }
439 1.3.4.2 skrll
440 1.3.4.2 skrll printf(" }\n");
441 1.3.4.2 skrll
442 1.3.4.2 skrll /* prevent infinite loop */
443 1.3.4.2 skrll if (xisr->sadb_x_ipsecrequest_len <= 0) {
444 1.3.4.2 skrll printf("kdebug_sadb_x_policy: wrong policy struct.\n");
445 1.3.4.2 skrll return;
446 1.3.4.2 skrll }
447 1.3.4.2 skrll /* prevent overflow */
448 1.3.4.2 skrll if (xisr->sadb_x_ipsecrequest_len > tlen) {
449 1.3.4.2 skrll printf("invalid ipsec policy length\n");
450 1.3.4.2 skrll return;
451 1.3.4.2 skrll }
452 1.3.4.2 skrll
453 1.3.4.2 skrll tlen -= xisr->sadb_x_ipsecrequest_len;
454 1.3.4.2 skrll
455 1.3.4.2 skrll xisr = (struct sadb_x_ipsecrequest *)((caddr_t)xisr
456 1.3.4.2 skrll + xisr->sadb_x_ipsecrequest_len);
457 1.3.4.2 skrll }
458 1.3.4.2 skrll
459 1.3.4.2 skrll if (tlen != 0)
460 1.3.4.2 skrll panic("kdebug_sadb_x_policy: wrong policy struct.\n");
461 1.3.4.2 skrll }
462 1.3.4.2 skrll
463 1.3.4.2 skrll return;
464 1.3.4.2 skrll }
465 1.3.4.2 skrll
466 1.3.4.2 skrll #ifdef _KERNEL
467 1.3.4.2 skrll /* %%%: about SPD and SAD */
468 1.3.4.2 skrll void
469 1.3.4.2 skrll kdebug_secpolicy(sp)
470 1.3.4.2 skrll struct secpolicy *sp;
471 1.3.4.2 skrll {
472 1.3.4.2 skrll /* sanity check */
473 1.3.4.2 skrll if (sp == NULL)
474 1.3.4.2 skrll panic("kdebug_secpolicy: NULL pointer was passed.\n");
475 1.3.4.2 skrll
476 1.3.4.2 skrll printf("secpolicy{ refcnt=%u state=%u policy=%u\n",
477 1.3.4.2 skrll sp->refcnt, sp->state, sp->policy);
478 1.3.4.2 skrll
479 1.3.4.2 skrll kdebug_secpolicyindex(&sp->spidx);
480 1.3.4.2 skrll
481 1.3.4.2 skrll switch (sp->policy) {
482 1.3.4.2 skrll case IPSEC_POLICY_DISCARD:
483 1.3.4.2 skrll printf(" type=discard }\n");
484 1.3.4.2 skrll break;
485 1.3.4.2 skrll case IPSEC_POLICY_NONE:
486 1.3.4.2 skrll printf(" type=none }\n");
487 1.3.4.2 skrll break;
488 1.3.4.2 skrll case IPSEC_POLICY_IPSEC:
489 1.3.4.2 skrll {
490 1.3.4.2 skrll struct ipsecrequest *isr;
491 1.3.4.2 skrll for (isr = sp->req; isr != NULL; isr = isr->next) {
492 1.3.4.2 skrll
493 1.3.4.2 skrll printf(" level=%u\n", isr->level);
494 1.3.4.2 skrll kdebug_secasindex(&isr->saidx);
495 1.3.4.2 skrll
496 1.3.4.2 skrll if (isr->sav != NULL)
497 1.3.4.2 skrll kdebug_secasv(isr->sav);
498 1.3.4.2 skrll }
499 1.3.4.2 skrll printf(" }\n");
500 1.3.4.2 skrll }
501 1.3.4.2 skrll break;
502 1.3.4.2 skrll case IPSEC_POLICY_BYPASS:
503 1.3.4.2 skrll printf(" type=bypass }\n");
504 1.3.4.2 skrll break;
505 1.3.4.2 skrll case IPSEC_POLICY_ENTRUST:
506 1.3.4.2 skrll printf(" type=entrust }\n");
507 1.3.4.2 skrll break;
508 1.3.4.2 skrll default:
509 1.3.4.2 skrll printf("kdebug_secpolicy: Invalid policy found. %d\n",
510 1.3.4.2 skrll sp->policy);
511 1.3.4.2 skrll break;
512 1.3.4.2 skrll }
513 1.3.4.2 skrll
514 1.3.4.2 skrll return;
515 1.3.4.2 skrll }
516 1.3.4.2 skrll
517 1.3.4.2 skrll void
518 1.3.4.2 skrll kdebug_secpolicyindex(spidx)
519 1.3.4.2 skrll struct secpolicyindex *spidx;
520 1.3.4.2 skrll {
521 1.3.4.2 skrll /* sanity check */
522 1.3.4.2 skrll if (spidx == NULL)
523 1.3.4.2 skrll panic("kdebug_secpolicyindex: NULL pointer was passed.\n");
524 1.3.4.2 skrll
525 1.3.4.2 skrll printf("secpolicyindex{ dir=%u prefs=%u prefd=%u ul_proto=%u\n",
526 1.3.4.2 skrll spidx->dir, spidx->prefs, spidx->prefd, spidx->ul_proto);
527 1.3.4.2 skrll
528 1.3.4.2 skrll ipsec_hexdump((caddr_t)&spidx->src,
529 1.3.4.2 skrll ((struct sockaddr *)&spidx->src)->sa_len);
530 1.3.4.2 skrll printf("\n");
531 1.3.4.2 skrll ipsec_hexdump((caddr_t)&spidx->dst,
532 1.3.4.2 skrll ((struct sockaddr *)&spidx->dst)->sa_len);
533 1.3.4.2 skrll printf("}\n");
534 1.3.4.2 skrll
535 1.3.4.2 skrll return;
536 1.3.4.2 skrll }
537 1.3.4.2 skrll
538 1.3.4.2 skrll void
539 1.3.4.2 skrll kdebug_secasindex(saidx)
540 1.3.4.2 skrll struct secasindex *saidx;
541 1.3.4.2 skrll {
542 1.3.4.2 skrll /* sanity check */
543 1.3.4.2 skrll if (saidx == NULL)
544 1.3.4.2 skrll panic("kdebug_secpolicyindex: NULL pointer was passed.\n");
545 1.3.4.2 skrll
546 1.3.4.2 skrll printf("secasindex{ mode=%u proto=%u\n",
547 1.3.4.2 skrll saidx->mode, saidx->proto);
548 1.3.4.2 skrll
549 1.3.4.2 skrll ipsec_hexdump((caddr_t)&saidx->src,
550 1.3.4.2 skrll ((struct sockaddr *)&saidx->src)->sa_len);
551 1.3.4.2 skrll printf("\n");
552 1.3.4.2 skrll ipsec_hexdump((caddr_t)&saidx->dst,
553 1.3.4.2 skrll ((struct sockaddr *)&saidx->dst)->sa_len);
554 1.3.4.2 skrll printf("\n");
555 1.3.4.2 skrll
556 1.3.4.2 skrll return;
557 1.3.4.2 skrll }
558 1.3.4.2 skrll
559 1.3.4.2 skrll void
560 1.3.4.2 skrll kdebug_secasv(sav)
561 1.3.4.2 skrll struct secasvar *sav;
562 1.3.4.2 skrll {
563 1.3.4.2 skrll /* sanity check */
564 1.3.4.2 skrll if (sav == NULL)
565 1.3.4.2 skrll panic("kdebug_secasv: NULL pointer was passed.\n");
566 1.3.4.2 skrll
567 1.3.4.2 skrll printf("secas{");
568 1.3.4.2 skrll kdebug_secasindex(&sav->sah->saidx);
569 1.3.4.2 skrll
570 1.3.4.2 skrll printf(" refcnt=%u state=%u auth=%u enc=%u\n",
571 1.3.4.2 skrll sav->refcnt, sav->state, sav->alg_auth, sav->alg_enc);
572 1.3.4.2 skrll printf(" spi=%u flags=%u\n",
573 1.3.4.2 skrll (u_int32_t)ntohl(sav->spi), sav->flags);
574 1.3.4.2 skrll
575 1.3.4.2 skrll if (sav->key_auth != NULL)
576 1.3.4.2 skrll kdebug_sadb_key((struct sadb_ext *)sav->key_auth);
577 1.3.4.2 skrll if (sav->key_enc != NULL)
578 1.3.4.2 skrll kdebug_sadb_key((struct sadb_ext *)sav->key_enc);
579 1.3.4.2 skrll if (sav->iv != NULL) {
580 1.3.4.2 skrll printf(" iv=");
581 1.3.4.2 skrll ipsec_hexdump(sav->iv, sav->ivlen ? sav->ivlen : 8);
582 1.3.4.2 skrll printf("\n");
583 1.3.4.2 skrll }
584 1.3.4.2 skrll
585 1.3.4.2 skrll if (sav->replay != NULL)
586 1.3.4.2 skrll kdebug_secreplay(sav->replay);
587 1.3.4.2 skrll if (sav->lft_c != NULL)
588 1.3.4.2 skrll kdebug_sadb_lifetime((struct sadb_ext *)sav->lft_c);
589 1.3.4.2 skrll if (sav->lft_h != NULL)
590 1.3.4.2 skrll kdebug_sadb_lifetime((struct sadb_ext *)sav->lft_h);
591 1.3.4.2 skrll if (sav->lft_s != NULL)
592 1.3.4.2 skrll kdebug_sadb_lifetime((struct sadb_ext *)sav->lft_s);
593 1.3.4.2 skrll
594 1.3.4.2 skrll #if notyet
595 1.3.4.2 skrll /* XXX: misc[123] ? */
596 1.3.4.2 skrll #endif
597 1.3.4.2 skrll
598 1.3.4.2 skrll return;
599 1.3.4.2 skrll }
600 1.3.4.2 skrll
601 1.3.4.2 skrll static void
602 1.3.4.2 skrll kdebug_secreplay(rpl)
603 1.3.4.2 skrll struct secreplay *rpl;
604 1.3.4.2 skrll {
605 1.3.4.2 skrll int len, l;
606 1.3.4.2 skrll
607 1.3.4.2 skrll /* sanity check */
608 1.3.4.2 skrll if (rpl == NULL)
609 1.3.4.2 skrll panic("kdebug_secreplay: NULL pointer was passed.\n");
610 1.3.4.2 skrll
611 1.3.4.2 skrll printf(" secreplay{ count=%u wsize=%u seq=%u lastseq=%u",
612 1.3.4.2 skrll rpl->count, rpl->wsize, rpl->seq, rpl->lastseq);
613 1.3.4.2 skrll
614 1.3.4.2 skrll if (rpl->bitmap == NULL) {
615 1.3.4.2 skrll printf(" }\n");
616 1.3.4.2 skrll return;
617 1.3.4.2 skrll }
618 1.3.4.2 skrll
619 1.3.4.2 skrll printf("\n bitmap { ");
620 1.3.4.2 skrll
621 1.3.4.2 skrll for (len = 0; len < rpl->wsize; len++) {
622 1.3.4.2 skrll for (l = 7; l >= 0; l--)
623 1.3.4.2 skrll printf("%u", (((rpl->bitmap)[len] >> l) & 1) ? 1 : 0);
624 1.3.4.2 skrll }
625 1.3.4.2 skrll printf(" }\n");
626 1.3.4.2 skrll
627 1.3.4.2 skrll return;
628 1.3.4.2 skrll }
629 1.3.4.2 skrll
630 1.3.4.2 skrll void
631 1.3.4.2 skrll kdebug_mbufhdr(m)
632 1.3.4.2 skrll struct mbuf *m;
633 1.3.4.2 skrll {
634 1.3.4.2 skrll /* sanity check */
635 1.3.4.2 skrll if (m == NULL)
636 1.3.4.2 skrll return;
637 1.3.4.2 skrll
638 1.3.4.2 skrll printf("mbuf(%p){ m_next:%p m_nextpkt:%p m_data:%p "
639 1.3.4.2 skrll "m_len:%d m_type:0x%02x m_flags:0x%02x }\n",
640 1.3.4.2 skrll m, m->m_next, m->m_nextpkt, m->m_data,
641 1.3.4.2 skrll m->m_len, m->m_type, m->m_flags);
642 1.3.4.2 skrll
643 1.3.4.2 skrll if (m->m_flags & M_PKTHDR) {
644 1.3.4.2 skrll printf(" m_pkthdr{ len:%d rcvif:%p }\n",
645 1.3.4.2 skrll m->m_pkthdr.len, m->m_pkthdr.rcvif);
646 1.3.4.2 skrll }
647 1.3.4.2 skrll
648 1.3.4.2 skrll if (m->m_flags & M_EXT) {
649 1.3.4.2 skrll #ifdef __FreeBSD__ /* mbuf differences */
650 1.3.4.2 skrll printf(" m_ext{ ext_buf:%p ext_free:%p "
651 1.3.4.2 skrll "ext_size:%u ext_ref:%p }\n",
652 1.3.4.2 skrll m->m_ext.ext_buf, m->m_ext.ext_free,
653 1.3.4.2 skrll m->m_ext.ext_size, m->m_ext.ext_ref);
654 1.3.4.2 skrll #endif /* __FreeBSD__ */
655 1.3.4.2 skrll }
656 1.3.4.2 skrll
657 1.3.4.2 skrll return;
658 1.3.4.2 skrll }
659 1.3.4.2 skrll
660 1.3.4.2 skrll void
661 1.3.4.2 skrll kdebug_mbuf(m0)
662 1.3.4.2 skrll struct mbuf *m0;
663 1.3.4.2 skrll {
664 1.3.4.2 skrll struct mbuf *m = m0;
665 1.3.4.2 skrll int i, j;
666 1.3.4.2 skrll
667 1.3.4.2 skrll for (j = 0; m; m = m->m_next) {
668 1.3.4.2 skrll kdebug_mbufhdr(m);
669 1.3.4.2 skrll printf(" m_data:\n");
670 1.3.4.2 skrll for (i = 0; i < m->m_len; i++) {
671 1.3.4.2 skrll if (i && i % 32 == 0)
672 1.3.4.2 skrll printf("\n");
673 1.3.4.2 skrll if (i % 4 == 0)
674 1.3.4.2 skrll printf(" ");
675 1.3.4.2 skrll printf("%02x", mtod(m, u_char *)[i]);
676 1.3.4.2 skrll j++;
677 1.3.4.2 skrll }
678 1.3.4.2 skrll printf("\n");
679 1.3.4.2 skrll }
680 1.3.4.2 skrll
681 1.3.4.2 skrll return;
682 1.3.4.2 skrll }
683 1.3.4.2 skrll #endif /* _KERNEL */
684 1.3.4.2 skrll
685 1.3.4.2 skrll void
686 1.3.4.2 skrll kdebug_sockaddr(addr)
687 1.3.4.2 skrll struct sockaddr *addr;
688 1.3.4.2 skrll {
689 1.3.4.2 skrll struct sockaddr_in *sin4;
690 1.3.4.2 skrll #ifdef INET6
691 1.3.4.2 skrll struct sockaddr_in6 *sin6;
692 1.3.4.2 skrll #endif
693 1.3.4.2 skrll
694 1.3.4.2 skrll /* sanity check */
695 1.3.4.2 skrll if (addr == NULL)
696 1.3.4.2 skrll panic("kdebug_sockaddr: NULL pointer was passed.\n");
697 1.3.4.2 skrll
698 1.3.4.2 skrll /* NOTE: We deal with port number as host byte order. */
699 1.3.4.2 skrll printf("sockaddr{ len=%u family=%u", addr->sa_len, addr->sa_family);
700 1.3.4.2 skrll
701 1.3.4.2 skrll switch (addr->sa_family) {
702 1.3.4.2 skrll case AF_INET:
703 1.3.4.2 skrll sin4 = (struct sockaddr_in *)addr;
704 1.3.4.2 skrll printf(" port=%u\n", ntohs(sin4->sin_port));
705 1.3.4.2 skrll ipsec_hexdump((caddr_t)&sin4->sin_addr, sizeof(sin4->sin_addr));
706 1.3.4.2 skrll break;
707 1.3.4.2 skrll #ifdef INET6
708 1.3.4.2 skrll case AF_INET6:
709 1.3.4.2 skrll sin6 = (struct sockaddr_in6 *)addr;
710 1.3.4.2 skrll printf(" port=%u\n", ntohs(sin6->sin6_port));
711 1.3.4.2 skrll printf(" flowinfo=0x%08x, scope_id=0x%08x\n",
712 1.3.4.2 skrll sin6->sin6_flowinfo, sin6->sin6_scope_id);
713 1.3.4.2 skrll ipsec_hexdump((caddr_t)&sin6->sin6_addr,
714 1.3.4.2 skrll sizeof(sin6->sin6_addr));
715 1.3.4.2 skrll break;
716 1.3.4.2 skrll #endif
717 1.3.4.2 skrll }
718 1.3.4.2 skrll
719 1.3.4.2 skrll printf(" }\n");
720 1.3.4.2 skrll
721 1.3.4.2 skrll return;
722 1.3.4.2 skrll }
723 1.3.4.2 skrll
724 1.3.4.2 skrll void
725 1.3.4.2 skrll ipsec_bindump(buf, len)
726 1.3.4.2 skrll caddr_t buf;
727 1.3.4.2 skrll int len;
728 1.3.4.2 skrll {
729 1.3.4.2 skrll int i;
730 1.3.4.2 skrll
731 1.3.4.2 skrll for (i = 0; i < len; i++)
732 1.3.4.2 skrll printf("%c", (unsigned char)buf[i]);
733 1.3.4.2 skrll
734 1.3.4.2 skrll return;
735 1.3.4.2 skrll }
736 1.3.4.2 skrll
737 1.3.4.2 skrll
738 1.3.4.2 skrll void
739 1.3.4.2 skrll ipsec_hexdump(buf, len)
740 1.3.4.2 skrll caddr_t buf;
741 1.3.4.2 skrll int len;
742 1.3.4.2 skrll {
743 1.3.4.2 skrll int i;
744 1.3.4.2 skrll
745 1.3.4.2 skrll for (i = 0; i < len; i++) {
746 1.3.4.2 skrll if (i != 0 && i % 32 == 0) printf("\n");
747 1.3.4.2 skrll if (i % 4 == 0) printf(" ");
748 1.3.4.2 skrll printf("%02x", (unsigned char)buf[i]);
749 1.3.4.2 skrll }
750 1.3.4.2 skrll #if 0
751 1.3.4.2 skrll if (i % 32 != 0) printf("\n");
752 1.3.4.2 skrll #endif
753 1.3.4.2 skrll
754 1.3.4.2 skrll return;
755 1.3.4.2 skrll }
756