xref: /f-stack/freebsd/netipsec/key_debug.c (revision 22ce4aff)
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