Annotation of embedaddon/ipsec-tools/src/libipsec/key_debug.c, revision 1.1.1.1
1.1 misho 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>