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