1a9643ea8Slogwang /* $FreeBSD$ */
2a9643ea8Slogwang /* $KAME: key_debug.c,v 1.26 2001/06/27 10:46:50 sakane Exp $ */
3a9643ea8Slogwang
4a9643ea8Slogwang /*-
5*22ce4affSfengbojiang * SPDX-License-Identifier: BSD-3-Clause
6*22ce4affSfengbojiang *
7a9643ea8Slogwang * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
8a9643ea8Slogwang * All rights reserved.
9a9643ea8Slogwang *
10a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without
11a9643ea8Slogwang * modification, are permitted provided that the following conditions
12a9643ea8Slogwang * are met:
13a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright
14a9643ea8Slogwang * notice, this list of conditions and the following disclaimer.
15a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright
16a9643ea8Slogwang * notice, this list of conditions and the following disclaimer in the
17a9643ea8Slogwang * documentation and/or other materials provided with the distribution.
18a9643ea8Slogwang * 3. Neither the name of the project nor the names of its contributors
19a9643ea8Slogwang * may be used to endorse or promote products derived from this software
20a9643ea8Slogwang * without specific prior written permission.
21a9643ea8Slogwang *
22a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
23a9643ea8Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24a9643ea8Slogwang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25a9643ea8Slogwang * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
26a9643ea8Slogwang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27a9643ea8Slogwang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28a9643ea8Slogwang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29a9643ea8Slogwang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30a9643ea8Slogwang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31a9643ea8Slogwang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32a9643ea8Slogwang * SUCH DAMAGE.
33a9643ea8Slogwang */
34a9643ea8Slogwang
35a9643ea8Slogwang #ifdef _KERNEL
36a9643ea8Slogwang #include "opt_inet.h"
37a9643ea8Slogwang #include "opt_inet6.h"
38a9643ea8Slogwang #include "opt_ipsec.h"
39a9643ea8Slogwang #endif
40a9643ea8Slogwang
41a9643ea8Slogwang #include <sys/param.h>
42a9643ea8Slogwang #ifdef _KERNEL
43a9643ea8Slogwang #include <sys/systm.h>
44*22ce4affSfengbojiang #include <sys/lock.h>
45a9643ea8Slogwang #include <sys/malloc.h>
46a9643ea8Slogwang #include <sys/mbuf.h>
47*22ce4affSfengbojiang #include <sys/mutex.h>
48a9643ea8Slogwang #include <sys/queue.h>
49a9643ea8Slogwang #endif
50a9643ea8Slogwang #include <sys/socket.h>
51a9643ea8Slogwang
52a9643ea8Slogwang #include <net/vnet.h>
53a9643ea8Slogwang
54a9643ea8Slogwang #include <netipsec/key_var.h>
55a9643ea8Slogwang #include <netipsec/key_debug.h>
56a9643ea8Slogwang
57a9643ea8Slogwang #include <netinet/in.h>
58a9643ea8Slogwang #include <netipsec/ipsec.h>
59a9643ea8Slogwang #ifdef _KERNEL
60a9643ea8Slogwang #include <netipsec/keydb.h>
61*22ce4affSfengbojiang #include <netipsec/xform.h>
62a9643ea8Slogwang #endif
63a9643ea8Slogwang
64a9643ea8Slogwang #ifndef _KERNEL
65a9643ea8Slogwang #include <ctype.h>
66a9643ea8Slogwang #include <stdio.h>
67a9643ea8Slogwang #include <stdlib.h>
68*22ce4affSfengbojiang #include <arpa/inet.h>
69a9643ea8Slogwang #endif /* !_KERNEL */
70a9643ea8Slogwang
71a9643ea8Slogwang static void kdebug_sadb_prop(struct sadb_ext *);
72a9643ea8Slogwang static void kdebug_sadb_identity(struct sadb_ext *);
73a9643ea8Slogwang static void kdebug_sadb_supported(struct sadb_ext *);
74a9643ea8Slogwang static void kdebug_sadb_lifetime(struct sadb_ext *);
75a9643ea8Slogwang static void kdebug_sadb_sa(struct sadb_ext *);
76a9643ea8Slogwang static void kdebug_sadb_address(struct sadb_ext *);
77a9643ea8Slogwang static void kdebug_sadb_key(struct sadb_ext *);
78a9643ea8Slogwang static void kdebug_sadb_x_sa2(struct sadb_ext *);
79*22ce4affSfengbojiang static void kdebug_sadb_x_sa_replay(struct sadb_ext *);
80*22ce4affSfengbojiang static void kdebug_sadb_x_natt(struct sadb_ext *);
81a9643ea8Slogwang
82a9643ea8Slogwang #ifndef _KERNEL
83a9643ea8Slogwang #define panic(fmt, ...) { printf(fmt, ## __VA_ARGS__); exit(-1); }
84a9643ea8Slogwang #endif
85a9643ea8Slogwang
86a9643ea8Slogwang /* NOTE: host byte order */
87a9643ea8Slogwang
88*22ce4affSfengbojiang static const char*
kdebug_sadb_type(uint8_t type)89*22ce4affSfengbojiang kdebug_sadb_type(uint8_t type)
90*22ce4affSfengbojiang {
91*22ce4affSfengbojiang #define SADB_NAME(n) case SADB_ ## n: return (#n)
92*22ce4affSfengbojiang
93*22ce4affSfengbojiang switch (type) {
94*22ce4affSfengbojiang SADB_NAME(RESERVED);
95*22ce4affSfengbojiang SADB_NAME(GETSPI);
96*22ce4affSfengbojiang SADB_NAME(UPDATE);
97*22ce4affSfengbojiang SADB_NAME(ADD);
98*22ce4affSfengbojiang SADB_NAME(DELETE);
99*22ce4affSfengbojiang SADB_NAME(GET);
100*22ce4affSfengbojiang SADB_NAME(ACQUIRE);
101*22ce4affSfengbojiang SADB_NAME(REGISTER);
102*22ce4affSfengbojiang SADB_NAME(EXPIRE);
103*22ce4affSfengbojiang SADB_NAME(FLUSH);
104*22ce4affSfengbojiang SADB_NAME(DUMP);
105*22ce4affSfengbojiang SADB_NAME(X_PROMISC);
106*22ce4affSfengbojiang SADB_NAME(X_PCHANGE);
107*22ce4affSfengbojiang SADB_NAME(X_SPDUPDATE);
108*22ce4affSfengbojiang SADB_NAME(X_SPDADD);
109*22ce4affSfengbojiang SADB_NAME(X_SPDDELETE);
110*22ce4affSfengbojiang SADB_NAME(X_SPDGET);
111*22ce4affSfengbojiang SADB_NAME(X_SPDACQUIRE);
112*22ce4affSfengbojiang SADB_NAME(X_SPDDUMP);
113*22ce4affSfengbojiang SADB_NAME(X_SPDFLUSH);
114*22ce4affSfengbojiang SADB_NAME(X_SPDSETIDX);
115*22ce4affSfengbojiang SADB_NAME(X_SPDEXPIRE);
116*22ce4affSfengbojiang SADB_NAME(X_SPDDELETE2);
117*22ce4affSfengbojiang default:
118*22ce4affSfengbojiang return ("UNKNOWN");
119*22ce4affSfengbojiang }
120*22ce4affSfengbojiang #undef SADB_NAME
121*22ce4affSfengbojiang }
122*22ce4affSfengbojiang
123*22ce4affSfengbojiang static const char*
kdebug_sadb_exttype(uint16_t type)124*22ce4affSfengbojiang kdebug_sadb_exttype(uint16_t type)
125*22ce4affSfengbojiang {
126*22ce4affSfengbojiang #define EXT_NAME(n) case SADB_EXT_ ## n: return (#n)
127*22ce4affSfengbojiang #define X_NAME(n) case SADB_X_EXT_ ## n: return (#n)
128*22ce4affSfengbojiang
129*22ce4affSfengbojiang switch (type) {
130*22ce4affSfengbojiang EXT_NAME(RESERVED);
131*22ce4affSfengbojiang EXT_NAME(SA);
132*22ce4affSfengbojiang EXT_NAME(LIFETIME_CURRENT);
133*22ce4affSfengbojiang EXT_NAME(LIFETIME_HARD);
134*22ce4affSfengbojiang EXT_NAME(LIFETIME_SOFT);
135*22ce4affSfengbojiang EXT_NAME(ADDRESS_SRC);
136*22ce4affSfengbojiang EXT_NAME(ADDRESS_DST);
137*22ce4affSfengbojiang EXT_NAME(ADDRESS_PROXY);
138*22ce4affSfengbojiang EXT_NAME(KEY_AUTH);
139*22ce4affSfengbojiang EXT_NAME(KEY_ENCRYPT);
140*22ce4affSfengbojiang EXT_NAME(IDENTITY_SRC);
141*22ce4affSfengbojiang EXT_NAME(IDENTITY_DST);
142*22ce4affSfengbojiang EXT_NAME(SENSITIVITY);
143*22ce4affSfengbojiang EXT_NAME(PROPOSAL);
144*22ce4affSfengbojiang EXT_NAME(SUPPORTED_AUTH);
145*22ce4affSfengbojiang EXT_NAME(SUPPORTED_ENCRYPT);
146*22ce4affSfengbojiang EXT_NAME(SPIRANGE);
147*22ce4affSfengbojiang X_NAME(KMPRIVATE);
148*22ce4affSfengbojiang X_NAME(POLICY);
149*22ce4affSfengbojiang X_NAME(SA2);
150*22ce4affSfengbojiang X_NAME(NAT_T_TYPE);
151*22ce4affSfengbojiang X_NAME(NAT_T_SPORT);
152*22ce4affSfengbojiang X_NAME(NAT_T_DPORT);
153*22ce4affSfengbojiang X_NAME(NAT_T_OAI);
154*22ce4affSfengbojiang X_NAME(NAT_T_OAR);
155*22ce4affSfengbojiang X_NAME(NAT_T_FRAG);
156*22ce4affSfengbojiang X_NAME(SA_REPLAY);
157*22ce4affSfengbojiang X_NAME(NEW_ADDRESS_SRC);
158*22ce4affSfengbojiang X_NAME(NEW_ADDRESS_DST);
159*22ce4affSfengbojiang default:
160*22ce4affSfengbojiang return ("UNKNOWN");
161*22ce4affSfengbojiang };
162*22ce4affSfengbojiang #undef EXT_NAME
163*22ce4affSfengbojiang #undef X_NAME
164*22ce4affSfengbojiang }
165*22ce4affSfengbojiang
166a9643ea8Slogwang /* %%%: about struct sadb_msg */
167a9643ea8Slogwang void
kdebug_sadb(struct sadb_msg * base)168a9643ea8Slogwang kdebug_sadb(struct sadb_msg *base)
169a9643ea8Slogwang {
170a9643ea8Slogwang struct sadb_ext *ext;
171a9643ea8Slogwang int tlen, extlen;
172a9643ea8Slogwang
173a9643ea8Slogwang /* sanity check */
174a9643ea8Slogwang if (base == NULL)
175a9643ea8Slogwang panic("%s: NULL pointer was passed.\n", __func__);
176a9643ea8Slogwang
177*22ce4affSfengbojiang printf("sadb_msg{ version=%u type=%u(%s) errno=%u satype=%u\n",
178a9643ea8Slogwang base->sadb_msg_version, base->sadb_msg_type,
179*22ce4affSfengbojiang kdebug_sadb_type(base->sadb_msg_type),
180a9643ea8Slogwang base->sadb_msg_errno, base->sadb_msg_satype);
181a9643ea8Slogwang printf(" len=%u reserved=%u seq=%u pid=%u\n",
182a9643ea8Slogwang base->sadb_msg_len, base->sadb_msg_reserved,
183a9643ea8Slogwang base->sadb_msg_seq, base->sadb_msg_pid);
184a9643ea8Slogwang
185a9643ea8Slogwang tlen = PFKEY_UNUNIT64(base->sadb_msg_len) - sizeof(struct sadb_msg);
186a9643ea8Slogwang ext = (struct sadb_ext *)((caddr_t)base + sizeof(struct sadb_msg));
187a9643ea8Slogwang
188a9643ea8Slogwang while (tlen > 0) {
189*22ce4affSfengbojiang printf("sadb_ext{ len=%u type=%u(%s) }\n",
190*22ce4affSfengbojiang ext->sadb_ext_len, ext->sadb_ext_type,
191*22ce4affSfengbojiang kdebug_sadb_exttype(ext->sadb_ext_type));
192a9643ea8Slogwang
193a9643ea8Slogwang if (ext->sadb_ext_len == 0) {
194a9643ea8Slogwang printf("%s: invalid ext_len=0 was passed.\n", __func__);
195a9643ea8Slogwang return;
196a9643ea8Slogwang }
197a9643ea8Slogwang if (ext->sadb_ext_len > tlen) {
198a9643ea8Slogwang printf("%s: ext_len too big (%u > %u).\n",
199a9643ea8Slogwang __func__, ext->sadb_ext_len, tlen);
200a9643ea8Slogwang return;
201a9643ea8Slogwang }
202a9643ea8Slogwang
203a9643ea8Slogwang switch (ext->sadb_ext_type) {
204a9643ea8Slogwang case SADB_EXT_SA:
205a9643ea8Slogwang kdebug_sadb_sa(ext);
206a9643ea8Slogwang break;
207a9643ea8Slogwang case SADB_EXT_LIFETIME_CURRENT:
208a9643ea8Slogwang case SADB_EXT_LIFETIME_HARD:
209a9643ea8Slogwang case SADB_EXT_LIFETIME_SOFT:
210a9643ea8Slogwang kdebug_sadb_lifetime(ext);
211a9643ea8Slogwang break;
212a9643ea8Slogwang case SADB_EXT_ADDRESS_SRC:
213a9643ea8Slogwang case SADB_EXT_ADDRESS_DST:
214a9643ea8Slogwang case SADB_EXT_ADDRESS_PROXY:
215*22ce4affSfengbojiang case SADB_X_EXT_NAT_T_OAI:
216*22ce4affSfengbojiang case SADB_X_EXT_NAT_T_OAR:
217*22ce4affSfengbojiang case SADB_X_EXT_NEW_ADDRESS_SRC:
218*22ce4affSfengbojiang case SADB_X_EXT_NEW_ADDRESS_DST:
219a9643ea8Slogwang kdebug_sadb_address(ext);
220a9643ea8Slogwang break;
221a9643ea8Slogwang case SADB_EXT_KEY_AUTH:
222a9643ea8Slogwang case SADB_EXT_KEY_ENCRYPT:
223a9643ea8Slogwang kdebug_sadb_key(ext);
224a9643ea8Slogwang break;
225a9643ea8Slogwang case SADB_EXT_IDENTITY_SRC:
226a9643ea8Slogwang case SADB_EXT_IDENTITY_DST:
227a9643ea8Slogwang kdebug_sadb_identity(ext);
228a9643ea8Slogwang break;
229a9643ea8Slogwang case SADB_EXT_SENSITIVITY:
230a9643ea8Slogwang break;
231a9643ea8Slogwang case SADB_EXT_PROPOSAL:
232a9643ea8Slogwang kdebug_sadb_prop(ext);
233a9643ea8Slogwang break;
234a9643ea8Slogwang case SADB_EXT_SUPPORTED_AUTH:
235a9643ea8Slogwang case SADB_EXT_SUPPORTED_ENCRYPT:
236a9643ea8Slogwang kdebug_sadb_supported(ext);
237a9643ea8Slogwang break;
238a9643ea8Slogwang case SADB_EXT_SPIRANGE:
239a9643ea8Slogwang case SADB_X_EXT_KMPRIVATE:
240a9643ea8Slogwang break;
241a9643ea8Slogwang case SADB_X_EXT_POLICY:
242a9643ea8Slogwang kdebug_sadb_x_policy(ext);
243a9643ea8Slogwang break;
244a9643ea8Slogwang case SADB_X_EXT_SA2:
245a9643ea8Slogwang kdebug_sadb_x_sa2(ext);
246a9643ea8Slogwang break;
247*22ce4affSfengbojiang case SADB_X_EXT_SA_REPLAY:
248*22ce4affSfengbojiang kdebug_sadb_x_sa_replay(ext);
249*22ce4affSfengbojiang break;
250*22ce4affSfengbojiang case SADB_X_EXT_NAT_T_TYPE:
251*22ce4affSfengbojiang case SADB_X_EXT_NAT_T_SPORT:
252*22ce4affSfengbojiang case SADB_X_EXT_NAT_T_DPORT:
253*22ce4affSfengbojiang kdebug_sadb_x_natt(ext);
254*22ce4affSfengbojiang break;
255a9643ea8Slogwang default:
256a9643ea8Slogwang printf("%s: invalid ext_type %u\n", __func__,
257a9643ea8Slogwang ext->sadb_ext_type);
258a9643ea8Slogwang return;
259a9643ea8Slogwang }
260a9643ea8Slogwang
261a9643ea8Slogwang extlen = PFKEY_UNUNIT64(ext->sadb_ext_len);
262a9643ea8Slogwang tlen -= extlen;
263a9643ea8Slogwang ext = (struct sadb_ext *)((caddr_t)ext + extlen);
264a9643ea8Slogwang }
265a9643ea8Slogwang
266a9643ea8Slogwang return;
267a9643ea8Slogwang }
268a9643ea8Slogwang
269a9643ea8Slogwang static void
kdebug_sadb_prop(struct sadb_ext * ext)270a9643ea8Slogwang kdebug_sadb_prop(struct sadb_ext *ext)
271a9643ea8Slogwang {
272a9643ea8Slogwang struct sadb_prop *prop = (struct sadb_prop *)ext;
273a9643ea8Slogwang struct sadb_comb *comb;
274a9643ea8Slogwang int len;
275a9643ea8Slogwang
276a9643ea8Slogwang /* sanity check */
277a9643ea8Slogwang if (ext == NULL)
278a9643ea8Slogwang panic("%s: NULL pointer was passed.\n", __func__);
279a9643ea8Slogwang
280a9643ea8Slogwang len = (PFKEY_UNUNIT64(prop->sadb_prop_len) - sizeof(*prop))
281a9643ea8Slogwang / sizeof(*comb);
282a9643ea8Slogwang comb = (struct sadb_comb *)(prop + 1);
283a9643ea8Slogwang printf("sadb_prop{ replay=%u\n", prop->sadb_prop_replay);
284a9643ea8Slogwang
285a9643ea8Slogwang while (len--) {
286a9643ea8Slogwang printf("sadb_comb{ auth=%u encrypt=%u "
287a9643ea8Slogwang "flags=0x%04x reserved=0x%08x\n",
288a9643ea8Slogwang comb->sadb_comb_auth, comb->sadb_comb_encrypt,
289a9643ea8Slogwang comb->sadb_comb_flags, comb->sadb_comb_reserved);
290a9643ea8Slogwang
291a9643ea8Slogwang printf(" auth_minbits=%u auth_maxbits=%u "
292a9643ea8Slogwang "encrypt_minbits=%u encrypt_maxbits=%u\n",
293a9643ea8Slogwang comb->sadb_comb_auth_minbits,
294a9643ea8Slogwang comb->sadb_comb_auth_maxbits,
295a9643ea8Slogwang comb->sadb_comb_encrypt_minbits,
296a9643ea8Slogwang comb->sadb_comb_encrypt_maxbits);
297a9643ea8Slogwang
298a9643ea8Slogwang printf(" soft_alloc=%u hard_alloc=%u "
299a9643ea8Slogwang "soft_bytes=%lu hard_bytes=%lu\n",
300a9643ea8Slogwang comb->sadb_comb_soft_allocations,
301a9643ea8Slogwang comb->sadb_comb_hard_allocations,
302a9643ea8Slogwang (unsigned long)comb->sadb_comb_soft_bytes,
303a9643ea8Slogwang (unsigned long)comb->sadb_comb_hard_bytes);
304a9643ea8Slogwang
305a9643ea8Slogwang printf(" soft_alloc=%lu hard_alloc=%lu "
306a9643ea8Slogwang "soft_bytes=%lu hard_bytes=%lu }\n",
307a9643ea8Slogwang (unsigned long)comb->sadb_comb_soft_addtime,
308a9643ea8Slogwang (unsigned long)comb->sadb_comb_hard_addtime,
309a9643ea8Slogwang (unsigned long)comb->sadb_comb_soft_usetime,
310a9643ea8Slogwang (unsigned long)comb->sadb_comb_hard_usetime);
311a9643ea8Slogwang comb++;
312a9643ea8Slogwang }
313a9643ea8Slogwang printf("}\n");
314a9643ea8Slogwang
315a9643ea8Slogwang return;
316a9643ea8Slogwang }
317a9643ea8Slogwang
318a9643ea8Slogwang static void
kdebug_sadb_identity(struct sadb_ext * ext)319a9643ea8Slogwang kdebug_sadb_identity(struct sadb_ext *ext)
320a9643ea8Slogwang {
321a9643ea8Slogwang struct sadb_ident *id = (struct sadb_ident *)ext;
322a9643ea8Slogwang int len;
323a9643ea8Slogwang
324a9643ea8Slogwang /* sanity check */
325a9643ea8Slogwang if (ext == NULL)
326a9643ea8Slogwang panic("%s: NULL pointer was passed.\n", __func__);
327a9643ea8Slogwang
328a9643ea8Slogwang len = PFKEY_UNUNIT64(id->sadb_ident_len) - sizeof(*id);
329a9643ea8Slogwang printf("sadb_ident_%s{",
330a9643ea8Slogwang id->sadb_ident_exttype == SADB_EXT_IDENTITY_SRC ? "src" : "dst");
331a9643ea8Slogwang switch (id->sadb_ident_type) {
332a9643ea8Slogwang default:
333a9643ea8Slogwang printf(" type=%d id=%lu",
334a9643ea8Slogwang id->sadb_ident_type, (u_long)id->sadb_ident_id);
335a9643ea8Slogwang if (len) {
336a9643ea8Slogwang #ifdef _KERNEL
337a9643ea8Slogwang ipsec_hexdump((caddr_t)(id + 1), len); /*XXX cast ?*/
338a9643ea8Slogwang #else
339a9643ea8Slogwang char *p, *ep;
340a9643ea8Slogwang printf("\n str=\"");
341a9643ea8Slogwang p = (char *)(id + 1);
342a9643ea8Slogwang ep = p + len;
343a9643ea8Slogwang for (/*nothing*/; *p && p < ep; p++) {
344a9643ea8Slogwang if (isprint(*p))
345a9643ea8Slogwang printf("%c", *p & 0xff);
346a9643ea8Slogwang else
347a9643ea8Slogwang printf("\\%03o", *p & 0xff);
348a9643ea8Slogwang }
349a9643ea8Slogwang #endif
350a9643ea8Slogwang printf("\"");
351a9643ea8Slogwang }
352a9643ea8Slogwang break;
353a9643ea8Slogwang }
354a9643ea8Slogwang
355a9643ea8Slogwang printf(" }\n");
356a9643ea8Slogwang
357a9643ea8Slogwang return;
358a9643ea8Slogwang }
359a9643ea8Slogwang
360a9643ea8Slogwang static void
kdebug_sadb_supported(struct sadb_ext * ext)361a9643ea8Slogwang kdebug_sadb_supported(struct sadb_ext *ext)
362a9643ea8Slogwang {
363a9643ea8Slogwang struct sadb_supported *sup = (struct sadb_supported *)ext;
364a9643ea8Slogwang struct sadb_alg *alg;
365a9643ea8Slogwang int len;
366a9643ea8Slogwang
367a9643ea8Slogwang /* sanity check */
368a9643ea8Slogwang if (ext == NULL)
369a9643ea8Slogwang panic("%s: NULL pointer was passed.\n", __func__);
370a9643ea8Slogwang
371a9643ea8Slogwang len = (PFKEY_UNUNIT64(sup->sadb_supported_len) - sizeof(*sup))
372a9643ea8Slogwang / sizeof(*alg);
373a9643ea8Slogwang alg = (struct sadb_alg *)(sup + 1);
374a9643ea8Slogwang printf("sadb_sup{\n");
375a9643ea8Slogwang while (len--) {
376a9643ea8Slogwang printf(" { id=%d ivlen=%d min=%d max=%d }\n",
377a9643ea8Slogwang alg->sadb_alg_id, alg->sadb_alg_ivlen,
378a9643ea8Slogwang alg->sadb_alg_minbits, alg->sadb_alg_maxbits);
379a9643ea8Slogwang alg++;
380a9643ea8Slogwang }
381a9643ea8Slogwang printf("}\n");
382a9643ea8Slogwang
383a9643ea8Slogwang return;
384a9643ea8Slogwang }
385a9643ea8Slogwang
386a9643ea8Slogwang static void
kdebug_sadb_lifetime(struct sadb_ext * ext)387a9643ea8Slogwang kdebug_sadb_lifetime(struct sadb_ext *ext)
388a9643ea8Slogwang {
389a9643ea8Slogwang struct sadb_lifetime *lft = (struct sadb_lifetime *)ext;
390a9643ea8Slogwang
391a9643ea8Slogwang /* sanity check */
392a9643ea8Slogwang if (ext == NULL)
393a9643ea8Slogwang panic("%s: NULL pointer was passed.\n", __func__);
394a9643ea8Slogwang
395a9643ea8Slogwang printf("sadb_lifetime{ alloc=%u, bytes=%u\n",
396a9643ea8Slogwang lft->sadb_lifetime_allocations,
397a9643ea8Slogwang (u_int32_t)lft->sadb_lifetime_bytes);
398a9643ea8Slogwang printf(" addtime=%u, usetime=%u }\n",
399a9643ea8Slogwang (u_int32_t)lft->sadb_lifetime_addtime,
400a9643ea8Slogwang (u_int32_t)lft->sadb_lifetime_usetime);
401a9643ea8Slogwang
402a9643ea8Slogwang return;
403a9643ea8Slogwang }
404a9643ea8Slogwang
405a9643ea8Slogwang static void
kdebug_sadb_sa(struct sadb_ext * ext)406a9643ea8Slogwang kdebug_sadb_sa(struct sadb_ext *ext)
407a9643ea8Slogwang {
408a9643ea8Slogwang struct sadb_sa *sa = (struct sadb_sa *)ext;
409a9643ea8Slogwang
410a9643ea8Slogwang /* sanity check */
411a9643ea8Slogwang if (ext == NULL)
412a9643ea8Slogwang panic("%s: NULL pointer was passed.\n", __func__);
413a9643ea8Slogwang
414a9643ea8Slogwang printf("sadb_sa{ spi=%u replay=%u state=%u\n",
415a9643ea8Slogwang (u_int32_t)ntohl(sa->sadb_sa_spi), sa->sadb_sa_replay,
416a9643ea8Slogwang sa->sadb_sa_state);
417a9643ea8Slogwang printf(" auth=%u encrypt=%u flags=0x%08x }\n",
418a9643ea8Slogwang sa->sadb_sa_auth, sa->sadb_sa_encrypt, sa->sadb_sa_flags);
419a9643ea8Slogwang
420a9643ea8Slogwang return;
421a9643ea8Slogwang }
422a9643ea8Slogwang
423a9643ea8Slogwang static void
kdebug_sadb_address(struct sadb_ext * ext)424a9643ea8Slogwang kdebug_sadb_address(struct sadb_ext *ext)
425a9643ea8Slogwang {
426a9643ea8Slogwang struct sadb_address *addr = (struct sadb_address *)ext;
427a9643ea8Slogwang
428a9643ea8Slogwang /* sanity check */
429a9643ea8Slogwang if (ext == NULL)
430a9643ea8Slogwang panic("%s: NULL pointer was passed.\n", __func__);
431a9643ea8Slogwang
432a9643ea8Slogwang printf("sadb_address{ proto=%u prefixlen=%u reserved=0x%02x%02x }\n",
433a9643ea8Slogwang addr->sadb_address_proto, addr->sadb_address_prefixlen,
434a9643ea8Slogwang ((u_char *)&addr->sadb_address_reserved)[0],
435a9643ea8Slogwang ((u_char *)&addr->sadb_address_reserved)[1]);
436a9643ea8Slogwang
437a9643ea8Slogwang kdebug_sockaddr((struct sockaddr *)((caddr_t)ext + sizeof(*addr)));
438a9643ea8Slogwang }
439a9643ea8Slogwang
440a9643ea8Slogwang static void
kdebug_sadb_key(struct sadb_ext * ext)441a9643ea8Slogwang kdebug_sadb_key(struct sadb_ext *ext)
442a9643ea8Slogwang {
443a9643ea8Slogwang struct sadb_key *key = (struct sadb_key *)ext;
444a9643ea8Slogwang
445a9643ea8Slogwang /* sanity check */
446a9643ea8Slogwang if (ext == NULL)
447a9643ea8Slogwang panic("%s: NULL pointer was passed.\n", __func__);
448a9643ea8Slogwang
449a9643ea8Slogwang printf("sadb_key{ bits=%u reserved=%u\n",
450a9643ea8Slogwang key->sadb_key_bits, key->sadb_key_reserved);
451a9643ea8Slogwang printf(" key=");
452a9643ea8Slogwang
453a9643ea8Slogwang /* sanity check 2 */
454a9643ea8Slogwang if ((key->sadb_key_bits >> 3) >
455a9643ea8Slogwang (PFKEY_UNUNIT64(key->sadb_key_len) - sizeof(struct sadb_key))) {
456a9643ea8Slogwang printf("%s: key length mismatch, bit:%d len:%ld.\n",
457a9643ea8Slogwang __func__,
458a9643ea8Slogwang key->sadb_key_bits >> 3,
459a9643ea8Slogwang (long)PFKEY_UNUNIT64(key->sadb_key_len) - sizeof(struct sadb_key));
460a9643ea8Slogwang }
461a9643ea8Slogwang
462a9643ea8Slogwang ipsec_hexdump((caddr_t)key + sizeof(struct sadb_key),
463a9643ea8Slogwang key->sadb_key_bits >> 3);
464a9643ea8Slogwang printf(" }\n");
465a9643ea8Slogwang return;
466a9643ea8Slogwang }
467a9643ea8Slogwang
468a9643ea8Slogwang static void
kdebug_sadb_x_sa2(struct sadb_ext * ext)469a9643ea8Slogwang kdebug_sadb_x_sa2(struct sadb_ext *ext)
470a9643ea8Slogwang {
471a9643ea8Slogwang struct sadb_x_sa2 *sa2 = (struct sadb_x_sa2 *)ext;
472a9643ea8Slogwang
473a9643ea8Slogwang /* sanity check */
474a9643ea8Slogwang if (ext == NULL)
475a9643ea8Slogwang panic("%s: NULL pointer was passed.\n", __func__);
476a9643ea8Slogwang
477a9643ea8Slogwang printf("sadb_x_sa2{ mode=%u reqid=%u\n",
478a9643ea8Slogwang sa2->sadb_x_sa2_mode, sa2->sadb_x_sa2_reqid);
479a9643ea8Slogwang printf(" reserved1=%u reserved2=%u sequence=%u }\n",
480a9643ea8Slogwang sa2->sadb_x_sa2_reserved1, sa2->sadb_x_sa2_reserved2,
481a9643ea8Slogwang sa2->sadb_x_sa2_sequence);
482a9643ea8Slogwang
483a9643ea8Slogwang return;
484a9643ea8Slogwang }
485a9643ea8Slogwang
486*22ce4affSfengbojiang static void
kdebug_sadb_x_sa_replay(struct sadb_ext * ext)487*22ce4affSfengbojiang kdebug_sadb_x_sa_replay(struct sadb_ext *ext)
488*22ce4affSfengbojiang {
489*22ce4affSfengbojiang struct sadb_x_sa_replay *replay;
490*22ce4affSfengbojiang
491*22ce4affSfengbojiang /* sanity check */
492*22ce4affSfengbojiang if (ext == NULL)
493*22ce4affSfengbojiang panic("%s: NULL pointer was passed.\n", __func__);
494*22ce4affSfengbojiang
495*22ce4affSfengbojiang replay = (struct sadb_x_sa_replay *)ext;
496*22ce4affSfengbojiang printf("sadb_x_sa_replay{ replay=%u }\n",
497*22ce4affSfengbojiang replay->sadb_x_sa_replay_replay);
498*22ce4affSfengbojiang }
499*22ce4affSfengbojiang
500*22ce4affSfengbojiang static void
kdebug_sadb_x_natt(struct sadb_ext * ext)501*22ce4affSfengbojiang kdebug_sadb_x_natt(struct sadb_ext *ext)
502*22ce4affSfengbojiang {
503*22ce4affSfengbojiang struct sadb_x_nat_t_type *type;
504*22ce4affSfengbojiang struct sadb_x_nat_t_port *port;
505*22ce4affSfengbojiang
506*22ce4affSfengbojiang /* sanity check */
507*22ce4affSfengbojiang if (ext == NULL)
508*22ce4affSfengbojiang panic("%s: NULL pointer was passed.\n", __func__);
509*22ce4affSfengbojiang
510*22ce4affSfengbojiang if (ext->sadb_ext_type == SADB_X_EXT_NAT_T_TYPE) {
511*22ce4affSfengbojiang type = (struct sadb_x_nat_t_type *)ext;
512*22ce4affSfengbojiang printf("sadb_x_nat_t_type{ type=%u }\n",
513*22ce4affSfengbojiang type->sadb_x_nat_t_type_type);
514*22ce4affSfengbojiang } else {
515*22ce4affSfengbojiang port = (struct sadb_x_nat_t_port *)ext;
516*22ce4affSfengbojiang printf("sadb_x_nat_t_port{ port=%u }\n",
517*22ce4affSfengbojiang ntohs(port->sadb_x_nat_t_port_port));
518*22ce4affSfengbojiang }
519*22ce4affSfengbojiang }
520*22ce4affSfengbojiang
521a9643ea8Slogwang void
kdebug_sadb_x_policy(struct sadb_ext * ext)522a9643ea8Slogwang kdebug_sadb_x_policy(struct sadb_ext *ext)
523a9643ea8Slogwang {
524a9643ea8Slogwang struct sadb_x_policy *xpl = (struct sadb_x_policy *)ext;
525a9643ea8Slogwang struct sockaddr *addr;
526a9643ea8Slogwang
527a9643ea8Slogwang /* sanity check */
528a9643ea8Slogwang if (ext == NULL)
529a9643ea8Slogwang panic("%s: NULL pointer was passed.\n", __func__);
530a9643ea8Slogwang
531*22ce4affSfengbojiang printf("sadb_x_policy{ type=%u dir=%u id=%x scope=%u %s=%u }\n",
532a9643ea8Slogwang xpl->sadb_x_policy_type, xpl->sadb_x_policy_dir,
533*22ce4affSfengbojiang xpl->sadb_x_policy_id, xpl->sadb_x_policy_scope,
534*22ce4affSfengbojiang xpl->sadb_x_policy_scope == IPSEC_POLICYSCOPE_IFNET ?
535*22ce4affSfengbojiang "ifindex": "priority", xpl->sadb_x_policy_priority);
536a9643ea8Slogwang
537a9643ea8Slogwang if (xpl->sadb_x_policy_type == IPSEC_POLICY_IPSEC) {
538a9643ea8Slogwang int tlen;
539a9643ea8Slogwang struct sadb_x_ipsecrequest *xisr;
540a9643ea8Slogwang
541a9643ea8Slogwang tlen = PFKEY_UNUNIT64(xpl->sadb_x_policy_len) - sizeof(*xpl);
542a9643ea8Slogwang xisr = (struct sadb_x_ipsecrequest *)(xpl + 1);
543a9643ea8Slogwang
544a9643ea8Slogwang while (tlen > 0) {
545a9643ea8Slogwang printf(" { len=%u proto=%u mode=%u level=%u reqid=%u\n",
546a9643ea8Slogwang xisr->sadb_x_ipsecrequest_len,
547a9643ea8Slogwang xisr->sadb_x_ipsecrequest_proto,
548a9643ea8Slogwang xisr->sadb_x_ipsecrequest_mode,
549a9643ea8Slogwang xisr->sadb_x_ipsecrequest_level,
550a9643ea8Slogwang xisr->sadb_x_ipsecrequest_reqid);
551a9643ea8Slogwang
552a9643ea8Slogwang if (xisr->sadb_x_ipsecrequest_len > sizeof(*xisr)) {
553a9643ea8Slogwang addr = (struct sockaddr *)(xisr + 1);
554a9643ea8Slogwang kdebug_sockaddr(addr);
555a9643ea8Slogwang addr = (struct sockaddr *)((caddr_t)addr
556a9643ea8Slogwang + addr->sa_len);
557a9643ea8Slogwang kdebug_sockaddr(addr);
558a9643ea8Slogwang }
559a9643ea8Slogwang
560a9643ea8Slogwang printf(" }\n");
561a9643ea8Slogwang
562a9643ea8Slogwang /* prevent infinite loop */
563a9643ea8Slogwang if (xisr->sadb_x_ipsecrequest_len <= 0) {
564a9643ea8Slogwang printf("%s: wrong policy struct.\n", __func__);
565a9643ea8Slogwang return;
566a9643ea8Slogwang }
567a9643ea8Slogwang /* prevent overflow */
568a9643ea8Slogwang if (xisr->sadb_x_ipsecrequest_len > tlen) {
569a9643ea8Slogwang printf("%s: invalid ipsec policy length "
570a9643ea8Slogwang "(%u > %u)\n", __func__,
571a9643ea8Slogwang xisr->sadb_x_ipsecrequest_len, tlen);
572a9643ea8Slogwang return;
573a9643ea8Slogwang }
574a9643ea8Slogwang
575a9643ea8Slogwang tlen -= xisr->sadb_x_ipsecrequest_len;
576a9643ea8Slogwang
577a9643ea8Slogwang xisr = (struct sadb_x_ipsecrequest *)((caddr_t)xisr
578a9643ea8Slogwang + xisr->sadb_x_ipsecrequest_len);
579a9643ea8Slogwang }
580a9643ea8Slogwang
581a9643ea8Slogwang if (tlen != 0)
582a9643ea8Slogwang panic("%s: wrong policy struct.\n", __func__);
583a9643ea8Slogwang }
584a9643ea8Slogwang
585a9643ea8Slogwang return;
586a9643ea8Slogwang }
587a9643ea8Slogwang
588a9643ea8Slogwang #ifdef _KERNEL
589a9643ea8Slogwang /* %%%: about SPD and SAD */
590*22ce4affSfengbojiang const char*
kdebug_secpolicy_state(u_int state)591*22ce4affSfengbojiang kdebug_secpolicy_state(u_int state)
592*22ce4affSfengbojiang {
593*22ce4affSfengbojiang
594*22ce4affSfengbojiang switch (state) {
595*22ce4affSfengbojiang case IPSEC_SPSTATE_DEAD:
596*22ce4affSfengbojiang return ("dead");
597*22ce4affSfengbojiang case IPSEC_SPSTATE_LARVAL:
598*22ce4affSfengbojiang return ("larval");
599*22ce4affSfengbojiang case IPSEC_SPSTATE_ALIVE:
600*22ce4affSfengbojiang return ("alive");
601*22ce4affSfengbojiang case IPSEC_SPSTATE_PCB:
602*22ce4affSfengbojiang return ("pcb");
603*22ce4affSfengbojiang case IPSEC_SPSTATE_IFNET:
604*22ce4affSfengbojiang return ("ifnet");
605*22ce4affSfengbojiang }
606*22ce4affSfengbojiang return ("unknown");
607*22ce4affSfengbojiang }
608*22ce4affSfengbojiang
609*22ce4affSfengbojiang const char*
kdebug_secpolicy_policy(u_int policy)610*22ce4affSfengbojiang kdebug_secpolicy_policy(u_int policy)
611*22ce4affSfengbojiang {
612*22ce4affSfengbojiang
613*22ce4affSfengbojiang switch (policy) {
614*22ce4affSfengbojiang case IPSEC_POLICY_DISCARD:
615*22ce4affSfengbojiang return ("discard");
616*22ce4affSfengbojiang case IPSEC_POLICY_NONE:
617*22ce4affSfengbojiang return ("none");
618*22ce4affSfengbojiang case IPSEC_POLICY_IPSEC:
619*22ce4affSfengbojiang return ("ipsec");
620*22ce4affSfengbojiang case IPSEC_POLICY_ENTRUST:
621*22ce4affSfengbojiang return ("entrust");
622*22ce4affSfengbojiang case IPSEC_POLICY_BYPASS:
623*22ce4affSfengbojiang return ("bypass");
624*22ce4affSfengbojiang }
625*22ce4affSfengbojiang return ("unknown");
626*22ce4affSfengbojiang }
627*22ce4affSfengbojiang
628*22ce4affSfengbojiang const char*
kdebug_secpolicyindex_dir(u_int dir)629*22ce4affSfengbojiang kdebug_secpolicyindex_dir(u_int dir)
630*22ce4affSfengbojiang {
631*22ce4affSfengbojiang
632*22ce4affSfengbojiang switch (dir) {
633*22ce4affSfengbojiang case IPSEC_DIR_ANY:
634*22ce4affSfengbojiang return ("any");
635*22ce4affSfengbojiang case IPSEC_DIR_INBOUND:
636*22ce4affSfengbojiang return ("in");
637*22ce4affSfengbojiang case IPSEC_DIR_OUTBOUND:
638*22ce4affSfengbojiang return ("out");
639*22ce4affSfengbojiang }
640*22ce4affSfengbojiang return ("unknown");
641*22ce4affSfengbojiang }
642*22ce4affSfengbojiang
643*22ce4affSfengbojiang const char*
kdebug_ipsecrequest_level(u_int level)644*22ce4affSfengbojiang kdebug_ipsecrequest_level(u_int level)
645*22ce4affSfengbojiang {
646*22ce4affSfengbojiang
647*22ce4affSfengbojiang switch (level) {
648*22ce4affSfengbojiang case IPSEC_LEVEL_DEFAULT:
649*22ce4affSfengbojiang return ("default");
650*22ce4affSfengbojiang case IPSEC_LEVEL_USE:
651*22ce4affSfengbojiang return ("use");
652*22ce4affSfengbojiang case IPSEC_LEVEL_REQUIRE:
653*22ce4affSfengbojiang return ("require");
654*22ce4affSfengbojiang case IPSEC_LEVEL_UNIQUE:
655*22ce4affSfengbojiang return ("unique");
656*22ce4affSfengbojiang }
657*22ce4affSfengbojiang return ("unknown");
658*22ce4affSfengbojiang }
659*22ce4affSfengbojiang
660*22ce4affSfengbojiang const char*
kdebug_secasindex_mode(u_int mode)661*22ce4affSfengbojiang kdebug_secasindex_mode(u_int mode)
662*22ce4affSfengbojiang {
663*22ce4affSfengbojiang
664*22ce4affSfengbojiang switch (mode) {
665*22ce4affSfengbojiang case IPSEC_MODE_ANY:
666*22ce4affSfengbojiang return ("any");
667*22ce4affSfengbojiang case IPSEC_MODE_TRANSPORT:
668*22ce4affSfengbojiang return ("transport");
669*22ce4affSfengbojiang case IPSEC_MODE_TUNNEL:
670*22ce4affSfengbojiang return ("tunnel");
671*22ce4affSfengbojiang case IPSEC_MODE_TCPMD5:
672*22ce4affSfengbojiang return ("tcp-md5");
673*22ce4affSfengbojiang }
674*22ce4affSfengbojiang return ("unknown");
675*22ce4affSfengbojiang }
676*22ce4affSfengbojiang
677*22ce4affSfengbojiang const char*
kdebug_secasv_state(u_int state)678*22ce4affSfengbojiang kdebug_secasv_state(u_int state)
679*22ce4affSfengbojiang {
680*22ce4affSfengbojiang
681*22ce4affSfengbojiang switch (state) {
682*22ce4affSfengbojiang case SADB_SASTATE_LARVAL:
683*22ce4affSfengbojiang return ("larval");
684*22ce4affSfengbojiang case SADB_SASTATE_MATURE:
685*22ce4affSfengbojiang return ("mature");
686*22ce4affSfengbojiang case SADB_SASTATE_DYING:
687*22ce4affSfengbojiang return ("dying");
688*22ce4affSfengbojiang case SADB_SASTATE_DEAD:
689*22ce4affSfengbojiang return ("dead");
690*22ce4affSfengbojiang }
691*22ce4affSfengbojiang return ("unknown");
692*22ce4affSfengbojiang }
693*22ce4affSfengbojiang
694*22ce4affSfengbojiang static char*
kdebug_port2str(const struct sockaddr * sa,char * buf,size_t len)695*22ce4affSfengbojiang kdebug_port2str(const struct sockaddr *sa, char *buf, size_t len)
696*22ce4affSfengbojiang {
697*22ce4affSfengbojiang uint16_t port;
698*22ce4affSfengbojiang
699*22ce4affSfengbojiang IPSEC_ASSERT(sa != NULL, ("null sa"));
700*22ce4affSfengbojiang switch (sa->sa_family) {
701*22ce4affSfengbojiang #ifdef INET
702*22ce4affSfengbojiang case AF_INET:
703*22ce4affSfengbojiang port = ntohs(((const struct sockaddr_in *)sa)->sin_port);
704*22ce4affSfengbojiang break;
705*22ce4affSfengbojiang #endif
706*22ce4affSfengbojiang #ifdef INET6
707*22ce4affSfengbojiang case AF_INET6:
708*22ce4affSfengbojiang port = ntohs(((const struct sockaddr_in6 *)sa)->sin6_port);
709*22ce4affSfengbojiang break;
710*22ce4affSfengbojiang #endif
711*22ce4affSfengbojiang default:
712*22ce4affSfengbojiang port = 0;
713*22ce4affSfengbojiang }
714*22ce4affSfengbojiang if (port == 0)
715*22ce4affSfengbojiang return ("*");
716*22ce4affSfengbojiang snprintf(buf, len, "%u", port);
717*22ce4affSfengbojiang return (buf);
718*22ce4affSfengbojiang }
719*22ce4affSfengbojiang
720a9643ea8Slogwang void
kdebug_secpolicy(struct secpolicy * sp)721a9643ea8Slogwang kdebug_secpolicy(struct secpolicy *sp)
722a9643ea8Slogwang {
723*22ce4affSfengbojiang u_int idx;
724a9643ea8Slogwang
725*22ce4affSfengbojiang IPSEC_ASSERT(sp != NULL, ("null sp"));
726*22ce4affSfengbojiang printf("SP { refcnt=%u id=%u priority=%u state=%s policy=%s\n",
727*22ce4affSfengbojiang sp->refcnt, sp->id, sp->priority,
728*22ce4affSfengbojiang kdebug_secpolicy_state(sp->state),
729*22ce4affSfengbojiang kdebug_secpolicy_policy(sp->policy));
730*22ce4affSfengbojiang kdebug_secpolicyindex(&sp->spidx, " ");
731*22ce4affSfengbojiang for (idx = 0; idx < sp->tcount; idx++) {
732*22ce4affSfengbojiang printf(" req[%u]{ level=%s ", idx,
733*22ce4affSfengbojiang kdebug_ipsecrequest_level(sp->req[idx]->level));
734*22ce4affSfengbojiang kdebug_secasindex(&sp->req[idx]->saidx, NULL);
735*22ce4affSfengbojiang printf(" }\n");
736a9643ea8Slogwang }
737a9643ea8Slogwang printf("}\n");
738a9643ea8Slogwang }
739a9643ea8Slogwang
740*22ce4affSfengbojiang void
kdebug_secpolicyindex(struct secpolicyindex * spidx,const char * indent)741*22ce4affSfengbojiang kdebug_secpolicyindex(struct secpolicyindex *spidx, const char *indent)
742*22ce4affSfengbojiang {
743*22ce4affSfengbojiang char buf[IPSEC_ADDRSTRLEN];
744*22ce4affSfengbojiang
745*22ce4affSfengbojiang IPSEC_ASSERT(spidx != NULL, ("null spidx"));
746*22ce4affSfengbojiang if (indent != NULL)
747*22ce4affSfengbojiang printf("%s", indent);
748*22ce4affSfengbojiang printf("spidx { dir=%s ul_proto=",
749*22ce4affSfengbojiang kdebug_secpolicyindex_dir(spidx->dir));
750*22ce4affSfengbojiang if (spidx->ul_proto == IPSEC_ULPROTO_ANY)
751*22ce4affSfengbojiang printf("* ");
752*22ce4affSfengbojiang else
753*22ce4affSfengbojiang printf("%u ", spidx->ul_proto);
754*22ce4affSfengbojiang printf("%s/%u -> ", ipsec_address(&spidx->src, buf, sizeof(buf)),
755*22ce4affSfengbojiang spidx->prefs);
756*22ce4affSfengbojiang printf("%s/%u }\n", ipsec_address(&spidx->dst, buf, sizeof(buf)),
757*22ce4affSfengbojiang spidx->prefd);
758a9643ea8Slogwang }
759a9643ea8Slogwang
760a9643ea8Slogwang void
kdebug_secasindex(const struct secasindex * saidx,const char * indent)761*22ce4affSfengbojiang kdebug_secasindex(const struct secasindex *saidx, const char *indent)
762a9643ea8Slogwang {
763*22ce4affSfengbojiang char buf[IPSEC_ADDRSTRLEN], port[6];
764a9643ea8Slogwang
765*22ce4affSfengbojiang IPSEC_ASSERT(saidx != NULL, ("null saidx"));
766*22ce4affSfengbojiang if (indent != NULL)
767*22ce4affSfengbojiang printf("%s", indent);
768*22ce4affSfengbojiang printf("saidx { mode=%s proto=%u reqid=%u ",
769*22ce4affSfengbojiang kdebug_secasindex_mode(saidx->mode), saidx->proto, saidx->reqid);
770*22ce4affSfengbojiang printf("%s:%s -> ", ipsec_address(&saidx->src, buf, sizeof(buf)),
771*22ce4affSfengbojiang kdebug_port2str(&saidx->src.sa, port, sizeof(port)));
772*22ce4affSfengbojiang printf("%s:%s }\n", ipsec_address(&saidx->dst, buf, sizeof(buf)),
773*22ce4affSfengbojiang kdebug_port2str(&saidx->dst.sa, port, sizeof(port)));
774a9643ea8Slogwang }
775a9643ea8Slogwang
776a9643ea8Slogwang static void
kdebug_sec_lifetime(struct seclifetime * lft,const char * indent)777*22ce4affSfengbojiang kdebug_sec_lifetime(struct seclifetime *lft, const char *indent)
778a9643ea8Slogwang {
779a9643ea8Slogwang
780*22ce4affSfengbojiang IPSEC_ASSERT(lft != NULL, ("null lft"));
781*22ce4affSfengbojiang if (indent != NULL)
782*22ce4affSfengbojiang printf("%s", indent);
783*22ce4affSfengbojiang printf("lifetime { alloc=%u, bytes=%ju addtime=%ju usetime=%ju }\n",
784*22ce4affSfengbojiang lft->allocations, (uintmax_t)lft->bytes, (uintmax_t)lft->addtime,
785*22ce4affSfengbojiang (uintmax_t)lft->usetime);
786a9643ea8Slogwang }
787a9643ea8Slogwang
788a9643ea8Slogwang void
kdebug_secash(struct secashead * sah,const char * indent)789*22ce4affSfengbojiang kdebug_secash(struct secashead *sah, const char *indent)
790a9643ea8Slogwang {
791a9643ea8Slogwang
792*22ce4affSfengbojiang IPSEC_ASSERT(sah != NULL, ("null sah"));
793*22ce4affSfengbojiang if (indent != NULL)
794*22ce4affSfengbojiang printf("%s", indent);
795*22ce4affSfengbojiang printf("SAH { refcnt=%u state=%s\n", sah->refcnt,
796*22ce4affSfengbojiang kdebug_secasv_state(sah->state));
797*22ce4affSfengbojiang if (indent != NULL)
798*22ce4affSfengbojiang printf("%s", indent);
799*22ce4affSfengbojiang kdebug_secasindex(&sah->saidx, indent);
800*22ce4affSfengbojiang if (indent != NULL)
801*22ce4affSfengbojiang printf("%s", indent);
802*22ce4affSfengbojiang printf("}\n");
803a9643ea8Slogwang }
804a9643ea8Slogwang
805*22ce4affSfengbojiang #ifdef IPSEC_DEBUG
806a9643ea8Slogwang static void
kdebug_secreplay(struct secreplay * rpl)807a9643ea8Slogwang kdebug_secreplay(struct secreplay *rpl)
808a9643ea8Slogwang {
809a9643ea8Slogwang int len, l;
810a9643ea8Slogwang
811*22ce4affSfengbojiang IPSEC_ASSERT(rpl != NULL, ("null rpl"));
812*22ce4affSfengbojiang printf(" secreplay{ count=%lu bitmap_size=%u wsize=%u last=%lu",
813*22ce4affSfengbojiang rpl->count, rpl->bitmap_size, rpl->wsize, rpl->last);
814a9643ea8Slogwang
815a9643ea8Slogwang if (rpl->bitmap == NULL) {
816a9643ea8Slogwang printf(" }\n");
817a9643ea8Slogwang return;
818a9643ea8Slogwang }
819a9643ea8Slogwang
820a9643ea8Slogwang printf("\n bitmap { ");
821*22ce4affSfengbojiang for (len = 0; len < rpl->bitmap_size*4; len++) {
822a9643ea8Slogwang for (l = 7; l >= 0; l--)
823a9643ea8Slogwang printf("%u", (((rpl->bitmap)[len] >> l) & 1) ? 1 : 0);
824a9643ea8Slogwang }
825a9643ea8Slogwang printf(" }\n");
826*22ce4affSfengbojiang }
827*22ce4affSfengbojiang #endif /* IPSEC_DEBUG */
828a9643ea8Slogwang
829*22ce4affSfengbojiang static void
kdebug_secnatt(struct secnatt * natt)830*22ce4affSfengbojiang kdebug_secnatt(struct secnatt *natt)
831*22ce4affSfengbojiang {
832*22ce4affSfengbojiang char buf[IPSEC_ADDRSTRLEN];
833*22ce4affSfengbojiang
834*22ce4affSfengbojiang IPSEC_ASSERT(natt != NULL, ("null natt"));
835*22ce4affSfengbojiang printf(" natt{ sport=%u dport=%u ", ntohs(natt->sport),
836*22ce4affSfengbojiang ntohs(natt->dport));
837*22ce4affSfengbojiang if (natt->flags & IPSEC_NATT_F_OAI)
838*22ce4affSfengbojiang printf("oai=%s ", ipsec_address(&natt->oai, buf, sizeof(buf)));
839*22ce4affSfengbojiang if (natt->flags & IPSEC_NATT_F_OAR)
840*22ce4affSfengbojiang printf("oar=%s ", ipsec_address(&natt->oar, buf, sizeof(buf)));
841*22ce4affSfengbojiang printf("}\n");
842*22ce4affSfengbojiang }
843*22ce4affSfengbojiang
844*22ce4affSfengbojiang void
kdebug_secasv(struct secasvar * sav)845*22ce4affSfengbojiang kdebug_secasv(struct secasvar *sav)
846*22ce4affSfengbojiang {
847*22ce4affSfengbojiang struct seclifetime lft_c;
848*22ce4affSfengbojiang
849*22ce4affSfengbojiang IPSEC_ASSERT(sav != NULL, ("null sav"));
850*22ce4affSfengbojiang
851*22ce4affSfengbojiang printf("SA { refcnt=%u spi=%u seq=%u pid=%u flags=0x%x state=%s\n",
852*22ce4affSfengbojiang sav->refcnt, ntohl(sav->spi), sav->seq, (uint32_t)sav->pid,
853*22ce4affSfengbojiang sav->flags, kdebug_secasv_state(sav->state));
854*22ce4affSfengbojiang kdebug_secash(sav->sah, " ");
855*22ce4affSfengbojiang
856*22ce4affSfengbojiang lft_c.addtime = sav->created;
857*22ce4affSfengbojiang lft_c.allocations = (uint32_t)counter_u64_fetch(
858*22ce4affSfengbojiang sav->lft_c_allocations);
859*22ce4affSfengbojiang lft_c.bytes = counter_u64_fetch(sav->lft_c_bytes);
860*22ce4affSfengbojiang lft_c.usetime = sav->firstused;
861*22ce4affSfengbojiang kdebug_sec_lifetime(&lft_c, " c_");
862*22ce4affSfengbojiang if (sav->lft_h != NULL)
863*22ce4affSfengbojiang kdebug_sec_lifetime(sav->lft_h, " h_");
864*22ce4affSfengbojiang if (sav->lft_s != NULL)
865*22ce4affSfengbojiang kdebug_sec_lifetime(sav->lft_s, " s_");
866*22ce4affSfengbojiang
867*22ce4affSfengbojiang if (sav->tdb_authalgxform != NULL)
868*22ce4affSfengbojiang printf(" alg_auth=%s\n", sav->tdb_authalgxform->name);
869*22ce4affSfengbojiang if (sav->key_auth != NULL)
870*22ce4affSfengbojiang KEYDBG(DUMP,
871*22ce4affSfengbojiang kdebug_sadb_key((struct sadb_ext *)sav->key_auth));
872*22ce4affSfengbojiang if (sav->tdb_encalgxform != NULL)
873*22ce4affSfengbojiang printf(" alg_enc=%s\n", sav->tdb_encalgxform->name);
874*22ce4affSfengbojiang if (sav->key_enc != NULL)
875*22ce4affSfengbojiang KEYDBG(DUMP,
876*22ce4affSfengbojiang kdebug_sadb_key((struct sadb_ext *)sav->key_enc));
877*22ce4affSfengbojiang if (sav->natt != NULL)
878*22ce4affSfengbojiang kdebug_secnatt(sav->natt);
879*22ce4affSfengbojiang if (sav->replay != NULL) {
880*22ce4affSfengbojiang KEYDBG(DUMP,
881*22ce4affSfengbojiang SECASVAR_LOCK(sav);
882*22ce4affSfengbojiang kdebug_secreplay(sav->replay);
883*22ce4affSfengbojiang SECASVAR_UNLOCK(sav));
884*22ce4affSfengbojiang }
885*22ce4affSfengbojiang printf("}\n");
886a9643ea8Slogwang }
887a9643ea8Slogwang
888a9643ea8Slogwang void
kdebug_mbufhdr(const struct mbuf * m)889a9643ea8Slogwang kdebug_mbufhdr(const struct mbuf *m)
890a9643ea8Slogwang {
891a9643ea8Slogwang /* sanity check */
892a9643ea8Slogwang if (m == NULL)
893a9643ea8Slogwang return;
894a9643ea8Slogwang
895a9643ea8Slogwang printf("mbuf(%p){ m_next:%p m_nextpkt:%p m_data:%p "
896a9643ea8Slogwang "m_len:%d m_type:0x%02x m_flags:0x%02x }\n",
897a9643ea8Slogwang m, m->m_next, m->m_nextpkt, m->m_data,
898a9643ea8Slogwang m->m_len, m->m_type, m->m_flags);
899a9643ea8Slogwang
900a9643ea8Slogwang if (m->m_flags & M_PKTHDR) {
901a9643ea8Slogwang printf(" m_pkthdr{ len:%d rcvif:%p }\n",
902a9643ea8Slogwang m->m_pkthdr.len, m->m_pkthdr.rcvif);
903a9643ea8Slogwang }
904a9643ea8Slogwang
905a9643ea8Slogwang if (m->m_flags & M_EXT) {
906a9643ea8Slogwang printf(" m_ext{ ext_buf:%p ext_free:%p "
907a9643ea8Slogwang "ext_size:%u ext_cnt:%p }\n",
908a9643ea8Slogwang m->m_ext.ext_buf, m->m_ext.ext_free,
909a9643ea8Slogwang m->m_ext.ext_size, m->m_ext.ext_cnt);
910a9643ea8Slogwang }
911a9643ea8Slogwang
912a9643ea8Slogwang return;
913a9643ea8Slogwang }
914a9643ea8Slogwang
915a9643ea8Slogwang void
kdebug_mbuf(const struct mbuf * m0)916a9643ea8Slogwang kdebug_mbuf(const struct mbuf *m0)
917a9643ea8Slogwang {
918a9643ea8Slogwang const struct mbuf *m = m0;
919a9643ea8Slogwang int i, j;
920a9643ea8Slogwang
921a9643ea8Slogwang for (j = 0; m; m = m->m_next) {
922a9643ea8Slogwang kdebug_mbufhdr(m);
923a9643ea8Slogwang printf(" m_data:\n");
924a9643ea8Slogwang for (i = 0; i < m->m_len; i++) {
925a9643ea8Slogwang if (i && i % 32 == 0)
926a9643ea8Slogwang printf("\n");
927a9643ea8Slogwang if (i % 4 == 0)
928a9643ea8Slogwang printf(" ");
929a9643ea8Slogwang printf("%02x", mtod(m, const u_char *)[i]);
930a9643ea8Slogwang j++;
931a9643ea8Slogwang }
932a9643ea8Slogwang printf("\n");
933a9643ea8Slogwang }
934a9643ea8Slogwang
935a9643ea8Slogwang return;
936a9643ea8Slogwang }
937*22ce4affSfengbojiang
938*22ce4affSfengbojiang /* Return a printable string for the address. */
939*22ce4affSfengbojiang char *
ipsec_address(const union sockaddr_union * sa,char * buf,socklen_t size)940*22ce4affSfengbojiang ipsec_address(const union sockaddr_union* sa, char *buf, socklen_t size)
941*22ce4affSfengbojiang {
942*22ce4affSfengbojiang
943*22ce4affSfengbojiang switch (sa->sa.sa_family) {
944*22ce4affSfengbojiang #ifdef INET
945*22ce4affSfengbojiang case AF_INET:
946*22ce4affSfengbojiang return (inet_ntop(AF_INET, &sa->sin.sin_addr, buf, size));
947*22ce4affSfengbojiang #endif /* INET */
948*22ce4affSfengbojiang #ifdef INET6
949*22ce4affSfengbojiang case AF_INET6:
950*22ce4affSfengbojiang if (IN6_IS_SCOPE_LINKLOCAL(&sa->sin6.sin6_addr)) {
951*22ce4affSfengbojiang snprintf(buf, size, "%s%%%u", inet_ntop(AF_INET6,
952*22ce4affSfengbojiang &sa->sin6.sin6_addr, buf, size),
953*22ce4affSfengbojiang sa->sin6.sin6_scope_id);
954*22ce4affSfengbojiang return (buf);
955*22ce4affSfengbojiang } else
956*22ce4affSfengbojiang return (inet_ntop(AF_INET6, &sa->sin6.sin6_addr,
957*22ce4affSfengbojiang buf, size));
958*22ce4affSfengbojiang #endif /* INET6 */
959*22ce4affSfengbojiang case 0:
960*22ce4affSfengbojiang return ("*");
961*22ce4affSfengbojiang default:
962*22ce4affSfengbojiang return ("(unknown address family)");
963*22ce4affSfengbojiang }
964*22ce4affSfengbojiang }
965*22ce4affSfengbojiang
966*22ce4affSfengbojiang char *
ipsec_sa2str(struct secasvar * sav,char * buf,size_t size)967*22ce4affSfengbojiang ipsec_sa2str(struct secasvar *sav, char *buf, size_t size)
968*22ce4affSfengbojiang {
969*22ce4affSfengbojiang char sbuf[IPSEC_ADDRSTRLEN], dbuf[IPSEC_ADDRSTRLEN];
970*22ce4affSfengbojiang
971*22ce4affSfengbojiang snprintf(buf, size, "SA(SPI=%08lx src=%s dst=%s)",
972*22ce4affSfengbojiang (u_long)ntohl(sav->spi),
973*22ce4affSfengbojiang ipsec_address(&sav->sah->saidx.src, sbuf, sizeof(sbuf)),
974*22ce4affSfengbojiang ipsec_address(&sav->sah->saidx.dst, dbuf, sizeof(dbuf)));
975*22ce4affSfengbojiang return (buf);
976*22ce4affSfengbojiang }
977*22ce4affSfengbojiang
978a9643ea8Slogwang #endif /* _KERNEL */
979a9643ea8Slogwang
980a9643ea8Slogwang void
kdebug_sockaddr(struct sockaddr * addr)981a9643ea8Slogwang kdebug_sockaddr(struct sockaddr *addr)
982a9643ea8Slogwang {
983*22ce4affSfengbojiang char buf[IPSEC_ADDRSTRLEN];
984a9643ea8Slogwang
985a9643ea8Slogwang /* sanity check */
986a9643ea8Slogwang if (addr == NULL)
987a9643ea8Slogwang panic("%s: NULL pointer was passed.\n", __func__);
988a9643ea8Slogwang
989a9643ea8Slogwang switch (addr->sa_family) {
990*22ce4affSfengbojiang #ifdef INET
991*22ce4affSfengbojiang case AF_INET: {
992*22ce4affSfengbojiang struct sockaddr_in *sin;
993*22ce4affSfengbojiang
994*22ce4affSfengbojiang sin = (struct sockaddr_in *)addr;
995*22ce4affSfengbojiang inet_ntop(AF_INET, &sin->sin_addr, buf, sizeof(buf));
996a9643ea8Slogwang break;
997a9643ea8Slogwang }
998*22ce4affSfengbojiang #endif
999*22ce4affSfengbojiang #ifdef INET6
1000*22ce4affSfengbojiang case AF_INET6: {
1001*22ce4affSfengbojiang struct sockaddr_in6 *sin6;
1002a9643ea8Slogwang
1003*22ce4affSfengbojiang sin6 = (struct sockaddr_in6 *)addr;
1004*22ce4affSfengbojiang if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
1005*22ce4affSfengbojiang snprintf(buf, sizeof(buf), "%s%%%u",
1006*22ce4affSfengbojiang inet_ntop(AF_INET6, &sin6->sin6_addr, buf,
1007*22ce4affSfengbojiang sizeof(buf)), sin6->sin6_scope_id);
1008*22ce4affSfengbojiang } else
1009*22ce4affSfengbojiang inet_ntop(AF_INET6, &sin6->sin6_addr, buf,
1010*22ce4affSfengbojiang sizeof(buf));
1011*22ce4affSfengbojiang break;
1012*22ce4affSfengbojiang }
1013*22ce4affSfengbojiang #endif
1014*22ce4affSfengbojiang default:
1015*22ce4affSfengbojiang sprintf(buf, "unknown");
1016*22ce4affSfengbojiang }
1017*22ce4affSfengbojiang printf("sockaddr{ len=%u family=%u addr=%s }\n", addr->sa_len,
1018*22ce4affSfengbojiang addr->sa_family, buf);
1019a9643ea8Slogwang }
1020a9643ea8Slogwang
1021a9643ea8Slogwang void
ipsec_bindump(caddr_t buf,int len)1022a9643ea8Slogwang ipsec_bindump(caddr_t buf, int len)
1023a9643ea8Slogwang {
1024a9643ea8Slogwang int i;
1025a9643ea8Slogwang
1026a9643ea8Slogwang for (i = 0; i < len; i++)
1027a9643ea8Slogwang printf("%c", (unsigned char)buf[i]);
1028a9643ea8Slogwang
1029a9643ea8Slogwang return;
1030a9643ea8Slogwang }
1031a9643ea8Slogwang
1032a9643ea8Slogwang void
ipsec_hexdump(caddr_t buf,int len)1033a9643ea8Slogwang ipsec_hexdump(caddr_t buf, int len)
1034a9643ea8Slogwang {
1035a9643ea8Slogwang int i;
1036a9643ea8Slogwang
1037a9643ea8Slogwang for (i = 0; i < len; i++) {
1038a9643ea8Slogwang if (i != 0 && i % 32 == 0) printf("\n");
1039a9643ea8Slogwang if (i % 4 == 0) printf(" ");
1040a9643ea8Slogwang printf("%02x", (unsigned char)buf[i]);
1041a9643ea8Slogwang }
1042a9643ea8Slogwang #if 0
1043a9643ea8Slogwang if (i % 32 != 0) printf("\n");
1044a9643ea8Slogwang #endif
1045a9643ea8Slogwang
1046a9643ea8Slogwang return;
1047a9643ea8Slogwang }
1048