File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ipsec-tools / src / libipsec / key_debug.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:39:10 2012 UTC (12 years, 6 months ago) by misho
Branches: ipsec-tools, MAIN
CVS tags: v0_8_2p2, v0_8_1p0, v0_8_1, v0_8_0p0, v0_8_0, HEAD
ipsec-tools

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>