[BACK]Return to ip_ipsp.h CVS log [TXT][DIR] Up to [local] / sys / netinet

Annotation of sys/netinet/ip_ipsp.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: ip_ipsp.h,v 1.135 2006/11/24 13:52:14 reyk Exp $      */
        !             2: /*
        !             3:  * The authors of this code are John Ioannidis (ji@tla.org),
        !             4:  * Angelos D. Keromytis (kermit@csd.uch.gr),
        !             5:  * Niels Provos (provos@physnet.uni-hamburg.de) and
        !             6:  * Niklas Hallqvist (niklas@appli.se).
        !             7:  *
        !             8:  * The original version of this code was written by John Ioannidis
        !             9:  * for BSD/OS in Athens, Greece, in November 1995.
        !            10:  *
        !            11:  * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996,
        !            12:  * by Angelos D. Keromytis.
        !            13:  *
        !            14:  * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis
        !            15:  * and Niels Provos.
        !            16:  *
        !            17:  * Additional features in 1999 by Angelos D. Keromytis and Niklas Hallqvist.
        !            18:  *
        !            19:  * Copyright (c) 1995, 1996, 1997, 1998, 1999 by John Ioannidis,
        !            20:  * Angelos D. Keromytis and Niels Provos.
        !            21:  * Copyright (c) 1999 Niklas Hallqvist.
        !            22:  * Copyright (c) 2001, Angelos D. Keromytis.
        !            23:  *
        !            24:  * Permission to use, copy, and modify this software with or without fee
        !            25:  * is hereby granted, provided that this entire notice is included in
        !            26:  * all copies of any software which is or includes a copy or
        !            27:  * modification of this software.
        !            28:  * You may use this code under the GNU public license if you so wish. Please
        !            29:  * contribute changes back to the authors under this freer than GPL license
        !            30:  * so that we may further the use of strong encryption without limitations to
        !            31:  * all.
        !            32:  *
        !            33:  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
        !            34:  * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
        !            35:  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
        !            36:  * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
        !            37:  * PURPOSE.
        !            38:  */
        !            39:
        !            40: #ifndef _NETINET_IPSP_H_
        !            41: #define _NETINET_IPSP_H_
        !            42:
        !            43: /* IPSP global definitions. */
        !            44:
        !            45: #include <sys/types.h>
        !            46: #include <sys/queue.h>
        !            47: #include <sys/timeout.h>
        !            48: #include <netinet/in.h>
        !            49:
        !            50: union sockaddr_union {
        !            51:        struct sockaddr         sa;
        !            52:        struct sockaddr_in      sin;
        !            53:        struct sockaddr_in6     sin6;
        !            54: };
        !            55:
        !            56: /* HMAC key sizes */
        !            57: #define        MD5HMAC96_KEYSIZE       16
        !            58: #define        SHA1HMAC96_KEYSIZE      20
        !            59: #define        RIPEMD160HMAC96_KEYSIZE 20
        !            60: #define        SHA2_256HMAC96_KEYSIZE  32
        !            61: #define        SHA2_384HMAC96_KEYSIZE  48
        !            62: #define        SHA2_512HMAC96_KEYSIZE  64
        !            63:
        !            64: #define        AH_HMAC_HASHLEN         12      /* 96 bits of authenticator */
        !            65: #define        AH_HMAC_RPLENGTH        4       /* 32 bits of replay counter */
        !            66: #define        AH_HMAC_INITIAL_RPL     1       /* Replay counter initial value */
        !            67:
        !            68: /* Authenticator lengths */
        !            69: #define        AH_MD5_ALEN             16
        !            70: #define        AH_SHA1_ALEN            20
        !            71: #define        AH_RMD160_ALEN          20
        !            72: #define        AH_SHA2_256_ALEN        32
        !            73: #define        AH_SHA2_384_ALEN        48
        !            74: #define        AH_SHA2_512_ALEN        64
        !            75: #define        AH_ALEN_MAX             64      /* Keep updated */
        !            76:
        !            77: /* Reserved SPI numbers */
        !            78: #define        SPI_LOCAL_USE           0
        !            79: #define        SPI_RESERVED_MIN        1
        !            80: #define        SPI_RESERVED_MAX        255
        !            81:
        !            82: /* Reserved CPI numbers */
        !            83: #define CPI_RESERVED_MIN       1
        !            84: #define CPI_RESERVED_MAX       255
        !            85: #define CPI_PRIVATE_MIN                61440
        !            86: #define CPI_PRIVATE_MAX                65535
        !            87:
        !            88: /* sysctl default values */
        !            89: #define        IPSEC_DEFAULT_EMBRYONIC_SA_TIMEOUT      60      /* 1 minute */
        !            90: #define        IPSEC_DEFAULT_PFS                       1
        !            91: #define        IPSEC_DEFAULT_SOFT_ALLOCATIONS          0
        !            92: #define        IPSEC_DEFAULT_EXP_ALLOCATIONS           0
        !            93: #define        IPSEC_DEFAULT_SOFT_BYTES                0
        !            94: #define        IPSEC_DEFAULT_EXP_BYTES                 0
        !            95: #define        IPSEC_DEFAULT_SOFT_TIMEOUT              80000
        !            96: #define        IPSEC_DEFAULT_EXP_TIMEOUT               86400
        !            97: #define        IPSEC_DEFAULT_SOFT_FIRST_USE            3600
        !            98: #define        IPSEC_DEFAULT_EXP_FIRST_USE             7200
        !            99: #define        IPSEC_DEFAULT_DEF_ENC                   "aes"
        !           100: #define        IPSEC_DEFAULT_DEF_AUTH                  "hmac-sha1"
        !           101: #define        IPSEC_DEFAULT_EXPIRE_ACQUIRE            30
        !           102: #define        IPSEC_DEFAULT_DEF_COMP                  "deflate"
        !           103:
        !           104: struct sockaddr_encap {
        !           105:        u_int8_t        sen_len;                /* length */
        !           106:        u_int8_t        sen_family;             /* PF_KEY */
        !           107:        u_int16_t       sen_type;               /* see SENT_* */
        !           108:        union {
        !           109:                struct {                                /* SENT_IP4 */
        !           110:                        u_int8_t        Direction;
        !           111:                        struct in_addr  Src;
        !           112:                        struct in_addr  Dst;
        !           113:                        u_int8_t        Proto;
        !           114:                        u_int16_t       Sport;
        !           115:                        u_int16_t       Dport;
        !           116:                } Sip4;
        !           117:
        !           118:                struct {                                /* SENT_IP6 */
        !           119:                        u_int8_t        Direction;
        !           120:                        struct in6_addr Src;
        !           121:                        struct in6_addr Dst;
        !           122:                        u_int8_t        Proto;
        !           123:                        u_int16_t       Sport;
        !           124:                        u_int16_t       Dport;
        !           125:                } Sip6;
        !           126:
        !           127:                struct ipsec_policy     *PolicyHead;    /* SENT_IPSP */
        !           128:        } Sen;
        !           129: };
        !           130:
        !           131: #define        IPSP_DIRECTION_IN       0x1
        !           132: #define        IPSP_DIRECTION_OUT      0x2
        !           133:
        !           134: #define        sen_data                Sen.Data
        !           135: #define        sen_ip_src              Sen.Sip4.Src
        !           136: #define        sen_ip_dst              Sen.Sip4.Dst
        !           137: #define        sen_proto               Sen.Sip4.Proto
        !           138: #define        sen_sport               Sen.Sip4.Sport
        !           139: #define        sen_dport               Sen.Sip4.Dport
        !           140: #define        sen_direction           Sen.Sip4.Direction
        !           141: #define        sen_ip6_src             Sen.Sip6.Src
        !           142: #define        sen_ip6_dst             Sen.Sip6.Dst
        !           143: #define        sen_ip6_proto           Sen.Sip6.Proto
        !           144: #define        sen_ip6_sport           Sen.Sip6.Sport
        !           145: #define        sen_ip6_dport           Sen.Sip6.Dport
        !           146: #define        sen_ip6_direction       Sen.Sip6.Direction
        !           147: #define        sen_ipsp                Sen.PolicyHead
        !           148:
        !           149: /*
        !           150:  * The "type" is really part of the address as far as the routing
        !           151:  * system is concerned. By using only one bit in the type field
        !           152:  * for each type, we sort-of make sure that different types of
        !           153:  * encapsulation addresses won't be matched against the wrong type.
        !           154:  *
        !           155:  */
        !           156:
        !           157: #define        SENT_IP4        0x0001          /* data is two struct in_addr */
        !           158: #define        SENT_IPSP       0x0002          /* data as in IP4/6 plus SPI */
        !           159: #define        SENT_IP6        0x0004
        !           160:
        !           161: #define        SENT_LEN        sizeof(struct sockaddr_encap)
        !           162:
        !           163: struct ipsec_ref {
        !           164:        u_int16_t       ref_type;       /* Subtype of data */
        !           165:        int16_t         ref_len;        /* Length of data following */
        !           166:        int             ref_count;      /* Reference count */
        !           167:        int             ref_malloctype; /* malloc(9) type, for freeing */
        !           168: };
        !           169:
        !           170: struct ipsec_acquire {
        !           171:        union sockaddr_union            ipa_addr;
        !           172:        u_int32_t                       ipa_seq;
        !           173:        struct sockaddr_encap           ipa_info;
        !           174:        struct sockaddr_encap           ipa_mask;
        !           175:        struct timeout                  ipa_timeout;
        !           176:        struct ipsec_policy             *ipa_policy;
        !           177:        struct inpcb                    *ipa_pcb;
        !           178:        TAILQ_ENTRY(ipsec_acquire)      ipa_ipo_next;
        !           179:        TAILQ_ENTRY(ipsec_acquire)      ipa_next;
        !           180:        TAILQ_ENTRY(ipsec_acquire)      ipa_inp_next;
        !           181: };
        !           182:
        !           183: struct ipsec_policy {
        !           184:        struct sockaddr_encap   ipo_addr;
        !           185:        struct sockaddr_encap   ipo_mask;
        !           186:
        !           187:        union sockaddr_union    ipo_src;        /* Local address to use */
        !           188:        union sockaddr_union    ipo_dst;        /* Remote gateway -- if it's zeroed:
        !           189:                                                 * - on output, we try to
        !           190:                                                 * contact the remote host
        !           191:                                                 * directly (if needed).
        !           192:                                                 * - on input, we accept on if
        !           193:                                                 * the inner source is the
        !           194:                                                 * same as the outer source
        !           195:                                                 * address, or if transport
        !           196:                                                 * mode was used.
        !           197:                                                 */
        !           198:
        !           199:        u_int64_t               ipo_last_searched;      /* Timestamp of last lookup */
        !           200:
        !           201:        u_int8_t                ipo_flags;      /* See IPSP_POLICY_* definitions */
        !           202:        u_int8_t                ipo_type;       /* USE/ACQUIRE/... */
        !           203:        u_int8_t                ipo_sproto;     /* ESP/AH; if zero, use system dflts */
        !           204:
        !           205:        int                     ipo_ref_count;
        !           206:
        !           207:        struct tdb              *ipo_tdb;               /* Cached entry */
        !           208:
        !           209:        struct ipsec_ref        *ipo_srcid;
        !           210:        struct ipsec_ref        *ipo_dstid;
        !           211:        struct ipsec_ref        *ipo_local_cred;
        !           212:        struct ipsec_ref        *ipo_local_auth;
        !           213:
        !           214:        TAILQ_HEAD(ipo_acquires_head, ipsec_acquire) ipo_acquires; /* List of acquires */
        !           215:        TAILQ_ENTRY(ipsec_policy)       ipo_tdb_next;   /* List TDB policies */
        !           216:        TAILQ_ENTRY(ipsec_policy)       ipo_list;       /* List of all policies */
        !           217: };
        !           218:
        !           219: #define        IPSP_POLICY_NONE        0x0000  /* No flags set */
        !           220: #define        IPSP_POLICY_SOCKET      0x0001  /* Socket-attached policy */
        !           221: #define        IPSP_POLICY_STATIC      0x0002  /* Static policy */
        !           222:
        !           223: #define        IPSP_IPSEC_USE          0       /* Use if existing, don't acquire */
        !           224: #define        IPSP_IPSEC_ACQUIRE      1       /* Try acquire, let packet through */
        !           225: #define        IPSP_IPSEC_REQUIRE      2       /* Require SA */
        !           226: #define        IPSP_PERMIT             3       /* Permit traffic through */
        !           227: #define        IPSP_DENY               4       /* Deny traffic */
        !           228: #define        IPSP_IPSEC_DONTACQ      5       /* Require, but don't acquire */
        !           229:
        !           230: /* Notification types */
        !           231: #define        NOTIFY_SOFT_EXPIRE      0       /* Soft expiration of SA */
        !           232: #define        NOTIFY_HARD_EXPIRE      1       /* Hard expiration of SA */
        !           233: #define        NOTIFY_REQUEST_SA       2       /* Establish an SA */
        !           234:
        !           235: #define        NOTIFY_SATYPE_CONF      1       /* SA should do encryption */
        !           236: #define        NOTIFY_SATYPE_AUTH      2       /* SA should do authentication */
        !           237: #define        NOTIFY_SATYPE_TUNNEL    4       /* SA should use tunneling */
        !           238: #define NOTIFY_SATYPE_COMP     5       /* SA (IPCA) should use compression */
        !           239:
        !           240: /* Authentication types */
        !           241: #define        IPSP_AUTH_NONE          0
        !           242: #define        IPSP_AUTH_PASSPHRASE    1
        !           243: #define        IPSP_AUTH_RSA           2
        !           244:
        !           245: /* Credential types */
        !           246: #define        IPSP_CRED_NONE          0
        !           247: #define        IPSP_CRED_KEYNOTE       1
        !           248: #define        IPSP_CRED_X509          2
        !           249:
        !           250: /* Identity types */
        !           251: #define        IPSP_IDENTITY_NONE              0
        !           252: #define        IPSP_IDENTITY_PREFIX            1
        !           253: #define        IPSP_IDENTITY_FQDN              2
        !           254: #define        IPSP_IDENTITY_USERFQDN          3
        !           255: #define        IPSP_IDENTITY_CONNECTION        4
        !           256:
        !           257: /*
        !           258:  * For encapsulation routes are possible not only for the destination
        !           259:  * address but also for the protocol, source and destination ports
        !           260:  * if available
        !           261:  */
        !           262:
        !           263: struct route_enc {
        !           264:        struct rtentry          *re_rt;
        !           265:        struct sockaddr_encap   re_dst;
        !           266: };
        !           267:
        !           268: struct tdb {                           /* tunnel descriptor block */
        !           269:        /*
        !           270:         * Each TDB is on three hash tables: one keyed on dst/spi/sproto,
        !           271:         * one keyed on dst/sproto, and one keyed on src/sproto. The first
        !           272:         * is used for finding a specific TDB, the second for finding TDBs
        !           273:         * for outgoing policy matching, and the third for incoming
        !           274:         * policy matching. The following three fields maintain the hash
        !           275:         * queues in those three tables.
        !           276:         */
        !           277:        struct tdb      *tdb_hnext;     /* dst/spi/sproto table */
        !           278:        struct tdb      *tdb_anext;     /* dst/sproto table */
        !           279:        struct tdb      *tdb_snext;     /* src/sproto table */
        !           280:        struct tdb      *tdb_inext;
        !           281:        struct tdb      *tdb_onext;
        !           282:
        !           283:        struct xformsw          *tdb_xform;             /* Transform to use */
        !           284:        struct enc_xform        *tdb_encalgxform;       /* Enc algorithm */
        !           285:        struct auth_hash        *tdb_authalgxform;      /* Auth algorithm */
        !           286:        struct comp_algo        *tdb_compalgxform;      /* Compression algo */
        !           287:
        !           288: #define        TDBF_UNIQUE             0x00001 /* This should not be used by others */
        !           289: #define        TDBF_TIMER              0x00002 /* Absolute expiration timer in use */
        !           290: #define        TDBF_BYTES              0x00004 /* Check the byte counters */
        !           291: #define        TDBF_ALLOCATIONS        0x00008 /* Check the flows counters */
        !           292: #define        TDBF_INVALID            0x00010 /* This SPI is not valid yet/anymore */
        !           293: #define        TDBF_FIRSTUSE           0x00020 /* Expire after first use */
        !           294: #define        TDBF_HALFIV             0x00040 /* Use half-length IV (ESP old only) */
        !           295: #define        TDBF_SOFT_TIMER         0x00080 /* Soft expiration */
        !           296: #define        TDBF_SOFT_BYTES         0x00100 /* Soft expiration */
        !           297: #define        TDBF_SOFT_ALLOCATIONS   0x00200 /* Soft expiration */
        !           298: #define        TDBF_SOFT_FIRSTUSE      0x00400 /* Soft expiration */
        !           299: #define        TDBF_PFS                0x00800 /* Ask for PFS from Key Mgmt. */
        !           300: #define        TDBF_TUNNELING          0x01000 /* Force IP-IP encapsulation */
        !           301: #define        TDBF_NOREPLAY           0x02000 /* No replay counter present */
        !           302: #define        TDBF_RANDOMPADDING      0x04000 /* Random data in the ESP padding */
        !           303: #define        TDBF_SKIPCRYPTO         0x08000 /* Skip actual crypto processing */
        !           304: #define        TDBF_USEDTUNNEL         0x10000 /* Appended a tunnel header in past */
        !           305: #define        TDBF_UDPENCAP           0x20000 /* UDP encapsulation */
        !           306:
        !           307:        u_int32_t       tdb_flags;      /* Flags related to this TDB */
        !           308:
        !           309:        struct timeout  tdb_timer_tmo;
        !           310:        struct timeout  tdb_first_tmo;
        !           311:        struct timeout  tdb_stimer_tmo;
        !           312:        struct timeout  tdb_sfirst_tmo;
        !           313:
        !           314:        u_int32_t       tdb_seq;                /* Tracking number for PFKEY */
        !           315:        u_int32_t       tdb_exp_allocations;    /* Expire after so many flows */
        !           316:        u_int32_t       tdb_soft_allocations;   /* Expiration warning */
        !           317:        u_int32_t       tdb_cur_allocations;    /* Total number of allocs */
        !           318:
        !           319:        u_int64_t       tdb_exp_bytes;  /* Expire after so many bytes passed */
        !           320:        u_int64_t       tdb_soft_bytes; /* Expiration warning */
        !           321:        u_int64_t       tdb_cur_bytes;  /* Current count of bytes */
        !           322:
        !           323:        u_int64_t       tdb_exp_timeout;        /* When does the SPI expire */
        !           324:        u_int64_t       tdb_soft_timeout;       /* Send soft-expire warning */
        !           325:        u_int64_t       tdb_established;        /* When was SPI established */
        !           326:
        !           327:        u_int64_t       tdb_first_use;          /* When was it first used */
        !           328:        u_int64_t       tdb_soft_first_use;     /* Soft warning */
        !           329:        u_int64_t       tdb_exp_first_use;      /* Expire if tdb_first_use +
        !           330:                                                 * tdb_exp_first_use <= curtime
        !           331:                                                 */
        !           332:
        !           333:        u_int64_t       tdb_last_used;  /* When was this SA last used */
        !           334:        u_int64_t       tdb_last_marked;/* Last SKIPCRYPTO status change */
        !           335:
        !           336:        u_int64_t       tdb_cryptoid;   /* Crypto session ID */
        !           337:
        !           338:        u_int32_t       tdb_spi;        /* SPI */
        !           339:        u_int16_t       tdb_amxkeylen;  /* Raw authentication key length */
        !           340:        u_int16_t       tdb_emxkeylen;  /* Raw encryption key length */
        !           341:        u_int16_t       tdb_ivlen;      /* IV length */
        !           342:        u_int8_t        tdb_sproto;     /* IPsec protocol */
        !           343:        u_int8_t        tdb_wnd;        /* Replay window */
        !           344:        u_int8_t        tdb_satype;     /* SA type (RFC2367, PF_KEY) */
        !           345:
        !           346:        union sockaddr_union    tdb_dst;        /* Destination address */
        !           347:        union sockaddr_union    tdb_src;        /* Source address */
        !           348:        union sockaddr_union    tdb_proxy;
        !           349:
        !           350:        u_int8_t        *tdb_amxkey;    /* Raw authentication key */
        !           351:        u_int8_t        *tdb_emxkey;    /* Raw encryption key */
        !           352:
        !           353:        u_int32_t       tdb_rpl;        /* Replay counter */
        !           354:        u_int32_t       tdb_bitmap;     /* Used for replay sliding window */
        !           355:
        !           356:        u_int8_t        tdb_iv[4];      /* Used for HALF-IV ESP */
        !           357:
        !           358:        struct ipsec_ref        *tdb_local_cred;
        !           359:        struct ipsec_ref        *tdb_remote_cred;
        !           360:        struct ipsec_ref        *tdb_srcid;     /* Source ID for this SA */
        !           361:        struct ipsec_ref        *tdb_dstid;     /* Destination ID for this SA */
        !           362:        struct ipsec_ref        *tdb_local_auth;/* Local authentication material */
        !           363:        struct ipsec_ref        *tdb_remote_auth;/* Remote authentication material */
        !           364:
        !           365:        u_int32_t       tdb_mtu;        /* MTU at this point in the chain */
        !           366:        u_int64_t       tdb_mtutimeout; /* When to ignore this entry */
        !           367:
        !           368:        u_int16_t       tdb_udpencap_port;      /* Peer UDP port */
        !           369:
        !           370:        u_int16_t       tdb_tag;                /* Packet filter tag */
        !           371:
        !           372:        struct sockaddr_encap   tdb_filter; /* What traffic is acceptable */
        !           373:        struct sockaddr_encap   tdb_filtermask; /* And the mask */
        !           374:
        !           375:        TAILQ_HEAD(tdb_inp_head_in, inpcb)      tdb_inp_in;
        !           376:        TAILQ_HEAD(tdb_inp_head_out, inpcb)     tdb_inp_out;
        !           377:        TAILQ_HEAD(tdb_policy_head, ipsec_policy)       tdb_policy_head;
        !           378: };
        !           379:
        !           380: struct tdb_ident {
        !           381:        u_int32_t spi;
        !           382:        union sockaddr_union dst;
        !           383:        u_int8_t proto;
        !           384: };
        !           385:
        !           386: struct tdb_crypto {
        !           387:        u_int32_t               tc_spi;
        !           388:        union sockaddr_union    tc_dst;
        !           389:        u_int8_t                tc_proto;
        !           390:        int                     tc_protoff;
        !           391:        int                     tc_skip;
        !           392:        caddr_t                 tc_ptr;
        !           393: };
        !           394:
        !           395: struct ipsecinit {
        !           396:        u_int8_t        *ii_enckey;
        !           397:        u_int8_t        *ii_authkey;
        !           398:        u_int16_t       ii_enckeylen;
        !           399:        u_int16_t       ii_authkeylen;
        !           400:        u_int8_t        ii_encalg;
        !           401:        u_int8_t        ii_authalg;
        !           402:        u_int8_t        ii_compalg;
        !           403: };
        !           404:
        !           405: /* xform IDs */
        !           406: #define        XF_IP4          1       /* IP inside IP */
        !           407: #define        XF_AH           2       /* AH */
        !           408: #define        XF_ESP          3       /* ESP */
        !           409: #define        XF_TCPSIGNATURE 5       /* TCP MD5 Signature option, RFC 2358 */
        !           410: #define        XF_IPCOMP       6       /* IPCOMP */
        !           411:
        !           412: /* xform attributes */
        !           413: #define        XFT_AUTH        0x0001
        !           414: #define        XFT_CONF        0x0100
        !           415: #define        XFT_COMP        0x1000
        !           416:
        !           417: #define        IPSEC_ZEROES_SIZE       256     /* Larger than an IP6 extension hdr. */
        !           418:
        !           419: #ifdef _KERNEL
        !           420:
        !           421: struct xformsw {
        !           422:        u_short xf_type;                /* Unique ID of xform */
        !           423:        u_short xf_flags;               /* flags (see below) */
        !           424:        char    *xf_name;               /* human-readable name */
        !           425:        int     (*xf_attach)(void);     /* called at config time */
        !           426:        int     (*xf_init)(struct tdb *, struct xformsw *, struct ipsecinit *);
        !           427:        int     (*xf_zeroize)(struct tdb *); /* termination */
        !           428:        int     (*xf_input)(struct mbuf *, struct tdb *, int, int); /* input */
        !           429:        int     (*xf_output)(struct mbuf *, struct tdb *, struct mbuf **,
        !           430:            int, int);        /* output */
        !           431: };
        !           432:
        !           433: /*
        !           434:  * Protects all tdb lists.
        !           435:  * Must at least be splsoftnet (note: do not use splsoftclock as it is
        !           436:  * special on some architectures, assuming it is always an spl lowering
        !           437:  * operation).
        !           438:  */
        !           439: #define        spltdb  splsoftnet
        !           440:
        !           441: extern int encdebug;
        !           442: extern int ipsec_acl;
        !           443: extern int ipsec_keep_invalid;
        !           444: extern int ipsec_in_use;
        !           445: extern u_int64_t ipsec_last_added;
        !           446: extern int ipsec_require_pfs;
        !           447: extern int ipsec_expire_acquire;
        !           448:
        !           449: extern int ipsec_policy_pool_initialized;
        !           450:
        !           451: extern int ipsec_soft_allocations;
        !           452: extern int ipsec_exp_allocations;
        !           453: extern int ipsec_soft_bytes;
        !           454: extern int ipsec_exp_bytes;
        !           455: extern int ipsec_soft_timeout;
        !           456: extern int ipsec_exp_timeout;
        !           457: extern int ipsec_soft_first_use;
        !           458: extern int ipsec_exp_first_use;
        !           459: extern char ipsec_def_enc[];
        !           460: extern char ipsec_def_auth[];
        !           461: extern char ipsec_def_comp[];
        !           462:
        !           463: extern struct enc_xform enc_xform_des;
        !           464: extern struct enc_xform enc_xform_3des;
        !           465: extern struct enc_xform enc_xform_blf;
        !           466: extern struct enc_xform enc_xform_cast5;
        !           467: extern struct enc_xform enc_xform_skipjack;
        !           468:
        !           469: extern struct auth_hash auth_hash_hmac_md5_96;
        !           470: extern struct auth_hash auth_hash_hmac_sha1_96;
        !           471: extern struct auth_hash auth_hash_hmac_ripemd_160_96;
        !           472:
        !           473: extern struct comp_algo comp_algo_deflate;
        !           474:
        !           475: extern TAILQ_HEAD(ipsec_policy_head, ipsec_policy) ipsec_policy_head;
        !           476: extern TAILQ_HEAD(ipsec_acquire_head, ipsec_acquire) ipsec_acquire_head;
        !           477:
        !           478: extern struct xformsw xformsw[], *xformswNXFORMSW;
        !           479:
        !           480: /* Check if a given tdb has encryption, authentication and/or tunneling */
        !           481: #define        TDB_ATTRIB(x) (((x)->tdb_encalgxform ? NOTIFY_SATYPE_CONF : 0) | \
        !           482:                       ((x)->tdb_authalgxform ? NOTIFY_SATYPE_AUTH : 0) | \
        !           483:                       ((x)->tdb_compalgxform ? NOTIFY_SATYPE_COMP : 0))
        !           484:
        !           485: /* Traverse spi chain and get attributes */
        !           486:
        !           487: #define        SPI_CHAIN_ATTRIB(have, TDB_DIR, TDBP) do {\
        !           488:        int s = spltdb(); \
        !           489:        struct tdb *tmptdb = (TDBP); \
        !           490:        \
        !           491:        (have) = 0; \
        !           492:        while (tmptdb && tmptdb->tdb_xform) { \
        !           493:                if (tmptdb == NULL || tmptdb->tdb_flags & TDBF_INVALID) \
        !           494:                        break; \
        !           495:                (have) |= TDB_ATTRIB(tmptdb); \
        !           496:                tmptdb = tmptdb->TDB_DIR; \
        !           497:        } \
        !           498:        splx(s); \
        !           499: } while (0)
        !           500:
        !           501: /* Misc. */
        !           502: extern char *inet_ntoa4(struct in_addr);
        !           503: extern char *ipsp_address(union sockaddr_union);
        !           504:
        !           505: /* TDB management routines */
        !           506: extern void tdb_add_inp(struct tdb *, struct inpcb *, int);
        !           507: extern u_int32_t reserve_spi(u_int32_t, u_int32_t, union sockaddr_union *,
        !           508:     union sockaddr_union *, u_int8_t, int *);
        !           509: extern struct tdb *gettdb(u_int32_t, union sockaddr_union *, u_int8_t);
        !           510: extern struct tdb *gettdbbyaddr(union sockaddr_union *, u_int8_t,
        !           511:     struct ipsec_ref *, struct ipsec_ref *, struct ipsec_ref *,
        !           512:     struct mbuf *, int, struct sockaddr_encap *, struct sockaddr_encap *);
        !           513: extern struct tdb *gettdbbysrc(union sockaddr_union *, u_int8_t,
        !           514:     struct ipsec_ref *, struct ipsec_ref *, struct mbuf *, int,
        !           515:     struct sockaddr_encap *, struct sockaddr_encap *);
        !           516: extern struct tdb *gettdbbysrcdst(u_int32_t, union sockaddr_union *,
        !           517:     union sockaddr_union *, u_int8_t);
        !           518: extern void puttdb(struct tdb *);
        !           519: extern void tdb_delete(struct tdb *);
        !           520: extern struct tdb *tdb_alloc(void);
        !           521: extern void tdb_free(struct tdb *);
        !           522: extern int tdb_hash(u_int32_t, union sockaddr_union *, u_int8_t);
        !           523: extern int tdb_init(struct tdb *, u_int16_t, struct ipsecinit *);
        !           524: extern int tdb_walk(int (*)(struct tdb *, void *, int), void *);
        !           525:
        !           526: /* XF_IP4 */
        !           527: extern int ipe4_attach(void);
        !           528: extern int ipe4_init(struct tdb *, struct xformsw *, struct ipsecinit *);
        !           529: extern int ipe4_zeroize(struct tdb *);
        !           530: extern int ipip_output(struct mbuf *, struct tdb *, struct mbuf **, int, int);
        !           531: extern void ipe4_input(struct mbuf *, ...);
        !           532: extern void ipip_input(struct mbuf *, int, struct ifnet *);
        !           533:
        !           534: #ifdef INET
        !           535: extern void ip4_input(struct mbuf *, ...);
        !           536: #endif /* INET */
        !           537:
        !           538: #ifdef INET6
        !           539: extern int ip4_input6(struct mbuf **, int *, int);
        !           540: #endif /* INET */
        !           541:
        !           542: /* XF_ETHERIP */
        !           543: extern int etherip_output(struct mbuf *, struct tdb *, struct mbuf **,
        !           544:     int, int);
        !           545: extern void etherip_input(struct mbuf *, ...);
        !           546:
        !           547: /* XF_AH */
        !           548: extern int ah_attach(void);
        !           549: extern int ah_init(struct tdb *, struct xformsw *, struct ipsecinit *);
        !           550: extern int ah_zeroize(struct tdb *);
        !           551: extern int ah_output(struct mbuf *, struct tdb *, struct mbuf **, int, int);
        !           552: extern int ah_output_cb(void *);
        !           553: extern int ah_input(struct mbuf *, struct tdb *, int, int);
        !           554: extern int ah_input_cb(void *);
        !           555: extern int ah_sysctl(int *, u_int, void *, size_t *, void *, size_t);
        !           556: extern int ah_massage_headers(struct mbuf **, int, int, int, int);
        !           557:
        !           558: #ifdef INET
        !           559: extern void ah4_input(struct mbuf *, ...);
        !           560: extern int ah4_input_cb(struct mbuf *, ...);
        !           561: extern void *ah4_ctlinput(int, struct sockaddr *, void *);
        !           562: extern void *udpencap_ctlinput(int, struct sockaddr *, void *);
        !           563: #endif /* INET */
        !           564:
        !           565: #ifdef INET6
        !           566: extern int ah6_input(struct mbuf **, int *, int);
        !           567: extern int ah6_input_cb(struct mbuf *, int, int);
        !           568: #endif /* INET6 */
        !           569:
        !           570: /* XF_ESP */
        !           571: extern int esp_attach(void);
        !           572: extern int esp_init(struct tdb *, struct xformsw *, struct ipsecinit *);
        !           573: extern int esp_zeroize(struct tdb *);
        !           574: extern int esp_output(struct mbuf *, struct tdb *, struct mbuf **, int, int);
        !           575: extern int esp_output_cb(void *);
        !           576: extern int esp_input(struct mbuf *, struct tdb *, int, int);
        !           577: extern int esp_input_cb(void *);
        !           578: extern int esp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
        !           579:
        !           580: #ifdef INET
        !           581: extern void esp4_input(struct mbuf *, ...);
        !           582: extern int esp4_input_cb(struct mbuf *, ...);
        !           583: extern void *esp4_ctlinput(int, struct sockaddr *, void *);
        !           584: #endif /* INET */
        !           585:
        !           586: #ifdef INET6
        !           587: extern int esp6_input(struct mbuf **, int *, int);
        !           588: extern int esp6_input_cb(struct mbuf *, int, int);
        !           589: #endif /* INET6 */
        !           590:
        !           591: /* XF_IPCOMP */
        !           592: extern int ipcomp_attach(void);
        !           593: extern int ipcomp_init(struct tdb *, struct xformsw *, struct ipsecinit *);
        !           594: extern int ipcomp_zeroize(struct tdb *);
        !           595: extern int ipcomp_output(struct mbuf *, struct tdb *, struct mbuf **, int, int);
        !           596: extern int ipcomp_output_cb(void *);
        !           597: extern int ipcomp_input(struct mbuf *, struct tdb *, int, int);
        !           598: extern int ipcomp_input_cb(void *);
        !           599: extern int ipcomp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
        !           600:
        !           601: #ifdef INET
        !           602: extern void ipcomp4_input(struct mbuf *, ...);
        !           603: extern int ipcomp4_input_cb(struct mbuf *, ...);
        !           604: #endif /* INET */
        !           605:
        !           606: #ifdef INET6
        !           607: extern int ipcomp6_input(struct mbuf **, int *, int);
        !           608: extern int ipcomp6_input_cb(struct mbuf *, int, int);
        !           609: #endif /* INET6 */
        !           610:
        !           611: /* XF_TCPSIGNATURE */
        !           612: extern int tcp_signature_tdb_attach(void);
        !           613: extern int tcp_signature_tdb_init(struct tdb *, struct xformsw *,
        !           614:     struct ipsecinit *);
        !           615: extern int tcp_signature_tdb_zeroize(struct tdb *);
        !           616: extern int tcp_signature_tdb_input(struct mbuf *, struct tdb *, int,
        !           617:     int);
        !           618: extern int tcp_signature_tdb_output(struct mbuf *, struct tdb *,
        !           619:     struct mbuf **, int, int);
        !           620:
        !           621: /* Padding */
        !           622: extern caddr_t m_pad(struct mbuf *, int);
        !           623:
        !           624: /* Replay window */
        !           625: extern int checkreplaywindow32(u_int32_t, u_int32_t, u_int32_t *, u_int32_t,
        !           626:     u_int32_t *, int);
        !           627:
        !           628: extern unsigned char ipseczeroes[];
        !           629:
        !           630: /* Packet processing */
        !           631: extern int ipsp_process_packet(struct mbuf *, struct tdb *, int, int);
        !           632: extern int ipsp_process_done(struct mbuf *, struct tdb *);
        !           633: extern struct tdb *ipsp_spd_lookup(struct mbuf *, int, int, int *, int,
        !           634:     struct tdb *, struct inpcb *);
        !           635: extern struct tdb *ipsp_spd_inp(struct mbuf *, int, int, int *, int,
        !           636:     struct tdb *, struct inpcb *, struct ipsec_policy *);
        !           637: extern int ipsec_common_input(struct mbuf *, int, int, int, int, int);
        !           638: extern int ipsec_common_input_cb(struct mbuf *, struct tdb *, int, int,
        !           639:     struct m_tag *);
        !           640: extern int ipsp_acquire_sa(struct ipsec_policy *, union sockaddr_union *,
        !           641:     union sockaddr_union *, struct sockaddr_encap *, struct mbuf *);
        !           642: extern struct ipsec_policy *ipsec_add_policy(struct inpcb *, int, int);
        !           643: extern void ipsec_update_policy(struct inpcb *, struct ipsec_policy *,
        !           644:     int, int);
        !           645: extern int ipsec_delete_policy(struct ipsec_policy *);
        !           646: extern struct ipsec_acquire *ipsp_pending_acquire(struct ipsec_policy *,
        !           647:     union sockaddr_union *);
        !           648: extern void ipsp_delete_acquire(void *);
        !           649: extern int ipsp_is_unspecified(union sockaddr_union);
        !           650: extern void ipsp_reffree(struct ipsec_ref *);
        !           651: extern void ipsp_skipcrypto_unmark(struct tdb_ident *);
        !           652: extern void ipsp_skipcrypto_mark(struct tdb_ident *);
        !           653: extern struct m_tag *ipsp_parse_headers(struct mbuf *, int, u_int8_t);
        !           654: extern int ipsp_ref_match(struct ipsec_ref *, struct ipsec_ref *);
        !           655: extern ssize_t ipsec_hdrsz(struct tdb *);
        !           656: extern void ipsec_adjust_mtu(struct mbuf *, u_int32_t);
        !           657: extern int ipsp_print_tdb(struct tdb *, char *, size_t);
        !           658: extern struct ipsec_acquire *ipsec_get_acquire(u_int32_t);
        !           659: extern int ipsp_aux_match(struct tdb *,
        !           660:     struct ipsec_ref *, struct ipsec_ref *,
        !           661:     struct ipsec_ref *, struct ipsec_ref *,
        !           662:     struct sockaddr_encap *, struct sockaddr_encap *);
        !           663: #endif /* _KERNEL */
        !           664: #endif /* _NETINET_IPSP_H_ */

CVSweb