xref: /netbsd-src/sys/netipsec/key_debug.c (revision 13ced16cf46e84e8cff78424e9e32be8e710acf1)
1*13ced16cSknakahara /*	$NetBSD: key_debug.c,v 1.25 2022/10/11 09:51:47 knakahara Exp $	*/
2e2c8a664Smaxv /*	$FreeBSD: key_debug.c,v 1.1.4.1 2003/01/24 05:11:36 sam Exp $	*/
374029031Sjonathan /*	$KAME: key_debug.c,v 1.26 2001/06/27 10:46:50 sakane Exp $	*/
474029031Sjonathan 
574029031Sjonathan /*
674029031Sjonathan  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
774029031Sjonathan  * All rights reserved.
874029031Sjonathan  *
974029031Sjonathan  * Redistribution and use in source and binary forms, with or without
1074029031Sjonathan  * modification, are permitted provided that the following conditions
1174029031Sjonathan  * are met:
1274029031Sjonathan  * 1. Redistributions of source code must retain the above copyright
1374029031Sjonathan  *    notice, this list of conditions and the following disclaimer.
1474029031Sjonathan  * 2. Redistributions in binary form must reproduce the above copyright
1574029031Sjonathan  *    notice, this list of conditions and the following disclaimer in the
1674029031Sjonathan  *    documentation and/or other materials provided with the distribution.
1774029031Sjonathan  * 3. Neither the name of the project nor the names of its contributors
1874029031Sjonathan  *    may be used to endorse or promote products derived from this software
1974029031Sjonathan  *    without specific prior written permission.
2074029031Sjonathan  *
2174029031Sjonathan  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
2274029031Sjonathan  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2374029031Sjonathan  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2474029031Sjonathan  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
2574029031Sjonathan  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2674029031Sjonathan  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2774029031Sjonathan  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2874029031Sjonathan  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2974029031Sjonathan  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3074029031Sjonathan  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3174029031Sjonathan  * SUCH DAMAGE.
3274029031Sjonathan  */
3374029031Sjonathan 
3474029031Sjonathan #ifdef _KERNEL
3574029031Sjonathan #include <sys/cdefs.h>
36*13ced16cSknakahara __KERNEL_RCSID(0, "$NetBSD: key_debug.c,v 1.25 2022/10/11 09:51:47 knakahara Exp $");
3774029031Sjonathan #endif
3874029031Sjonathan 
3980d40a78Sozaki-r #if defined(_KERNEL_OPT)
4074029031Sjonathan #include "opt_inet.h"
4180d40a78Sozaki-r #endif
4274029031Sjonathan 
4374029031Sjonathan #include <sys/types.h>
4474029031Sjonathan #include <sys/param.h>
4574029031Sjonathan #ifdef _KERNEL
4674029031Sjonathan #include <sys/systm.h>
4774029031Sjonathan #include <sys/mbuf.h>
4874029031Sjonathan #include <sys/queue.h>
4974029031Sjonathan #endif
5074029031Sjonathan #include <sys/socket.h>
5174029031Sjonathan 
5274029031Sjonathan #include <net/route.h>
5374029031Sjonathan 
54a0f7ae36Sozaki-r #include <netipsec/key.h>
5574029031Sjonathan #include <netipsec/key_var.h>
5674029031Sjonathan #include <netipsec/key_debug.h>
5774029031Sjonathan 
5874029031Sjonathan #include <netinet/in.h>
5974029031Sjonathan #include <netipsec/ipsec.h>
6074029031Sjonathan 
6174029031Sjonathan #ifndef _KERNEL
6274029031Sjonathan #include <ctype.h>
6374029031Sjonathan #include <stdio.h>
6474029031Sjonathan #include <stdlib.h>
65d6d612dcSchristos #include <err.h>
6674029031Sjonathan #endif /* !_KERNEL */
6774029031Sjonathan 
687a1d44a2Sdrochner static void kdebug_sadb_prop(const struct sadb_ext *);
697a1d44a2Sdrochner static void kdebug_sadb_identity(const struct sadb_ext *);
707a1d44a2Sdrochner static void kdebug_sadb_supported(const struct sadb_ext *);
717a1d44a2Sdrochner static void kdebug_sadb_lifetime(const struct sadb_ext *);
727a1d44a2Sdrochner static void kdebug_sadb_sa(const struct sadb_ext *);
737a1d44a2Sdrochner static void kdebug_sadb_address(const struct sadb_ext *);
747a1d44a2Sdrochner static void kdebug_sadb_key(const struct sadb_ext *);
757a1d44a2Sdrochner static void kdebug_sadb_x_sa2(const struct sadb_ext *);
76d6d612dcSchristos static void kdebug_sadb_x_policy(const struct sadb_ext *);
77d6d612dcSchristos 
78d6d612dcSchristos static void kdebug__secpolicyindex(const struct secpolicyindex *);
79d6d612dcSchristos 
80d6d612dcSchristos static void kdebug_hexdump(const char *, const void *, size_t);
81d6d612dcSchristos static void kdebug_sockaddr(const struct sockaddr *);
82d6d612dcSchristos static void kdebug_secasindex(const struct secasindex *);
83d6d612dcSchristos static void kdebug_mbufhdr(const struct mbuf *);
8474029031Sjonathan 
8574029031Sjonathan #ifdef _KERNEL
86d6d612dcSchristos #if 0
87d6d612dcSchristos static void kdebug_secasv(const struct secasvar *);
887a1d44a2Sdrochner static void kdebug_secreplay(const struct secreplay *);
8974029031Sjonathan #endif
90d6d612dcSchristos #endif
9174029031Sjonathan 
9274029031Sjonathan #ifndef _KERNEL
93f59d9812Schristos #define panic(fmt, ...)	err(EXIT_FAILURE, fmt, __VA_ARGS__)
9474029031Sjonathan #endif
9574029031Sjonathan 
9674029031Sjonathan /* NOTE: host byte order */
9774029031Sjonathan /* %%%: about struct sadb_msg */
9874029031Sjonathan void
kdebug_sadb(const struct sadb_msg * base)997a1d44a2Sdrochner kdebug_sadb(const struct sadb_msg *base)
10074029031Sjonathan {
1017a1d44a2Sdrochner 	const struct sadb_ext *ext;
10274029031Sjonathan 	int tlen, extlen;
10374029031Sjonathan 
10474029031Sjonathan 	/* sanity check */
10574029031Sjonathan 	if (base == NULL)
106d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
10774029031Sjonathan 
108d6d612dcSchristos 	printf("sadb { version=%u type=%u errno=%u satype=%u",
10974029031Sjonathan 	    base->sadb_msg_version, base->sadb_msg_type,
11074029031Sjonathan 	    base->sadb_msg_errno, base->sadb_msg_satype);
111d6d612dcSchristos 	printf(" len=%u reserved=%u seq=%u pid=%u",
11274029031Sjonathan 	    base->sadb_msg_len, base->sadb_msg_reserved,
11374029031Sjonathan 	    base->sadb_msg_seq, base->sadb_msg_pid);
11474029031Sjonathan 
11574029031Sjonathan 	tlen = PFKEY_UNUNIT64(base->sadb_msg_len) - sizeof(struct sadb_msg);
116d6d612dcSchristos 	ext = (const void *)(base + 1);
11774029031Sjonathan 
11874029031Sjonathan 	while (tlen > 0) {
119d6d612dcSchristos 		if (ext->sadb_ext_len == 0 || ext->sadb_ext_len > tlen) {
120d6d612dcSchristos 			panic("%s: invalid ext_len=%d tlen=%d was passed",
121d6d612dcSchristos 			    __func__, ext->sadb_ext_len, tlen);
122d6d612dcSchristos 		}
123d6d612dcSchristos 
124d6d612dcSchristos 		printf(" sadb_ext { len=%u type=%u }",
1252ea60f03Sozaki-r 		    PFKEY_UNUNIT64(ext->sadb_ext_len), ext->sadb_ext_type);
12674029031Sjonathan 
12774029031Sjonathan 
12874029031Sjonathan 		switch (ext->sadb_ext_type) {
12974029031Sjonathan 		case SADB_EXT_SA:
13074029031Sjonathan 			kdebug_sadb_sa(ext);
13174029031Sjonathan 			break;
13274029031Sjonathan 		case SADB_EXT_LIFETIME_CURRENT:
13374029031Sjonathan 		case SADB_EXT_LIFETIME_HARD:
13474029031Sjonathan 		case SADB_EXT_LIFETIME_SOFT:
13574029031Sjonathan 			kdebug_sadb_lifetime(ext);
13674029031Sjonathan 			break;
13774029031Sjonathan 		case SADB_EXT_ADDRESS_SRC:
13874029031Sjonathan 		case SADB_EXT_ADDRESS_DST:
13974029031Sjonathan 		case SADB_EXT_ADDRESS_PROXY:
14074029031Sjonathan 			kdebug_sadb_address(ext);
14174029031Sjonathan 			break;
14274029031Sjonathan 		case SADB_EXT_KEY_AUTH:
14374029031Sjonathan 		case SADB_EXT_KEY_ENCRYPT:
14474029031Sjonathan 			kdebug_sadb_key(ext);
14574029031Sjonathan 			break;
14674029031Sjonathan 		case SADB_EXT_IDENTITY_SRC:
14774029031Sjonathan 		case SADB_EXT_IDENTITY_DST:
14874029031Sjonathan 			kdebug_sadb_identity(ext);
14974029031Sjonathan 			break;
15074029031Sjonathan 		case SADB_EXT_SENSITIVITY:
15174029031Sjonathan 			break;
15274029031Sjonathan 		case SADB_EXT_PROPOSAL:
15374029031Sjonathan 			kdebug_sadb_prop(ext);
15474029031Sjonathan 			break;
15574029031Sjonathan 		case SADB_EXT_SUPPORTED_AUTH:
15674029031Sjonathan 		case SADB_EXT_SUPPORTED_ENCRYPT:
15774029031Sjonathan 			kdebug_sadb_supported(ext);
15874029031Sjonathan 			break;
15974029031Sjonathan 		case SADB_EXT_SPIRANGE:
16074029031Sjonathan 		case SADB_X_EXT_KMPRIVATE:
16174029031Sjonathan 			break;
16274029031Sjonathan 		case SADB_X_EXT_POLICY:
16374029031Sjonathan 			kdebug_sadb_x_policy(ext);
16474029031Sjonathan 			break;
16574029031Sjonathan 		case SADB_X_EXT_SA2:
16674029031Sjonathan 			kdebug_sadb_x_sa2(ext);
16774029031Sjonathan 			break;
16874029031Sjonathan 		default:
169d6d612dcSchristos 			panic("%s: invalid ext_type %u was passed",
170d6d612dcSchristos 			    __func__, ext->sadb_ext_type);
17174029031Sjonathan 		}
17274029031Sjonathan 
17374029031Sjonathan 		extlen = PFKEY_UNUNIT64(ext->sadb_ext_len);
17474029031Sjonathan 		tlen -= extlen;
175d6d612dcSchristos 		ext = (const void *)((const char *)ext + extlen);
17674029031Sjonathan 	}
177d6d612dcSchristos 	printf("\n");
17874029031Sjonathan }
17974029031Sjonathan 
18074029031Sjonathan static void
kdebug_sadb_prop(const struct sadb_ext * ext)1817a1d44a2Sdrochner kdebug_sadb_prop(const struct sadb_ext *ext)
18274029031Sjonathan {
1837a1d44a2Sdrochner 	const struct sadb_prop *prop = (const struct sadb_prop *)ext;
1847a1d44a2Sdrochner 	const struct sadb_comb *comb;
18574029031Sjonathan 	int len;
18674029031Sjonathan 
18774029031Sjonathan 	/* sanity check */
18874029031Sjonathan 	if (ext == NULL)
189d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
19074029031Sjonathan 
19174029031Sjonathan 	len = (PFKEY_UNUNIT64(prop->sadb_prop_len) - sizeof(*prop))
19274029031Sjonathan 		/ sizeof(*comb);
193d6d612dcSchristos 	comb = (const void *)(prop + 1);
194d6d612dcSchristos 	printf(" sadb_prop { replay=%u", prop->sadb_prop_replay);
19574029031Sjonathan 
19674029031Sjonathan 	while (len--) {
19774029031Sjonathan 		printf(" sadb_comb { auth=%u encrypt=%u"
198d6d612dcSchristos 		    "flags=%#04x reserved=%#08x ",
19974029031Sjonathan 		    comb->sadb_comb_auth, comb->sadb_comb_encrypt,
20074029031Sjonathan 		    comb->sadb_comb_flags, comb->sadb_comb_reserved);
20174029031Sjonathan 
20274029031Sjonathan 		printf(" auth_minbits=%u auth_maxbits=%u"
203d6d612dcSchristos 		    "encrypt_minbits=%u encrypt_maxbits=%u",
20474029031Sjonathan 		    comb->sadb_comb_auth_minbits,
20574029031Sjonathan 		    comb->sadb_comb_auth_maxbits,
20674029031Sjonathan 		    comb->sadb_comb_encrypt_minbits,
20774029031Sjonathan 		    comb->sadb_comb_encrypt_maxbits);
20874029031Sjonathan 
20974029031Sjonathan 		printf(" soft_alloc=%u hard_alloc=%u"
210d6d612dcSchristos 		    "soft_bytes=%lu hard_bytes=%lu",
21174029031Sjonathan 		    comb->sadb_comb_soft_allocations,
21274029031Sjonathan 		    comb->sadb_comb_hard_allocations,
21374029031Sjonathan 		    (unsigned long)comb->sadb_comb_soft_bytes,
21474029031Sjonathan 		    (unsigned long)comb->sadb_comb_hard_bytes);
21574029031Sjonathan 
21674029031Sjonathan 		printf(" soft_alloc=%lu hard_alloc=%lu"
217d6d612dcSchristos 		    "soft_bytes=%lu hard_bytes=%lu }",
21874029031Sjonathan 		    (unsigned long)comb->sadb_comb_soft_addtime,
21974029031Sjonathan 		    (unsigned long)comb->sadb_comb_hard_addtime,
22074029031Sjonathan 		    (unsigned long)comb->sadb_comb_soft_usetime,
22174029031Sjonathan 		    (unsigned long)comb->sadb_comb_hard_usetime);
22274029031Sjonathan 		comb++;
22374029031Sjonathan 	}
224d6d612dcSchristos 	printf(" }");
22574029031Sjonathan 
22674029031Sjonathan 	return;
22774029031Sjonathan }
22874029031Sjonathan 
22974029031Sjonathan static void
kdebug_sadb_identity(const struct sadb_ext * ext)2307a1d44a2Sdrochner kdebug_sadb_identity(const struct sadb_ext *ext)
23174029031Sjonathan {
2327a1d44a2Sdrochner 	const struct sadb_ident *id = (const struct sadb_ident *)ext;
23374029031Sjonathan 	int len;
23474029031Sjonathan 
23574029031Sjonathan 	/* sanity check */
23674029031Sjonathan 	if (ext == NULL)
237d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
23874029031Sjonathan 
23974029031Sjonathan 	len = PFKEY_UNUNIT64(id->sadb_ident_len) - sizeof(*id);
24074029031Sjonathan 	printf(" sadb_ident_%s {",
24174029031Sjonathan 	    id->sadb_ident_exttype == SADB_EXT_IDENTITY_SRC ? "src" : "dst");
24274029031Sjonathan 	switch (id->sadb_ident_type) {
24374029031Sjonathan 	default:
24474029031Sjonathan 		printf(" type=%d id=%lu",
24574029031Sjonathan 		    id->sadb_ident_type, (u_long)id->sadb_ident_id);
24674029031Sjonathan 		if (len) {
247d6d612dcSchristos 			kdebug_hexdump("data", id + 1, len);
24874029031Sjonathan 		}
24974029031Sjonathan 		break;
25074029031Sjonathan 	}
25174029031Sjonathan 
252d6d612dcSchristos 	printf(" }");
25374029031Sjonathan }
25474029031Sjonathan 
25574029031Sjonathan static void
kdebug_sadb_supported(const struct sadb_ext * ext)2567a1d44a2Sdrochner kdebug_sadb_supported(const struct sadb_ext *ext)
25774029031Sjonathan {
2587a1d44a2Sdrochner 	const struct sadb_supported *sup = (const struct sadb_supported *)ext;
2597a1d44a2Sdrochner 	const struct sadb_alg *alg;
26074029031Sjonathan 	int len;
26174029031Sjonathan 
26274029031Sjonathan 	/* sanity check */
26374029031Sjonathan 	if (ext == NULL)
264d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
26574029031Sjonathan 
26674029031Sjonathan 	len = (PFKEY_UNUNIT64(sup->sadb_supported_len) - sizeof(*sup))
26774029031Sjonathan 		/ sizeof(*alg);
268d6d612dcSchristos 	alg = (const void *)(sup + 1);
269d6d612dcSchristos 	printf(" sadb_sup {");
27074029031Sjonathan 	while (len--) {
271d6d612dcSchristos 		printf(" { id=%d ivlen=%d min=%d max=%d }",
27274029031Sjonathan 		    alg->sadb_alg_id, alg->sadb_alg_ivlen,
27374029031Sjonathan 		    alg->sadb_alg_minbits, alg->sadb_alg_maxbits);
27474029031Sjonathan 		alg++;
27574029031Sjonathan 	}
276d6d612dcSchristos 	printf(" }");
27774029031Sjonathan }
27874029031Sjonathan 
27974029031Sjonathan static void
kdebug_sadb_lifetime(const struct sadb_ext * ext)2807a1d44a2Sdrochner kdebug_sadb_lifetime(const struct sadb_ext *ext)
28174029031Sjonathan {
2827a1d44a2Sdrochner 	const struct sadb_lifetime *lft = (const struct sadb_lifetime *)ext;
28374029031Sjonathan 
28474029031Sjonathan 	/* sanity check */
28574029031Sjonathan 	if (ext == NULL)
286d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
28774029031Sjonathan 
288d6d612dcSchristos 	printf(" sadb_lifetime { alloc=%u, bytes=%u",
28974029031Sjonathan 	    lft->sadb_lifetime_allocations,
29074029031Sjonathan 	    (u_int32_t)lft->sadb_lifetime_bytes);
291d6d612dcSchristos 	printf(" addtime=%u, usetime=%u }",
29274029031Sjonathan 	    (u_int32_t)lft->sadb_lifetime_addtime,
29374029031Sjonathan 	    (u_int32_t)lft->sadb_lifetime_usetime);
29474029031Sjonathan }
29574029031Sjonathan 
29674029031Sjonathan static void
kdebug_sadb_sa(const struct sadb_ext * ext)2977a1d44a2Sdrochner kdebug_sadb_sa(const struct sadb_ext *ext)
29874029031Sjonathan {
2997a1d44a2Sdrochner 	const struct sadb_sa *sa = (const struct sadb_sa *)ext;
30074029031Sjonathan 
30174029031Sjonathan 	/* sanity check */
30274029031Sjonathan 	if (ext == NULL)
303d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
30474029031Sjonathan 
305d6d612dcSchristos 	printf(" sadb_sa { spi=%u replay=%u state=%u",
30674029031Sjonathan 	    (u_int32_t)ntohl(sa->sadb_sa_spi), sa->sadb_sa_replay,
30774029031Sjonathan 	    sa->sadb_sa_state);
308d6d612dcSchristos 	printf(" auth=%u encrypt=%u flags=%#08x }",
30974029031Sjonathan 	    sa->sadb_sa_auth, sa->sadb_sa_encrypt, sa->sadb_sa_flags);
31074029031Sjonathan }
31174029031Sjonathan 
31274029031Sjonathan static void
kdebug_sadb_address(const struct sadb_ext * ext)3137a1d44a2Sdrochner kdebug_sadb_address(const struct sadb_ext *ext)
31474029031Sjonathan {
3157a1d44a2Sdrochner 	const struct sadb_address *addr = (const struct sadb_address *)ext;
31674029031Sjonathan 
31774029031Sjonathan 	/* sanity check */
31874029031Sjonathan 	if (ext == NULL)
319d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
32074029031Sjonathan 
321d6d612dcSchristos 	printf(" sadb_address { proto=%u prefixlen=%u reserved=%#02x%02x }",
32274029031Sjonathan 	    addr->sadb_address_proto, addr->sadb_address_prefixlen,
3237a1d44a2Sdrochner 	    ((const u_char *)&addr->sadb_address_reserved)[0],
3247a1d44a2Sdrochner 	    ((const u_char *)&addr->sadb_address_reserved)[1]);
32574029031Sjonathan 
326d6d612dcSchristos 	kdebug_sockaddr((const struct sockaddr *)
327d6d612dcSchristos 	    ((const char *)ext + sizeof(*addr)));
32874029031Sjonathan }
32974029031Sjonathan 
33074029031Sjonathan static void
kdebug_sadb_key(const struct sadb_ext * ext)3317a1d44a2Sdrochner kdebug_sadb_key(const struct sadb_ext *ext)
33274029031Sjonathan {
3337a1d44a2Sdrochner 	const struct sadb_key *key = (const struct sadb_key *)ext;
33474029031Sjonathan 
33574029031Sjonathan 	/* sanity check */
33674029031Sjonathan 	if (ext == NULL)
337d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
33874029031Sjonathan 
33974029031Sjonathan 	/* sanity check 2 */
34074029031Sjonathan 	if ((key->sadb_key_bits >> 3) >
34174029031Sjonathan 	    (PFKEY_UNUNIT64(key->sadb_key_len) - sizeof(struct sadb_key))) {
342d6d612dcSchristos 		panic("%s: key length mismatch, bit:%d len:%ld ", __func__,
34374029031Sjonathan 		    key->sadb_key_bits >> 3,
344d6d612dcSchristos 		    (long)PFKEY_UNUNIT64(key->sadb_key_len)
345d6d612dcSchristos 		    - sizeof(struct sadb_key));
34674029031Sjonathan 	}
34774029031Sjonathan 
348d6d612dcSchristos 	printf(" sadb_key { bits=%u reserved=%u",
349d6d612dcSchristos 	    key->sadb_key_bits, key->sadb_key_reserved);
350d6d612dcSchristos 	kdebug_hexdump("key", key + 1, key->sadb_key_bits >> 3);
351d6d612dcSchristos 	printf(" }");
35274029031Sjonathan }
35374029031Sjonathan 
35474029031Sjonathan static void
kdebug_sadb_x_sa2(const struct sadb_ext * ext)3557a1d44a2Sdrochner kdebug_sadb_x_sa2(const struct sadb_ext *ext)
35674029031Sjonathan {
3577a1d44a2Sdrochner 	const struct sadb_x_sa2 *sa2 = (const struct sadb_x_sa2 *)ext;
35874029031Sjonathan 
35974029031Sjonathan 	/* sanity check */
36074029031Sjonathan 	if (ext == NULL)
361d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
36274029031Sjonathan 
363d6d612dcSchristos 	printf(" sadb_x_sa2 { mode=%u reqid=%u",
36474029031Sjonathan 	    sa2->sadb_x_sa2_mode, sa2->sadb_x_sa2_reqid);
365d6d612dcSchristos 	printf(" reserved1=%u reserved2=%u sequence=%u }",
36674029031Sjonathan 	    sa2->sadb_x_sa2_reserved1, sa2->sadb_x_sa2_reserved2,
36774029031Sjonathan 	    sa2->sadb_x_sa2_sequence);
36874029031Sjonathan }
36974029031Sjonathan 
370d6d612dcSchristos static void
kdebug_sadb_x_policy(const struct sadb_ext * ext)3717a1d44a2Sdrochner kdebug_sadb_x_policy(const struct sadb_ext *ext)
37274029031Sjonathan {
3737a1d44a2Sdrochner 	const struct sadb_x_policy *xpl = (const struct sadb_x_policy *)ext;
3747a1d44a2Sdrochner 	const struct sockaddr *addr;
37574029031Sjonathan 
37674029031Sjonathan 	/* sanity check */
37774029031Sjonathan 	if (ext == NULL)
378d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
37974029031Sjonathan 
380*13ced16cSknakahara 	printf(" sadb_x_policy { type=%u dir=%u flags=0x%02x id=%x }",
38174029031Sjonathan 		xpl->sadb_x_policy_type, xpl->sadb_x_policy_dir,
382*13ced16cSknakahara 		xpl->sadb_x_policy_flags, xpl->sadb_x_policy_id);
38374029031Sjonathan 
38474029031Sjonathan 	if (xpl->sadb_x_policy_type == IPSEC_POLICY_IPSEC) {
38574029031Sjonathan 		int tlen;
3867a1d44a2Sdrochner 		const struct sadb_x_ipsecrequest *xisr;
38774029031Sjonathan 
38874029031Sjonathan 		tlen = PFKEY_UNUNIT64(xpl->sadb_x_policy_len) - sizeof(*xpl);
3897a1d44a2Sdrochner 		xisr = (const struct sadb_x_ipsecrequest *)(xpl + 1);
39074029031Sjonathan 
39174029031Sjonathan 		while (tlen > 0) {
392d6d612dcSchristos 			printf(" { len=%u proto=%u mode=%u level=%u reqid=%u",
39374029031Sjonathan 			    xisr->sadb_x_ipsecrequest_len,
39474029031Sjonathan 			    xisr->sadb_x_ipsecrequest_proto,
39574029031Sjonathan 			    xisr->sadb_x_ipsecrequest_mode,
39674029031Sjonathan 			    xisr->sadb_x_ipsecrequest_level,
39774029031Sjonathan 			    xisr->sadb_x_ipsecrequest_reqid);
39874029031Sjonathan 
39974029031Sjonathan 			if (xisr->sadb_x_ipsecrequest_len > sizeof(*xisr)) {
400d6d612dcSchristos 				addr = (const void *)(xisr + 1);
40174029031Sjonathan 				kdebug_sockaddr(addr);
402d6d612dcSchristos 				addr = (const void *)((const char *)addr
40374029031Sjonathan 				    + addr->sa_len);
40474029031Sjonathan 				kdebug_sockaddr(addr);
40574029031Sjonathan 			}
40674029031Sjonathan 
407d6d612dcSchristos 			printf(" }");
40874029031Sjonathan 
40974029031Sjonathan 			/* prevent infinite loop */
41074029031Sjonathan 			if (xisr->sadb_x_ipsecrequest_len <= 0) {
411d6d612dcSchristos 				panic("%s: wrong policy struct", __func__);
41274029031Sjonathan 			}
41374029031Sjonathan 			/* prevent overflow */
41474029031Sjonathan 			if (xisr->sadb_x_ipsecrequest_len > tlen) {
415d6d612dcSchristos 				panic("%s: invalid ipsec policy length",
416d6d612dcSchristos 				    __func__);
41774029031Sjonathan 			}
41874029031Sjonathan 
41974029031Sjonathan 			tlen -= xisr->sadb_x_ipsecrequest_len;
42074029031Sjonathan 
421d6d612dcSchristos 			xisr = (const struct sadb_x_ipsecrequest *)
422d6d612dcSchristos 			    ((const char *)xisr
42374029031Sjonathan 			    + xisr->sadb_x_ipsecrequest_len);
42474029031Sjonathan 		}
42574029031Sjonathan 
42674029031Sjonathan 		if (tlen != 0)
427d6d612dcSchristos 			panic("%s: wrong policy struct", __func__);
42874029031Sjonathan 	}
42974029031Sjonathan }
43074029031Sjonathan 
43174029031Sjonathan #ifdef _KERNEL
432d6d612dcSchristos 
433d6d612dcSchristos void
kdebug_sadb_xpolicy(const char * msg,const struct sadb_ext * ext)434d6d612dcSchristos kdebug_sadb_xpolicy(const char *msg, const struct sadb_ext *ext)
435d6d612dcSchristos {
436d6d612dcSchristos 	printf("%s:", msg);
437d6d612dcSchristos 	kdebug_sadb_x_policy(ext);
438d6d612dcSchristos 	printf("\n");
439d6d612dcSchristos }
440d6d612dcSchristos 
44174029031Sjonathan /* %%%: about SPD and SAD */
44274029031Sjonathan void
kdebug_secpolicy(const struct secpolicy * sp)4437a1d44a2Sdrochner kdebug_secpolicy(const struct secpolicy *sp)
44474029031Sjonathan {
44574029031Sjonathan 	/* sanity check */
44674029031Sjonathan 	if (sp == NULL)
447d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
44874029031Sjonathan 
449d6d612dcSchristos 	printf(" secpolicy { refcnt=%u state=%u policy=%u",
450a0f7ae36Sozaki-r 	    key_sp_refcnt(sp), sp->state, sp->policy);
45174029031Sjonathan 
452d6d612dcSchristos 	kdebug__secpolicyindex(&sp->spidx);
45374029031Sjonathan 
454d6d612dcSchristos 	printf(" type=");
45574029031Sjonathan 	switch (sp->policy) {
45674029031Sjonathan 	case IPSEC_POLICY_DISCARD:
457d6d612dcSchristos 		printf("discard");
45874029031Sjonathan 		break;
45974029031Sjonathan 	case IPSEC_POLICY_NONE:
460d6d612dcSchristos 		printf("none");
46174029031Sjonathan 		break;
46274029031Sjonathan 	case IPSEC_POLICY_IPSEC:
46374029031Sjonathan 	    {
464d6d612dcSchristos 		printf("ipsec {");
46574029031Sjonathan 		struct ipsecrequest *isr;
46674029031Sjonathan 		for (isr = sp->req; isr != NULL; isr = isr->next) {
467d6d612dcSchristos 			printf(" level=%u", isr->level);
46874029031Sjonathan 			kdebug_secasindex(&isr->saidx);
46974029031Sjonathan 		}
470d6d612dcSchristos 		printf(" }");
47174029031Sjonathan 	    }
47274029031Sjonathan 		break;
47374029031Sjonathan 	case IPSEC_POLICY_BYPASS:
474d6d612dcSchristos 		printf("bypass");
47574029031Sjonathan 		break;
47674029031Sjonathan 	case IPSEC_POLICY_ENTRUST:
477d6d612dcSchristos 		printf("entrust");
47874029031Sjonathan 		break;
47974029031Sjonathan 	default:
480d6d612dcSchristos 		panic("%s: Invalid policy found. %d", __func__, sp->policy);
48174029031Sjonathan 	}
482d6d612dcSchristos 	printf(" }\n");
48374029031Sjonathan }
48474029031Sjonathan 
48574029031Sjonathan void
kdebug_secpolicyindex(const char * msg,const struct secpolicyindex * spidx)486d6d612dcSchristos kdebug_secpolicyindex(const char *msg, const struct secpolicyindex *spidx)
487d6d612dcSchristos {
488d6d612dcSchristos 	printf("%s:", msg);
489d6d612dcSchristos 	kdebug__secpolicyindex(spidx);
490d6d612dcSchristos 	printf("\n");
491d6d612dcSchristos }
492d6d612dcSchristos 
493d6d612dcSchristos 
494d6d612dcSchristos static void
kdebug__secpolicyindex(const struct secpolicyindex * spidx)495d6d612dcSchristos kdebug__secpolicyindex(const struct secpolicyindex *spidx)
49674029031Sjonathan {
49774029031Sjonathan 	/* sanity check */
49874029031Sjonathan 	if (spidx == NULL)
499d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
50074029031Sjonathan 
501d6d612dcSchristos 	printf(" secpolicy { dir=%u prefs=%u prefd=%u ul_proto=%u",
50274029031Sjonathan 		spidx->dir, spidx->prefs, spidx->prefd, spidx->ul_proto);
50374029031Sjonathan 
504d6d612dcSchristos 	kdebug_hexdump("src", &spidx->src, spidx->src.sa.sa_len);
505d6d612dcSchristos 	kdebug_hexdump("dst", &spidx->dst, spidx->dst.sa.sa_len);
506d6d612dcSchristos 	printf(" }");
50774029031Sjonathan }
50874029031Sjonathan 
509d6d612dcSchristos static void
kdebug_secasindex(const struct secasindex * saidx)5107a1d44a2Sdrochner kdebug_secasindex(const struct secasindex *saidx)
51174029031Sjonathan {
51274029031Sjonathan 	/* sanity check */
51374029031Sjonathan 	if (saidx == NULL)
514d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
51574029031Sjonathan 
516d6d612dcSchristos 	printf(" secasindex { mode=%u proto=%u",
51774029031Sjonathan 	    saidx->mode, saidx->proto);
518d6d612dcSchristos 	kdebug_hexdump("src", &saidx->src, saidx->src.sa.sa_len);
519d6d612dcSchristos 	kdebug_hexdump("dst", &saidx->dst, saidx->dst.sa.sa_len);
520d6d612dcSchristos 	printf(" }");
52174029031Sjonathan }
52274029031Sjonathan 
523d6d612dcSchristos #if 0
524d6d612dcSchristos static void
5257a1d44a2Sdrochner kdebug_secasv(const struct secasvar *sav)
52674029031Sjonathan {
52774029031Sjonathan 	/* sanity check */
52874029031Sjonathan 	if (sav == NULL)
529d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
53074029031Sjonathan 
531d6d612dcSchristos 	printf(" secasv {", );
53274029031Sjonathan 	kdebug_secasindex(&sav->sah->saidx);
53374029031Sjonathan 
534d6d612dcSchristos 	printf(" refcnt=%u state=%u auth=%u enc=%u",
5351e13a4d5Sozaki-r 	    key_sa_refcnt(sav), sav->state, sav->alg_auth, sav->alg_enc);
536d6d612dcSchristos 	printf(" spi=%u flags=%u",
53774029031Sjonathan 	    (u_int32_t)ntohl(sav->spi), sav->flags);
53874029031Sjonathan 
53974029031Sjonathan 	if (sav->key_auth != NULL)
54074029031Sjonathan 		kdebug_sadb_key((struct sadb_ext *)sav->key_auth);
54174029031Sjonathan 	if (sav->key_enc != NULL)
54274029031Sjonathan 		kdebug_sadb_key((struct sadb_ext *)sav->key_enc);
54374029031Sjonathan 
54474029031Sjonathan 	if (sav->replay != NULL)
54574029031Sjonathan 		kdebug_secreplay(sav->replay);
54674029031Sjonathan 	if (sav->lft_c != NULL)
54774029031Sjonathan 		kdebug_sadb_lifetime((struct sadb_ext *)sav->lft_c);
54874029031Sjonathan 	if (sav->lft_h != NULL)
54974029031Sjonathan 		kdebug_sadb_lifetime((struct sadb_ext *)sav->lft_h);
55074029031Sjonathan 	if (sav->lft_s != NULL)
55174029031Sjonathan 		kdebug_sadb_lifetime((struct sadb_ext *)sav->lft_s);
55274029031Sjonathan 
55374029031Sjonathan 	/* XXX: misc[123] ? */
55474029031Sjonathan }
55574029031Sjonathan 
55674029031Sjonathan static void
5577a1d44a2Sdrochner kdebug_secreplay(const struct secreplay *rpl)
55874029031Sjonathan {
55974029031Sjonathan 	int len, l;
56074029031Sjonathan 
56174029031Sjonathan 	/* sanity check */
56274029031Sjonathan 	if (rpl == NULL)
563d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
56474029031Sjonathan 
56574029031Sjonathan 	printf(" secreplay { count=%u wsize=%u seq=%u lastseq=%u",
56674029031Sjonathan 	    rpl->count, rpl->wsize, rpl->seq, rpl->lastseq);
56774029031Sjonathan 
56874029031Sjonathan 	if (rpl->bitmap == NULL) {
569d6d612dcSchristos 		printf(" }");
57074029031Sjonathan 		return;
57174029031Sjonathan 	}
57274029031Sjonathan 
573d6d612dcSchristos 	printf(" bitmap {");
57474029031Sjonathan 
57574029031Sjonathan 	for (len = 0; len < rpl->wsize; len++) {
57674029031Sjonathan 		for (l = 7; l >= 0; l--)
57774029031Sjonathan 			printf(" %u", (((rpl->bitmap)[len] >> l) & 1) ? 1 : 0);
57874029031Sjonathan 	}
579d6d612dcSchristos 	printf(" } }");
58074029031Sjonathan }
581d6d612dcSchristos #endif
58274029031Sjonathan 
583d6d612dcSchristos static void
kdebug_mbufhdr(const struct mbuf * m)5847a1d44a2Sdrochner kdebug_mbufhdr(const struct mbuf *m)
58574029031Sjonathan {
58674029031Sjonathan 	/* sanity check */
58774029031Sjonathan 	if (m == NULL)
58874029031Sjonathan 		return;
58974029031Sjonathan 
59074029031Sjonathan 	printf(" mbuf(%p) { m_next:%p m_nextpkt:%p m_data:%p "
591d6d612dcSchristos 	       "m_len:%d m_type:%#02x m_flags:%#02x }",
59274029031Sjonathan 		m, m->m_next, m->m_nextpkt, m->m_data,
59374029031Sjonathan 		m->m_len, m->m_type, m->m_flags);
59474029031Sjonathan 
59574029031Sjonathan 	if (m->m_flags & M_PKTHDR) {
596d6d612dcSchristos 		printf(" m_pkthdr { len:%d rcvif:%p }",
597fe6d4275Sozaki-r 		    m->m_pkthdr.len, m_get_rcvif_NOMPSAFE(m));
59874029031Sjonathan 	}
59974029031Sjonathan 
60074029031Sjonathan 	if (m->m_flags & M_EXT) {
60174029031Sjonathan 		printf(" m_ext { ext_buf:%p ext_free:%p "
602d6d612dcSchristos 		   "ext_size:%zu ext_refcnt:%u }",
60374029031Sjonathan 		    m->m_ext.ext_buf, m->m_ext.ext_free,
604b4d2d2c2Sozaki-r 		    m->m_ext.ext_size, m->m_ext.ext_refcnt);
60574029031Sjonathan 	}
60674029031Sjonathan }
60774029031Sjonathan 
60874029031Sjonathan void
kdebug_mbuf(const char * msg,const struct mbuf * m0)609d6d612dcSchristos kdebug_mbuf(const char *msg, const struct mbuf *m0)
61074029031Sjonathan {
6117a1d44a2Sdrochner 	const struct mbuf *m = m0;
61274029031Sjonathan 	int i, j;
61374029031Sjonathan 
614d6d612dcSchristos 	printf("%s:", msg);
61574029031Sjonathan 	for (j = 0; m; m = m->m_next) {
61674029031Sjonathan 		kdebug_mbufhdr(m);
617d6d612dcSchristos 		printf(" m_data:");
61874029031Sjonathan 		for (i = 0; i < m->m_len; i++) {
61974029031Sjonathan 			if (i % 4 == 0)
62074029031Sjonathan 				printf(" ");
62174029031Sjonathan 			printf("%02x", mtod(m, u_char *)[i]);
62274029031Sjonathan 			j++;
62374029031Sjonathan 		}
62474029031Sjonathan 	}
625d6d612dcSchristos 	printf("\n");
62674029031Sjonathan }
62774029031Sjonathan #endif /* _KERNEL */
62874029031Sjonathan 
629d6d612dcSchristos static void
kdebug_sockaddr(const struct sockaddr * addr)6307a1d44a2Sdrochner kdebug_sockaddr(const struct sockaddr *addr)
63174029031Sjonathan {
6327a1d44a2Sdrochner 	const struct sockaddr_in *sin4;
63374029031Sjonathan #ifdef INET6
6347a1d44a2Sdrochner 	const struct sockaddr_in6 *sin6;
63574029031Sjonathan #endif
63674029031Sjonathan 
63774029031Sjonathan 	/* sanity check */
63874029031Sjonathan 	if (addr == NULL)
639d6d612dcSchristos 		panic("%s: NULL pointer was passed", __func__);
64074029031Sjonathan 
64174029031Sjonathan 	/* NOTE: We deal with port number as host byte order. */
642d6d612dcSchristos 	printf(" sockaddr { len=%u family=%u",
643d6d612dcSchristos 	    addr->sa_len, addr->sa_family);
64474029031Sjonathan 
64574029031Sjonathan 	switch (addr->sa_family) {
64674029031Sjonathan 	case AF_INET:
6477a1d44a2Sdrochner 		sin4 = (const struct sockaddr_in *)addr;
648d6d612dcSchristos 		printf(" port=%u", ntohs(sin4->sin_port));
649d6d612dcSchristos 		kdebug_hexdump("addr", &sin4->sin_addr, sizeof(sin4->sin_addr));
65074029031Sjonathan 		break;
65174029031Sjonathan #ifdef INET6
65274029031Sjonathan 	case AF_INET6:
6537a1d44a2Sdrochner 		sin6 = (const struct sockaddr_in6 *)addr;
654d6d612dcSchristos 		printf(" port=%u", ntohs(sin6->sin6_port));
655d6d612dcSchristos 		printf(" flowinfo=%#08x, scope_id=%#08x",
65674029031Sjonathan 		    sin6->sin6_flowinfo, sin6->sin6_scope_id);
657d6d612dcSchristos 		kdebug_hexdump("addr", &sin6->sin6_addr, sizeof(sin6->sin6_addr));
65874029031Sjonathan 		break;
65974029031Sjonathan #endif
66074029031Sjonathan 	}
66174029031Sjonathan 
662d6d612dcSchristos 	printf(" }");
66374029031Sjonathan }
66474029031Sjonathan 
665d6d612dcSchristos static void
kdebug_hexdump(const char * tag,const void * v,size_t len)666d6d612dcSchristos kdebug_hexdump(const char *tag, const void *v, size_t len)
66774029031Sjonathan {
668d6d612dcSchristos 	size_t i;
669d6d612dcSchristos 	const unsigned char *buf = v;
67074029031Sjonathan 
671d6d612dcSchristos 	if (len)
672d6d612dcSchristos 		printf(" %s=", tag);
67374029031Sjonathan 
67474029031Sjonathan 	for (i = 0; i < len; i++) {
675d6d612dcSchristos 		if (i && i % 4 == 0) printf(" ");
676d6d612dcSchristos 		printf("%02x", buf[i]);
67774029031Sjonathan 	}
67874029031Sjonathan }
679