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