1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  * Copyright (c) 2012 Nexenta Systems, Inc. All rights reserved.
  25  */
  26 
  27 #ifndef _INET_SADB_H
  28 #define _INET_SADB_H
  29 
  30 #ifdef  __cplusplus
  31 extern "C" {
  32 #endif
  33 
  34 #include <inet/ipsec_info.h>
  35 #include <sys/crypto/common.h>
  36 #include <sys/crypto/api.h>
  37 #include <sys/note.h>
  38 
  39 #define IPSA_MAX_ADDRLEN 4      /* Max address len. (in 32-bits) for an SA. */
  40 
  41 #define MAXSALTSIZE 8
  42 
  43 /*
  44  * For combined mode ciphers, store the crypto_mechanism_t in the
  45  * per-packet ipsec_in_t/ipsec_out_t structures. This is because the PARAMS
  46  * and nonce values change for each packet. For non-combined mode
  47  * ciphers, these values are constant for the life of the SA.
  48  */
  49 typedef struct ipsa_cm_mech_s {
  50         crypto_mechanism_t combined_mech;
  51         union {
  52                 CK_AES_CCM_PARAMS paramu_ccm;
  53                 CK_AES_GCM_PARAMS paramu_gcm;
  54         } paramu;
  55         uint8_t nonce[MAXSALTSIZE + sizeof (uint64_t)];
  56 #define param_ulMACSize paramu.paramu_ccm.ulMACSize
  57 #define param_ulNonceSize paramu.paramu_ccm.ipsa_ulNonceSize
  58 #define param_ulAuthDataSize paramu.paramu_ccm.ipsa_ulAuthDataSize
  59 #define param_ulDataSize paramu.paramu_ccm.ipsa_ulDataSize
  60 #define param_nonce paramu.paramu_ccm.nonce
  61 #define param_authData paramu.paramu_ccm.authData
  62 #define param_pIv paramu.paramu_gcm.ipsa_pIv
  63 #define param_ulIvLen paramu.paramu_gcm.ulIvLen
  64 #define param_ulIvBits paramu.paramu_gcm.ulIvBits
  65 #define param_pAAD paramu.paramu_gcm.pAAD
  66 #define param_ulAADLen paramu.paramu_gcm.ulAADLen
  67 #define param_ulTagBits paramu.paramu_gcm.ulTagBits
  68 } ipsa_cm_mech_t;
  69 
  70 /*
  71  * The Initialization Vector (also known as IV or Nonce) used to
  72  * initialize the Block Cipher, is made up of a Counter and a Salt.
  73  * The Counter is fixed at 64 bits and is incremented for each packet.
  74  * The Salt value can be any whole byte value upto 64 bits. This is
  75  * algorithm mode specific and can be configured with ipsecalgs(1m).
  76  *
  77  * We only support whole byte salt lengths, this is because the salt is
  78  * stored in an array of uint8_t's. This is enforced by ipsecalgs(1m)
  79  * which configures the salt length as a number of bytes. Checks are
  80  * made to ensure the salt length defined in ipsecalgs(1m) fits in
  81  * the ipsec_nonce_t.
  82  *
  83  * The Salt value remains constant for the life of the SA, the Salt is
  84  * know to both peers, but NOT transmitted on the network. The Counter
  85  * portion of the nonce is transmitted over the network with each packet
  86  * and is confusingly described as the Initialization Vector by RFCs
  87  * 4309/4106.
  88  *
  89  * The maximum Initialization Vector length is 128 bits, if the actual
  90  * size is less, its padded internally by the algorithm.
  91  *
  92  * The nonce structure is defined like this in the SA (ipsa_t)to ensure
  93  * the Initilization Vector (counter) is 64 bit aligned, because it will
  94  * be incremented as an uint64_t. The nonce as used by the algorithms is
  95  * a straight uint8_t array.
  96  *
  97  *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  98  *                     | | | | |x|x|x|x|               |
  99  *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 100  * salt_offset         <------>
 101  * ipsa_saltlen                <------->
 102  * ipsa_nonce_buf------^
 103  * ipsa_salt-------------~~~~~~^
 104  * ipsa_nonce------------~~~~~~^
 105  * ipsa_iv-----------------------------^
 106  */
 107 typedef struct ipsec_nonce_s {
 108         uint8_t         salt[MAXSALTSIZE];
 109         uint64_t        iv;
 110 } ipsec_nonce_t;
 111 
 112 /*
 113  * IP security association.  Synchronization assumes 32-bit loads, so
 114  * the 64-bit quantities can't even be be read w/o locking it down!
 115  */
 116 
 117 /* keying info */
 118 typedef struct ipsa_key_s {
 119         uint8_t *sak_key;               /* Algorithm key. */
 120         uint_t sak_keylen;      /* Algorithm key length (in bytes). */
 121         uint_t sak_keybits;     /* Algorithm key length (in bits) */
 122         uint_t sak_algid;       /* Algorithm ID number. */
 123 } ipsa_key_t;
 124 
 125 typedef struct ipsa_s {
 126         struct ipsa_s *ipsa_next;       /* Next in hash bucket */
 127         struct ipsa_s **ipsa_ptpn;      /* Pointer to previous next pointer. */
 128         kmutex_t *ipsa_linklock;        /* Pointer to hash-chain lock. */
 129         void (*ipsa_freefunc)(struct ipsa_s *); /* freeassoc function */
 130         void (*ipsa_noncefunc)(struct ipsa_s *, uchar_t *,
 131             uint_t, uchar_t *, ipsa_cm_mech_t *, crypto_data_t *);
 132         /*
 133          * NOTE: I may need more pointers, depending on future SA
 134          * requirements.
 135          */
 136         ipsa_key_t ipsa_authkeydata;
 137 #define ipsa_authkey ipsa_authkeydata.sak_key
 138 #define ipsa_authkeylen ipsa_authkeydata.sak_keylen
 139 #define ipsa_authkeybits ipsa_authkeydata.sak_keybits
 140 #define ipsa_auth_alg ipsa_authkeydata.sak_algid
 141         ipsa_key_t ipsa_encrkeydata;
 142 #define ipsa_encrkey ipsa_encrkeydata.sak_key
 143 #define ipsa_encrkeylen ipsa_encrkeydata.sak_keylen
 144 #define ipsa_encrkeybits ipsa_encrkeydata.sak_keybits
 145 #define ipsa_encr_alg ipsa_encrkeydata.sak_algid
 146 
 147         struct ipsid_s *ipsa_src_cid;   /* Source certificate identity */
 148         struct ipsid_s *ipsa_dst_cid;   /* Destination certificate identity */
 149         mblk_t  *ipsa_lpkt;     /* Packet received while larval (CAS me) */
 150         mblk_t  *ipsa_bpkt_head;        /* Packets received while idle */
 151         mblk_t  *ipsa_bpkt_tail;
 152 #define SADB_MAX_IDLEPKTS       100
 153         uint8_t ipsa_mblkcnt;   /* Number of packets received while idle */
 154 
 155         /*
 156          * PF_KEYv2 supports a replay window size of 255.  Hence there is a
 157          * need a bit vector to support a replay window of 255.  256 is a nice
 158          * round number, so I support that.
 159          *
 160          * Use an array of uint64_t for best performance on 64-bit
 161          * processors.  (And hope that 32-bit compilers can handle things
 162          * okay.)  The " >> 6 " is to get the appropriate number of 64-bit
 163          * ints.
 164          */
 165 #define SADB_MAX_REPLAY 256     /* Must be 0 mod 64. */
 166         uint64_t ipsa_replay_arr[SADB_MAX_REPLAY >> 6];
 167 
 168         uint64_t ipsa_unique_id;        /* Non-zero for unique SAs */
 169         uint64_t ipsa_unique_mask;      /* mask value for unique_id */
 170 
 171         /*
 172          * Reference count semantics:
 173          *
 174          *      An SA has a reference count of 1 if something's pointing
 175          *      to it.  This includes being in a hash table.  So if an
 176          *      SA is in a hash table, it has a reference count of at least 1.
 177          *
 178          *      When a ptr. to an IPSA is assigned, you MUST REFHOLD after
 179          *      said assignment.  When a ptr. to an IPSA is released
 180          *      you MUST REFRELE.  When the refcount hits 0, REFRELE
 181          *      will free the IPSA.
 182          */
 183         kmutex_t ipsa_lock;     /* Locks non-linkage/refcnt fields. */
 184         /* Q:  Since I may be doing refcnts differently, will I need cv? */
 185         uint_t ipsa_refcnt;     /* Reference count. */
 186 
 187         /*
 188          * The following four time fields are the ones monitored by ah_ager()
 189          * and esp_ager() respectively.  They are all absolute wall-clock
 190          * times.  The times of creation (i.e. add time) and first use are
 191          * pretty straightforward.  The soft and hard expire times are
 192          * derived from the times of first use and creation, plus the minimum
 193          * expiration times in the fields that follow this.
 194          *
 195          * For example, if I had a hard add time of 30 seconds, and a hard
 196          * use time of 15, the ipsa_hardexpiretime would be time of add, plus
 197          * 30 seconds.  If I USE the SA such that time of first use plus 15
 198          * seconds would be earlier than the add time plus 30 seconds, then
 199          * ipsa_hardexpiretime would become this earlier time.
 200          */
 201         time_t ipsa_addtime;    /* Time I was added. */
 202         time_t ipsa_usetime;    /* Time of my first use. */
 203         time_t ipsa_lastuse;    /* Time of my last use. */
 204         time_t ipsa_idletime;   /* Seconds of idle time */
 205         time_t ipsa_last_nat_t_ka;      /* Time of my last NAT-T keepalive. */
 206         time_t ipsa_softexpiretime;     /* Time of my first soft expire. */
 207         time_t ipsa_hardexpiretime;     /* Time of my first hard expire. */
 208         time_t ipsa_idleexpiretime;     /* Time of my next idle expire time */
 209 
 210         struct ipsec_nonce_s *ipsa_nonce_buf;
 211         uint8_t *ipsa_nonce;
 212         uint_t ipsa_nonce_len;
 213         uint8_t *ipsa_salt;
 214         uint_t ipsa_saltbits;
 215         uint_t ipsa_saltlen;
 216         uint64_t *ipsa_iv;
 217 
 218         uint64_t ipsa_iv_hardexpire;
 219         uint64_t ipsa_iv_softexpire;
 220         /*
 221          * The following fields are directly reflected in PF_KEYv2 LIFETIME
 222          * extensions.  The time_ts are in number-of-seconds, and the bytes
 223          * are in... bytes.
 224          */
 225         time_t ipsa_softaddlt;  /* Seconds of soft lifetime after add. */
 226         time_t ipsa_softuselt;  /* Seconds of soft lifetime after first use. */
 227         time_t ipsa_hardaddlt;  /* Seconds of hard lifetime after add. */
 228         time_t ipsa_harduselt;  /* Seconds of hard lifetime after first use. */
 229         time_t ipsa_idleaddlt;  /* Seconds of idle time after add */
 230         time_t ipsa_idleuselt;  /* Seconds of idle time after first use */
 231         uint64_t ipsa_softbyteslt;      /* Bytes of soft lifetime. */
 232         uint64_t ipsa_hardbyteslt;      /* Bytes of hard lifetime. */
 233         uint64_t ipsa_bytes;    /* Bytes encrypted/authed by this SA. */
 234 
 235         /*
 236          * "Allocations" are a concept mentioned in PF_KEYv2.  We do not
 237          * support them, except to record them per the PF_KEYv2 spec.
 238          */
 239         uint_t ipsa_softalloc;  /* Allocations allowed (soft). */
 240         uint_t ipsa_hardalloc;  /* Allocations allowed (hard). */
 241         uint_t ipsa_alloc;      /* Allocations made. */
 242 
 243         uint_t ipsa_type;       /* Type of security association. (AH/etc.) */
 244         uint_t ipsa_state;      /* State of my association. */
 245         uint_t ipsa_replay_wsize; /* Size of replay window */
 246         uint32_t ipsa_flags;    /* Flags for security association. */
 247         uint32_t ipsa_spi;      /* Security parameters index. */
 248         uint32_t ipsa_replay;   /* Highest seen replay value for this SA. */
 249         uint32_t ipsa_kmp;      /* key management proto */
 250         uint32_t ipsa_kmc;      /* key management cookie */
 251 
 252         boolean_t ipsa_haspeer;         /* Has peer in another table. */
 253 
 254         /*
 255          * Address storage.
 256          * The source address can be INADDR_ANY, IN6ADDR_ANY, etc.
 257          *
 258          * Address families (per sys/socket.h) guide us.  We could have just
 259          * used sockaddr_storage
 260          */
 261         sa_family_t ipsa_addrfam;
 262         sa_family_t ipsa_innerfam;      /* Inner AF can be != src/dst AF. */
 263 
 264         uint32_t ipsa_srcaddr[IPSA_MAX_ADDRLEN];
 265         uint32_t ipsa_dstaddr[IPSA_MAX_ADDRLEN];
 266         uint32_t ipsa_innersrc[IPSA_MAX_ADDRLEN];
 267         uint32_t ipsa_innerdst[IPSA_MAX_ADDRLEN];
 268 
 269         uint8_t ipsa_innersrcpfx;
 270         uint8_t ipsa_innerdstpfx;
 271 
 272         uint16_t ipsa_inbound_cksum; /* cksum correction for inbound packets */
 273         uint16_t ipsa_local_nat_port;   /* Local NAT-T port.  (0 --> 4500) */
 274         uint16_t ipsa_remote_nat_port; /* The other port that isn't 4500 */
 275 
 276         /* these can only be v4 */
 277         uint32_t ipsa_natt_addr_loc;
 278         uint32_t ipsa_natt_addr_rem;
 279 
 280         /*
 281          * icmp type and code. *_end are to specify ranges. if only
 282          * a single value, * and *_end are the same value.
 283          */
 284         uint8_t ipsa_icmp_type;
 285         uint8_t ipsa_icmp_type_end;
 286         uint8_t ipsa_icmp_code;
 287         uint8_t ipsa_icmp_code_end;
 288 
 289         /*
 290          * For the kernel crypto framework.
 291          */
 292         crypto_key_t ipsa_kcfauthkey;           /* authentication key */
 293         crypto_key_t ipsa_kcfencrkey;           /* encryption key */
 294         crypto_ctx_template_t ipsa_authtmpl;    /* auth context template */
 295         crypto_ctx_template_t ipsa_encrtmpl;    /* encr context template */
 296         crypto_mechanism_t ipsa_amech;          /* auth mech type and ICV len */
 297         crypto_mechanism_t ipsa_emech;          /* encr mech type */
 298         size_t ipsa_mac_len;                    /* auth MAC/ICV length */
 299         size_t ipsa_iv_len;                     /* encr IV length */
 300         size_t ipsa_datalen;                    /* block length in bytes. */
 301 
 302         /*
 303          * Input and output processing functions called from IP.
 304          * The mblk_t is the data; the IPsec information is in the attributes
 305          * Returns NULL if the mblk is consumed which it is if there was
 306          * a failure or if pending. If failure then
 307          * the ipIfInDiscards/OutDiscards counters are increased.
 308          */
 309         mblk_t *(*ipsa_output_func)(mblk_t *, ip_xmit_attr_t *);
 310         mblk_t *(*ipsa_input_func)(mblk_t *, void *, ip_recv_attr_t *);
 311 
 312         /*
 313          * Soft reference to paired SA
 314          */
 315         uint32_t        ipsa_otherspi;
 316         netstack_t      *ipsa_netstack; /* Does not have a netstack_hold */
 317 
 318         ts_label_t *ipsa_tsl;                   /* MLS: label attributes */
 319         ts_label_t *ipsa_otsl;                  /* MLS: outer label */
 320         uint8_t ipsa_mac_exempt;                /* MLS: mac exempt flag */
 321         uchar_t ipsa_opt_storage[IP_MAX_OPT_LENGTH];
 322 } ipsa_t;
 323 
 324 /*
 325  * ipsa_t address handling macros.  We want these to be inlined, and deal
 326  * with 32-bit words to avoid bcmp/bcopy calls.
 327  *
 328  * Assume we only have AF_INET and AF_INET6 addresses for now.  Also assume
 329  * that we have 32-bit alignment on everything.
 330  */
 331 #define IPSA_IS_ADDR_UNSPEC(addr, fam) ((((uint32_t *)(addr))[0] == 0) && \
 332         (((fam) == AF_INET) || (((uint32_t *)(addr))[3] == 0 && \
 333         ((uint32_t *)(addr))[2] == 0 && ((uint32_t *)(addr))[1] == 0)))
 334 #define IPSA_ARE_ADDR_EQUAL(addr1, addr2, fam) \
 335         ((((uint32_t *)(addr1))[0] == ((uint32_t *)(addr2))[0]) && \
 336         (((fam) == AF_INET) || \
 337         (((uint32_t *)(addr1))[3] == ((uint32_t *)(addr2))[3] && \
 338         ((uint32_t *)(addr1))[2] == ((uint32_t *)(addr2))[2] && \
 339         ((uint32_t *)(addr1))[1] == ((uint32_t *)(addr2))[1])))
 340 #define IPSA_COPY_ADDR(dstaddr, srcaddr, fam) { \
 341         ((uint32_t *)(dstaddr))[0] = ((uint32_t *)(srcaddr))[0]; \
 342         if ((fam) == AF_INET6) {\
 343                 ((uint32_t *)(dstaddr))[1] = ((uint32_t *)(srcaddr))[1]; \
 344                 ((uint32_t *)(dstaddr))[2] = ((uint32_t *)(srcaddr))[2]; \
 345                 ((uint32_t *)(dstaddr))[3] = ((uint32_t *)(srcaddr))[3]; } }
 346 
 347 /*
 348  * ipsa_t reference hold/release macros.
 349  *
 350  * If you have a pointer, you REFHOLD.  If you are releasing a pointer, you
 351  * REFRELE.  An ipsa_t that is newly inserted into the table should have
 352  * a reference count of 1 (for the table's pointer), plus 1 more for every
 353  * pointer that is referencing the ipsa_t.
 354  */
 355 
 356 #define IPSA_REFHOLD(ipsa) {                    \
 357         atomic_add_32(&(ipsa)->ipsa_refcnt, 1);  \
 358         ASSERT((ipsa)->ipsa_refcnt != 0);    \
 359 }
 360 
 361 /*
 362  * Decrement the reference count on the SA.
 363  * In architectures e.g sun4u, where atomic_add_32_nv is just
 364  * a cas, we need to maintain the right memory barrier semantics
 365  * as that of mutex_exit i.e all the loads and stores should complete
 366  * before the cas is executed. membar_exit() does that here.
 367  */
 368 
 369 #define IPSA_REFRELE(ipsa) {                                    \
 370         ASSERT((ipsa)->ipsa_refcnt != 0);                    \
 371         membar_exit();                                          \
 372         if (atomic_add_32_nv(&(ipsa)->ipsa_refcnt, -1) == 0)     \
 373                 ((ipsa)->ipsa_freefunc)(ipsa);                       \
 374 }
 375 
 376 /*
 377  * Security association hash macros and definitions.  For now, assume the
 378  * IPsec model, and hash outbounds on destination address, and inbounds on
 379  * SPI.
 380  */
 381 
 382 #define IPSEC_DEFAULT_HASH_SIZE 256
 383 
 384 #define INBOUND_HASH(sadb, spi) ((spi) % ((sadb)->sdb_hashsize))
 385 #define OUTBOUND_HASH_V4(sadb, v4addr) ((v4addr) % ((sadb)->sdb_hashsize))
 386 #define OUTBOUND_HASH_V6(sadb, v6addr) OUTBOUND_HASH_V4((sadb), \
 387         (*(uint32_t *)&(v6addr)) ^ (*(((uint32_t *)&(v6addr)) + 1)) ^ \
 388         (*(((uint32_t *)&(v6addr)) + 2)) ^ (*(((uint32_t *)&(v6addr)) + 3)))
 389 
 390 /*
 391  * Syntactic sugar to find the appropriate hash bucket directly.
 392  */
 393 
 394 #define INBOUND_BUCKET(sadb, spi) &(((sadb)->sdb_if)[INBOUND_HASH(sadb, spi)])
 395 #define OUTBOUND_BUCKET_V4(sadb, v4addr) \
 396         &(((sadb)->sdb_of)[OUTBOUND_HASH_V4(sadb, v4addr)])
 397 #define OUTBOUND_BUCKET_V6(sadb, v6addr) \
 398         &(((sadb)->sdb_of)[OUTBOUND_HASH_V6(sadb, v6addr)])
 399 
 400 #define IPSA_F_PFS      SADB_SAFLAGS_PFS        /* PFS in use for this SA? */
 401 #define IPSA_F_NOREPFLD SADB_SAFLAGS_NOREPLAY   /* No replay field, for */
 402                                                 /* backward compat. */
 403 #define IPSA_F_USED     SADB_X_SAFLAGS_USED     /* SA has been used. */
 404 #define IPSA_F_UNIQUE   SADB_X_SAFLAGS_UNIQUE   /* SA is unique */
 405 #define IPSA_F_AALG1    SADB_X_SAFLAGS_AALG1    /* Auth alg flag 1 */
 406 #define IPSA_F_AALG2    SADB_X_SAFLAGS_AALG2    /* Auth alg flag 2 */
 407 #define IPSA_F_EALG1    SADB_X_SAFLAGS_EALG1    /* Encrypt alg flag 1 */
 408 #define IPSA_F_EALG2    SADB_X_SAFLAGS_EALG2    /* Encrypt alg flag 2 */
 409 
 410 #define IPSA_F_ASYNC    0x200000                /* Call KCF asynchronously? */
 411 #define IPSA_F_NATT_LOC SADB_X_SAFLAGS_NATT_LOC
 412 #define IPSA_F_NATT_REM SADB_X_SAFLAGS_NATT_REM
 413 #define IPSA_F_BEHIND_NAT SADB_X_SAFLAGS_NATTED
 414 #define IPSA_F_NATT     (SADB_X_SAFLAGS_NATT_LOC | SADB_X_SAFLAGS_NATT_REM | \
 415         SADB_X_SAFLAGS_NATTED)
 416 #define IPSA_F_CINVALID 0x40000         /* SA shouldn't be cached */
 417 #define IPSA_F_PAIRED   SADB_X_SAFLAGS_PAIRED   /* SA is one of a pair */
 418 #define IPSA_F_OUTBOUND SADB_X_SAFLAGS_OUTBOUND /* SA direction bit */
 419 #define IPSA_F_INBOUND  SADB_X_SAFLAGS_INBOUND  /* SA direction bit */
 420 #define IPSA_F_TUNNEL   SADB_X_SAFLAGS_TUNNEL
 421 /*
 422  * These flags are only defined here to prevent a flag value collision.
 423  */
 424 #define IPSA_F_COMBINED SADB_X_SAFLAGS_EALG1    /* Defined in pfkeyv2.h */
 425 #define IPSA_F_COUNTERMODE SADB_X_SAFLAGS_EALG2 /* Defined in pfkeyv2.h */
 426 
 427 /*
 428  * Sets of flags that are allowed to by set or modified by PF_KEY apps.
 429  */
 430 #define AH_UPDATE_SETTABLE_FLAGS \
 431         (SADB_X_SAFLAGS_PAIRED | SADB_SAFLAGS_NOREPLAY | \
 432         SADB_X_SAFLAGS_OUTBOUND | SADB_X_SAFLAGS_INBOUND | \
 433         SADB_X_SAFLAGS_KM1 | SADB_X_SAFLAGS_KM2 | \
 434         SADB_X_SAFLAGS_KM3 | SADB_X_SAFLAGS_KM4)
 435 
 436 /* AH can't set NAT flags (or even use NAT).  Add NAT flags to the ESP set. */
 437 #define ESP_UPDATE_SETTABLE_FLAGS (AH_UPDATE_SETTABLE_FLAGS | IPSA_F_NATT)
 438 
 439 #define AH_ADD_SETTABLE_FLAGS \
 440         (AH_UPDATE_SETTABLE_FLAGS | SADB_X_SAFLAGS_AALG1 | \
 441         SADB_X_SAFLAGS_AALG2 | SADB_X_SAFLAGS_TUNNEL | \
 442         SADB_SAFLAGS_NOREPLAY)
 443 
 444 /* AH can't set NAT flags (or even use NAT).  Add NAT flags to the ESP set. */
 445 #define ESP_ADD_SETTABLE_FLAGS (AH_ADD_SETTABLE_FLAGS | IPSA_F_NATT | \
 446         SADB_X_SAFLAGS_EALG1 | SADB_X_SAFLAGS_EALG2)
 447 
 448 
 449 
 450 /* SA states are important for handling UPDATE PF_KEY messages. */
 451 #define IPSA_STATE_LARVAL               SADB_SASTATE_LARVAL
 452 #define IPSA_STATE_MATURE               SADB_SASTATE_MATURE
 453 #define IPSA_STATE_DYING                SADB_SASTATE_DYING
 454 #define IPSA_STATE_DEAD                 SADB_SASTATE_DEAD
 455 #define IPSA_STATE_IDLE                 SADB_X_SASTATE_IDLE
 456 #define IPSA_STATE_ACTIVE_ELSEWHERE     SADB_X_SASTATE_ACTIVE_ELSEWHERE
 457 
 458 /*
 459  * NOTE:  If the document authors do things right in defining algorithms, we'll
 460  *        probably have flags for what all is here w.r.t. replay, ESP w/HMAC,
 461  *        etc.
 462  */
 463 
 464 #define IPSA_T_ACQUIRE  SEC_TYPE_NONE   /* If this typed returned, sa needed */
 465 #define IPSA_T_AH       SEC_TYPE_AH     /* IPsec AH association */
 466 #define IPSA_T_ESP      SEC_TYPE_ESP    /* IPsec ESP association */
 467 
 468 #define IPSA_AALG_NONE  SADB_AALG_NONE          /* No auth. algorithm */
 469 #define IPSA_AALG_MD5H  SADB_AALG_MD5HMAC       /* MD5-HMAC algorithm */
 470 #define IPSA_AALG_SHA1H SADB_AALG_SHA1HMAC      /* SHA1-HMAC algorithm */
 471 
 472 #define IPSA_EALG_NONE          SADB_EALG_NONE  /* No encryption algorithm */
 473 #define IPSA_EALG_DES_CBC       SADB_EALG_DESCBC
 474 #define IPSA_EALG_3DES          SADB_EALG_3DESCBC
 475 
 476 /*
 477  * Protect each ipsa_t bucket (and linkage) with a lock.
 478  */
 479 
 480 typedef struct isaf_s {
 481         ipsa_t *isaf_ipsa;
 482         kmutex_t isaf_lock;
 483         uint64_t isaf_gen;
 484 } isaf_t;
 485 
 486 /*
 487  * ACQUIRE record.  If AH/ESP/whatever cannot find an association for outbound
 488  * traffic, it sends up an SADB_ACQUIRE message and create an ACQUIRE record.
 489  */
 490 
 491 #define IPSACQ_MAXPACKETS 4     /* Number of packets that can be queued up */
 492                                 /* waiting for an ACQUIRE to finish. */
 493 
 494 typedef struct ipsacq_s {
 495         struct ipsacq_s *ipsacq_next;
 496         struct ipsacq_s **ipsacq_ptpn;
 497         kmutex_t *ipsacq_linklock;
 498         struct ipsec_policy_s  *ipsacq_policy;
 499         struct ipsec_action_s  *ipsacq_act;
 500 
 501         sa_family_t ipsacq_addrfam;     /* Address family. */
 502         sa_family_t ipsacq_inneraddrfam; /* Inner-packet address family. */
 503         int ipsacq_numpackets;          /* How many packets queued up so far. */
 504         uint32_t ipsacq_seq;            /* PF_KEY sequence number. */
 505         uint64_t ipsacq_unique_id;      /* Unique ID for SAs that need it. */
 506 
 507         kmutex_t ipsacq_lock;   /* Protects non-linkage fields. */
 508         time_t ipsacq_expire;   /* Wall-clock time when this record expires. */
 509         mblk_t *ipsacq_mp;      /* List of datagrams waiting for an SA. */
 510 
 511         /* These two point inside the last mblk inserted. */
 512         uint32_t *ipsacq_srcaddr;
 513         uint32_t *ipsacq_dstaddr;
 514 
 515         /* Cache these instead of point so we can mask off accordingly */
 516         uint32_t ipsacq_innersrc[IPSA_MAX_ADDRLEN];
 517         uint32_t ipsacq_innerdst[IPSA_MAX_ADDRLEN];
 518 
 519         /* These may change per-acquire. */
 520         uint16_t ipsacq_srcport;
 521         uint16_t ipsacq_dstport;
 522         uint8_t ipsacq_proto;
 523         uint8_t ipsacq_inner_proto;
 524         uint8_t ipsacq_innersrcpfx;
 525         uint8_t ipsacq_innerdstpfx;
 526 
 527         /* icmp type and code of triggering packet (if applicable) */
 528         uint8_t ipsacq_icmp_type;
 529         uint8_t ipsacq_icmp_code;
 530 
 531         /* label associated with triggering packet */
 532         ts_label_t      *ipsacq_tsl;
 533 } ipsacq_t;
 534 
 535 /*
 536  * Kernel-generated sequence numbers will be no less than 0x80000000 to
 537  * forestall any cretinous problems with manual keying accidentally updating
 538  * an ACQUIRE entry.
 539  */
 540 #define IACQF_LOWEST_SEQ 0x80000000
 541 
 542 #define SADB_AGE_INTERVAL_DEFAULT 8000
 543 
 544 /*
 545  * ACQUIRE fanout.  Protect each linkage with a lock.
 546  */
 547 
 548 typedef struct iacqf_s {
 549         ipsacq_t *iacqf_ipsacq;
 550         kmutex_t iacqf_lock;
 551 } iacqf_t;
 552 
 553 /*
 554  * A (network protocol, ipsec protocol) specific SADB.
 555  * (i.e., one each for {ah, esp} and {v4, v6}.
 556  *
 557  * Keep outbound assocs in a simple hash table for now.
 558  * One danger point, multiple SAs for a single dest will clog a bucket.
 559  * For the future, consider two-level hashing (2nd hash on IPC?), then probe.
 560  */
 561 
 562 typedef struct sadb_s
 563 {
 564         isaf_t  *sdb_of;
 565         isaf_t  *sdb_if;
 566         iacqf_t *sdb_acq;
 567         int     sdb_hashsize;
 568 } sadb_t;
 569 
 570 /*
 571  * A pair of SADB's (one for v4, one for v6), and related state (including
 572  * acquire callbacks).
 573  */
 574 
 575 typedef struct sadbp_s
 576 {
 577         uint32_t        s_satype;
 578         uint32_t        *s_acquire_timeout;
 579         sadb_t          s_v4;
 580         sadb_t          s_v6;
 581         uint32_t        s_addflags;
 582         uint32_t        s_updateflags;
 583 } sadbp_t;
 584 
 585 /*
 586  * A pair of SA's for a single connection, the structure contains a
 587  * pointer to a SA and the SA its paired with (opposite direction) as well
 588  * as the SA's respective hash buckets.
 589  */
 590 typedef struct ipsap_s
 591 {
 592         boolean_t       in_inbound_table;
 593         isaf_t          *ipsap_bucket;
 594         ipsa_t          *ipsap_sa_ptr;
 595         isaf_t          *ipsap_pbucket;
 596         ipsa_t          *ipsap_psa_ptr;
 597 } ipsap_t;
 598 
 599 typedef struct templist_s
 600 {
 601         ipsa_t          *ipsa;
 602         struct templist_s       *next;
 603 } templist_t;
 604 
 605 /* Pointer to an all-zeroes IPv6 address. */
 606 #define ALL_ZEROES_PTR  ((uint32_t *)&ipv6_all_zeros)
 607 
 608 /*
 609  * Form unique id from ip_xmit_attr_t.
 610  */
 611 #define SA_FORM_UNIQUE_ID(ixa)                                  \
 612         SA_UNIQUE_ID((ixa)->ixa_ipsec_src_port, (ixa)->ixa_ipsec_dst_port, \
 613             (((ixa)->ixa_flags & IXAF_IPSEC_TUNNEL) ?                    \
 614             ((ixa)->ixa_ipsec_inaf == AF_INET6 ? \
 615             IPPROTO_IPV6 : IPPROTO_ENCAP) :                             \
 616             (ixa)->ixa_ipsec_proto),                                 \
 617             (((ixa)->ixa_flags & IXAF_IPSEC_TUNNEL) ? \
 618             (ixa)->ixa_ipsec_proto : 0))
 619 
 620 /*
 621  * This macro is used to generate unique ids (along with the addresses, both
 622  * inner and outer) for outbound datagrams that require unique SAs.
 623  *
 624  * N.B. casts and unsigned shift amounts discourage unwarranted
 625  * sign extension of dstport, proto, and iproto.
 626  *
 627  * Unique ID is 64-bits allocated as follows (pardon my big-endian bias):
 628  *
 629  *   6               4      43      33              11
 630  *   3               7      09      21              65              0
 631  *   +---------------*-------+-------+--------------+---------------+
 632  *   |  MUST-BE-ZERO |<iprot>|<proto>| <src port>   |  <dest port>  |
 633  *   +---------------*-------+-------+--------------+---------------+
 634  *
 635  * If there are inner addresses (tunnel mode) the ports come from the
 636  * inner addresses.  If there are no inner addresses, the ports come from
 637  * the outer addresses (transport mode).  Tunnel mode MUST have <proto>
 638  * set to either IPPROTO_ENCAP or IPPPROTO_IPV6.
 639  */
 640 #define SA_UNIQUE_ID(srcport, dstport, proto, iproto)   \
 641         ((srcport) | ((uint64_t)(dstport) << 16U) | \
 642         ((uint64_t)(proto) << 32U) | ((uint64_t)(iproto) << 40U))
 643 
 644 /*
 645  * SA_UNIQUE_MASK generates a mask value to use when comparing the unique value
 646  * from a packet to an SA.
 647  */
 648 
 649 #define SA_UNIQUE_MASK(srcport, dstport, proto, iproto)         \
 650         SA_UNIQUE_ID((srcport != 0) ? 0xffff : 0,               \
 651                     (dstport != 0) ? 0xffff : 0,                \
 652                     (proto != 0) ? 0xff : 0,                    \
 653                     (iproto != 0) ? 0xff : 0)
 654 
 655 /*
 656  * Decompose unique id back into its original fields.
 657  */
 658 #define SA_IPROTO(ipsa) ((ipsa)->ipsa_unique_id>>40)&0xff
 659 #define SA_PROTO(ipsa) ((ipsa)->ipsa_unique_id>>32)&0xff
 660 #define SA_SRCPORT(ipsa) ((ipsa)->ipsa_unique_id & 0xffff)
 661 #define SA_DSTPORT(ipsa) (((ipsa)->ipsa_unique_id >> 16) & 0xffff)
 662 
 663 typedef struct ipsa_query_s ipsa_query_t;
 664 
 665 typedef boolean_t (*ipsa_match_fn_t)(ipsa_query_t *, ipsa_t *);
 666 
 667 #define IPSA_NMATCH     10
 668 
 669 /*
 670  * SADB query structure.
 671  *
 672  * Provide a generalized mechanism for matching entries in the SADB;
 673  * one of these structures is initialized using sadb_form_query(),
 674  * and then can be used as a parameter to sadb_match_query() which returns
 675  * B_TRUE if the SA matches the query.
 676  *
 677  * Under the covers, sadb_form_query populates the matchers[] array with
 678  * functions which are called one at a time until one fails to match.
 679  */
 680 struct ipsa_query_s {
 681         uint32_t req, match;
 682         sadb_address_t *srcext, *dstext;
 683         sadb_ident_t *srcid, *dstid;
 684         sadb_x_kmc_t *kmcext;
 685         sadb_sa_t *assoc;
 686         uint32_t spi;
 687         struct sockaddr_in *src;
 688         struct sockaddr_in6 *src6;
 689         struct sockaddr_in *dst;
 690         struct sockaddr_in6 *dst6;
 691         sa_family_t af;
 692         uint32_t *srcaddr, *dstaddr;
 693         uint32_t ifindex;
 694         uint32_t kmc, kmp;
 695         char *didstr, *sidstr;
 696         uint16_t didtype, sidtype;
 697         sadbp_t *spp;
 698         sadb_t *sp;
 699         isaf_t  *inbound, *outbound;
 700         uint32_t outhash;
 701         uint32_t inhash;
 702         ipsa_match_fn_t matchers[IPSA_NMATCH];
 703 };
 704 
 705 #define IPSA_Q_SA               0x00000001
 706 #define IPSA_Q_DST              0x00000002
 707 #define IPSA_Q_SRC              0x00000004
 708 #define IPSA_Q_DSTID            0x00000008
 709 #define IPSA_Q_SRCID            0x00000010
 710 #define IPSA_Q_KMC              0x00000020
 711 #define IPSA_Q_INBOUND          0x00000040 /* fill in inbound isaf_t */
 712 #define IPSA_Q_OUTBOUND         0x00000080 /* fill in outbound isaf_t */
 713 
 714 int sadb_form_query(keysock_in_t *, uint32_t, uint32_t, ipsa_query_t *, int *);
 715 boolean_t sadb_match_query(ipsa_query_t *q, ipsa_t *sa);
 716 
 717 
 718 /*
 719  * All functions that return an ipsa_t will return it with IPSA_REFHOLD()
 720  * already called.
 721  */
 722 
 723 /* SA retrieval (inbound and outbound) */
 724 ipsa_t *ipsec_getassocbyspi(isaf_t *, uint32_t, uint32_t *, uint32_t *,
 725     sa_family_t);
 726 ipsa_t *ipsec_getassocbyconn(isaf_t *, ip_xmit_attr_t *, uint32_t *, uint32_t *,
 727     sa_family_t, uint8_t, ts_label_t *);
 728 
 729 /* SA insertion. */
 730 int sadb_insertassoc(ipsa_t *, isaf_t *);
 731 
 732 /* SA table construction and destruction. */
 733 void sadbp_init(const char *name, sadbp_t *, int, int, netstack_t *);
 734 void sadbp_flush(sadbp_t *, netstack_t *);
 735 void sadbp_destroy(sadbp_t *, netstack_t *);
 736 
 737 /* SA insertion and deletion. */
 738 int sadb_insertassoc(ipsa_t *, isaf_t *);
 739 void sadb_unlinkassoc(ipsa_t *);
 740 
 741 /* Support routines to interface a keysock consumer to PF_KEY. */
 742 mblk_t *sadb_keysock_out(minor_t);
 743 int sadb_hardsoftchk(sadb_lifetime_t *, sadb_lifetime_t *, sadb_lifetime_t *);
 744 int sadb_labelchk(struct keysock_in_s *);
 745 void sadb_pfkey_echo(queue_t *, mblk_t *, sadb_msg_t *, struct keysock_in_s *,
 746     ipsa_t *);
 747 void sadb_pfkey_error(queue_t *, mblk_t *, int, int, uint_t);
 748 void sadb_keysock_hello(queue_t **, queue_t *, mblk_t *, void (*)(void *),
 749     void *, timeout_id_t *, int);
 750 int sadb_addrcheck(queue_t *, mblk_t *, sadb_ext_t *, uint_t, netstack_t *);
 751 boolean_t sadb_addrfix(keysock_in_t *, queue_t *, mblk_t *, netstack_t *);
 752 int sadb_addrset(ire_t *);
 753 int sadb_delget_sa(mblk_t *, keysock_in_t *, sadbp_t *, int *, queue_t *,
 754     uint8_t);
 755 
 756 int sadb_purge_sa(mblk_t *, keysock_in_t *, sadb_t *, int *, queue_t *);
 757 int sadb_common_add(queue_t *, mblk_t *, sadb_msg_t *,
 758     keysock_in_t *, isaf_t *, isaf_t *, ipsa_t *, boolean_t, boolean_t, int *,
 759     netstack_t *, sadbp_t *);
 760 void sadb_set_usetime(ipsa_t *);
 761 boolean_t sadb_age_bytes(queue_t *, ipsa_t *, uint64_t, boolean_t);
 762 int sadb_update_sa(mblk_t *, keysock_in_t *, mblk_t **, sadbp_t *,
 763     int *, queue_t *, int (*)(mblk_t *, keysock_in_t *, int *, netstack_t *),
 764     netstack_t *, uint8_t);
 765 void sadb_acquire(mblk_t *, ip_xmit_attr_t *, boolean_t, boolean_t);
 766 void gcm_params_init(ipsa_t *, uchar_t *, uint_t, uchar_t *, ipsa_cm_mech_t *,
 767     crypto_data_t *);
 768 void ccm_params_init(ipsa_t *, uchar_t *, uint_t, uchar_t *, ipsa_cm_mech_t *,
 769     crypto_data_t *);
 770 void cbc_params_init(ipsa_t *, uchar_t *, uint_t, uchar_t *, ipsa_cm_mech_t *,
 771     crypto_data_t *);
 772 
 773 void sadb_destroy_acquire(ipsacq_t *, netstack_t *);
 774 struct ipsec_stack;
 775 mblk_t *sadb_setup_acquire(ipsacq_t *, uint8_t, struct ipsec_stack *);
 776 ipsa_t *sadb_getspi(keysock_in_t *, uint32_t, int *, netstack_t *, uint_t);
 777 void sadb_in_acquire(sadb_msg_t *, sadbp_t *, queue_t *, netstack_t *);
 778 boolean_t sadb_replay_check(ipsa_t *, uint32_t);
 779 boolean_t sadb_replay_peek(ipsa_t *, uint32_t);
 780 int sadb_dump(queue_t *, mblk_t *, keysock_in_t *, sadb_t *);
 781 void sadb_replay_delete(ipsa_t *);
 782 void sadb_ager(sadb_t *, queue_t *, int, netstack_t *);
 783 
 784 timeout_id_t sadb_retimeout(hrtime_t, queue_t *, void (*)(void *), void *,
 785     uint_t *, uint_t, short);
 786 void sadb_sa_refrele(void *target);
 787 mblk_t *sadb_set_lpkt(ipsa_t *, mblk_t *, ip_recv_attr_t *);
 788 mblk_t *sadb_clear_lpkt(ipsa_t *);
 789 void sadb_buf_pkt(ipsa_t *, mblk_t *, ip_recv_attr_t *);
 790 void sadb_clear_buf_pkt(void *ipkt);
 791 
 792 /* Note that buf_pkt is the product of ip_recv_attr_to_mblk() */
 793 #define HANDLE_BUF_PKT(taskq, stack, dropper, buf_pkt)                  \
 794 {                                                                       \
 795         if (buf_pkt != NULL) {                                          \
 796                 if (taskq_dispatch(taskq, sadb_clear_buf_pkt,           \
 797                     (void *) buf_pkt, TQ_NOSLEEP) == 0) {               \
 798                     /* Dispatch was unsuccessful drop the packets. */   \
 799                         mblk_t          *tmp;                           \
 800                         while (buf_pkt != NULL) {                       \
 801                                 tmp = buf_pkt->b_next;                       \
 802                                 buf_pkt->b_next = NULL;                      \
 803                                 buf_pkt = ip_recv_attr_free_mblk(buf_pkt); \
 804                                 ip_drop_packet(buf_pkt, B_TRUE, NULL,   \
 805                                     DROPPER(stack,                      \
 806                                     ipds_sadb_inidle_timeout),          \
 807                                     &dropper);                              \
 808                                 buf_pkt = tmp;                          \
 809                         }                                               \
 810                 }                                                       \
 811         }                                                               \
 812 }                                                                       \
 813 
 814 /*
 815  * Two IPsec rate-limiting routines.
 816  */
 817 /*PRINTFLIKE6*/
 818 extern void ipsec_rl_strlog(netstack_t *, short, short, char,
 819     ushort_t, char *, ...)
 820     __KPRINTFLIKE(6);
 821 extern void ipsec_assocfailure(short, short, char, ushort_t, char *, uint32_t,
 822     void *, int, netstack_t *);
 823 
 824 /*
 825  * Algorithm types.
 826  */
 827 
 828 #define IPSEC_NALGTYPES         2
 829 
 830 typedef enum ipsec_algtype {
 831         IPSEC_ALG_AUTH = 0,
 832         IPSEC_ALG_ENCR = 1,
 833         IPSEC_ALG_ALL = 2
 834 } ipsec_algtype_t;
 835 
 836 /*
 837  * Definitions as per IPsec/ISAKMP DOI.
 838  */
 839 
 840 #define IPSEC_MAX_ALGS          256
 841 #define PROTO_IPSEC_AH          2
 842 #define PROTO_IPSEC_ESP         3
 843 
 844 /*
 845  * Common algorithm info.
 846  */
 847 typedef struct ipsec_alginfo
 848 {
 849         uint8_t         alg_id;
 850         uint8_t         alg_flags;
 851         uint16_t        *alg_key_sizes;
 852         uint16_t        *alg_block_sizes;
 853         uint16_t        *alg_params;
 854         uint16_t        alg_nkey_sizes;
 855         uint16_t        alg_ivlen;
 856         uint16_t        alg_icvlen;
 857         uint8_t         alg_saltlen;
 858         uint16_t        alg_nblock_sizes;
 859         uint16_t        alg_nparams;
 860         uint16_t        alg_minbits;
 861         uint16_t        alg_maxbits;
 862         uint16_t        alg_datalen;
 863         /*
 864          * increment: number of bits from keysize to keysize
 865          * default: # of increments from min to default key len
 866          */
 867         uint16_t        alg_increment;
 868         uint16_t        alg_default;
 869         uint16_t        alg_default_bits;
 870         /*
 871          * Min, max, and default key sizes effectively supported
 872          * by the encryption framework.
 873          */
 874         uint16_t        alg_ef_minbits;
 875         uint16_t        alg_ef_maxbits;
 876         uint16_t        alg_ef_default;
 877         uint16_t        alg_ef_default_bits;
 878 
 879         crypto_mech_type_t alg_mech_type;       /* KCF mechanism type */
 880         crypto_mech_name_t alg_mech_name;       /* KCF mechanism name */
 881 } ipsec_alginfo_t;
 882 
 883 #define alg_datalen alg_block_sizes[0]
 884 #define ALG_VALID(_alg) ((_alg)->alg_flags & ALG_FLAG_VALID)
 885 
 886 /*
 887  * Software crypto execution mode.
 888  */
 889 typedef enum {
 890         IPSEC_ALGS_EXEC_SYNC = 0,
 891         IPSEC_ALGS_EXEC_ASYNC = 1
 892 } ipsec_algs_exec_mode_t;
 893 
 894 extern void ipsec_alg_reg(ipsec_algtype_t, ipsec_alginfo_t *, netstack_t *);
 895 extern void ipsec_alg_unreg(ipsec_algtype_t, uint8_t, netstack_t *);
 896 extern void ipsec_alg_fix_min_max(ipsec_alginfo_t *, ipsec_algtype_t,
 897     netstack_t *ns);
 898 extern void alg_flag_check(ipsec_alginfo_t *);
 899 extern void ipsec_alg_free(ipsec_alginfo_t *);
 900 extern void ipsec_register_prov_update(void);
 901 extern void sadb_alg_update(ipsec_algtype_t, uint8_t, boolean_t, netstack_t *);
 902 
 903 extern int sadb_sens_len_from_label(ts_label_t *);
 904 extern void sadb_sens_from_label(sadb_sens_t *, int, ts_label_t *, int);
 905 
 906 /*
 907  * Context templates management.
 908  */
 909 
 910 #define IPSEC_CTX_TMPL_ALLOC ((crypto_ctx_template_t)-1)
 911 #define IPSEC_CTX_TMPL(_sa, _which, _type, _tmpl) {                     \
 912         if ((_tmpl = (_sa)->_which) == IPSEC_CTX_TMPL_ALLOC) {               \
 913                 mutex_enter(&assoc->ipsa_lock);                          \
 914                 if ((_sa)->_which == IPSEC_CTX_TMPL_ALLOC) {         \
 915                         ipsec_stack_t *ipss;                            \
 916                                                                         \
 917                         ipss = assoc->ipsa_netstack->netstack_ipsec;      \
 918                         rw_enter(&ipss->ipsec_alg_lock, RW_READER);      \
 919                         (void) ipsec_create_ctx_tmpl(_sa, _type);       \
 920                         rw_exit(&ipss->ipsec_alg_lock);                  \
 921                 }                                                       \
 922                 mutex_exit(&assoc->ipsa_lock);                           \
 923                 if ((_tmpl = (_sa)->_which) == IPSEC_CTX_TMPL_ALLOC) \
 924                         _tmpl = NULL;                                   \
 925         }                                                               \
 926 }
 927 
 928 extern int ipsec_create_ctx_tmpl(ipsa_t *, ipsec_algtype_t);
 929 extern void ipsec_destroy_ctx_tmpl(ipsa_t *, ipsec_algtype_t);
 930 
 931 /* key checking */
 932 extern int ipsec_check_key(crypto_mech_type_t, sadb_key_t *, boolean_t, int *);
 933 
 934 typedef struct ipsec_kstats_s {
 935         kstat_named_t esp_stat_in_requests;
 936         kstat_named_t esp_stat_in_discards;
 937         kstat_named_t esp_stat_lookup_failure;
 938         kstat_named_t ah_stat_in_requests;
 939         kstat_named_t ah_stat_in_discards;
 940         kstat_named_t ah_stat_lookup_failure;
 941         kstat_named_t sadb_acquire_maxpackets;
 942         kstat_named_t sadb_acquire_qhiwater;
 943 } ipsec_kstats_t;
 944 
 945 /*
 946  * (ipss)->ipsec_kstats is equal to (ipss)->ipsec_ksp->ks_data if
 947  * kstat_create_netstack for (ipss)->ipsec_ksp succeeds, but when it
 948  * fails, it will be NULL. Note this is done for all stack instances,
 949  * so it *could* fail. hence a non-NULL checking is done for
 950  * IP_ESP_BUMP_STAT, IP_AH_BUMP_STAT and IP_ACQUIRE_STAT
 951  */
 952 #define IP_ESP_BUMP_STAT(ipss, x)                                       \
 953 do {                                                                    \
 954         if ((ipss)->ipsec_kstats != NULL)                            \
 955                 ((ipss)->ipsec_kstats->esp_stat_ ## x).value.ui64++;      \
 956 _NOTE(CONSTCOND)                                                        \
 957 } while (0)
 958 
 959 #define IP_AH_BUMP_STAT(ipss, x)                                        \
 960 do {                                                                    \
 961         if ((ipss)->ipsec_kstats != NULL)                            \
 962                 ((ipss)->ipsec_kstats->ah_stat_ ## x).value.ui64++;       \
 963 _NOTE(CONSTCOND)                                                        \
 964 } while (0)
 965 
 966 #define IP_ACQUIRE_STAT(ipss, val, new)                                 \
 967 do {                                                                    \
 968         if ((ipss)->ipsec_kstats != NULL &&                          \
 969             ((uint64_t)(new)) >                                              \
 970             ((ipss)->ipsec_kstats->sadb_acquire_ ## val).value.ui64)      \
 971                 ((ipss)->ipsec_kstats->sadb_acquire_ ## val).value.ui64 = \
 972                         ((uint64_t)(new));                              \
 973 _NOTE(CONSTCOND)                                                        \
 974 } while (0)
 975 
 976 
 977 #ifdef  __cplusplus
 978 }
 979 #endif
 980 
 981 #endif /* _INET_SADB_H */