The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netipsec/key.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $FreeBSD$       */
    2 /*      $KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $   */
    3 
    4 /*-
    5  * SPDX-License-Identifier: BSD-3-Clause
    6  *
    7  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
    8  * All rights reserved.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  * 3. Neither the name of the project nor the names of its contributors
   19  *    may be used to endorse or promote products derived from this software
   20  *    without specific prior written permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
   23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
   26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   32  * SUCH DAMAGE.
   33  */
   34 
   35 /*
   36  * This code is referd to RFC 2367
   37  */
   38 
   39 #include "opt_inet.h"
   40 #include "opt_inet6.h"
   41 #include "opt_ipsec.h"
   42 
   43 #include <sys/types.h>
   44 #include <sys/param.h>
   45 #include <sys/systm.h>
   46 #include <sys/kernel.h>
   47 #include <sys/fnv_hash.h>
   48 #include <sys/lock.h>
   49 #include <sys/mutex.h>
   50 #include <sys/mbuf.h>
   51 #include <sys/domain.h>
   52 #include <sys/protosw.h>
   53 #include <sys/malloc.h>
   54 #include <sys/rmlock.h>
   55 #include <sys/socket.h>
   56 #include <sys/socketvar.h>
   57 #include <sys/sysctl.h>
   58 #include <sys/errno.h>
   59 #include <sys/proc.h>
   60 #include <sys/queue.h>
   61 #include <sys/refcount.h>
   62 #include <sys/syslog.h>
   63 
   64 #include <vm/uma.h>
   65 
   66 #include <net/if.h>
   67 #include <net/if_var.h>
   68 #include <net/vnet.h>
   69 
   70 #include <netinet/in.h>
   71 #include <netinet/in_systm.h>
   72 #include <netinet/ip.h>
   73 #include <netinet/in_var.h>
   74 #include <netinet/udp.h>
   75 
   76 #ifdef INET6
   77 #include <netinet/ip6.h>
   78 #include <netinet6/in6_var.h>
   79 #include <netinet6/ip6_var.h>
   80 #endif /* INET6 */
   81 
   82 #include <net/pfkeyv2.h>
   83 #include <netipsec/keydb.h>
   84 #include <netipsec/key.h>
   85 #include <netipsec/keysock.h>
   86 #include <netipsec/key_debug.h>
   87 
   88 #include <netipsec/ipsec.h>
   89 #ifdef INET6
   90 #include <netipsec/ipsec6.h>
   91 #endif
   92 
   93 #include <netipsec/xform.h>
   94 #include <machine/in_cksum.h>
   95 #include <machine/stdarg.h>
   96 
   97 /* randomness */
   98 #include <sys/random.h>
   99 
  100 #define FULLMASK        0xff
  101 #define _BITS(bytes)    ((bytes) << 3)
  102 
  103 #define UINT32_80PCT    0xcccccccc
  104 /*
  105  * Note on SA reference counting:
  106  * - SAs that are not in DEAD state will have (total external reference + 1)
  107  *   following value in reference count field.  they cannot be freed and are
  108  *   referenced from SA header.
  109  * - SAs that are in DEAD state will have (total external reference)
  110  *   in reference count field.  they are ready to be freed.  reference from
  111  *   SA header will be removed in key_delsav(), when the reference count
  112  *   field hits 0 (= no external reference other than from SA header.
  113  */
  114 
  115 VNET_DEFINE(u_int32_t, key_debug_level) = 0;
  116 VNET_DEFINE_STATIC(u_int, key_spi_trycnt) = 1000;
  117 VNET_DEFINE_STATIC(u_int32_t, key_spi_minval) = 0x100;
  118 VNET_DEFINE_STATIC(u_int32_t, key_spi_maxval) = 0x0fffffff;     /* XXX */
  119 VNET_DEFINE_STATIC(u_int32_t, policy_id) = 0;
  120 /*interval to initialize randseed,1(m)*/
  121 VNET_DEFINE_STATIC(u_int, key_int_random) = 60;
  122 /* interval to expire acquiring, 30(s)*/
  123 VNET_DEFINE_STATIC(u_int, key_larval_lifetime) = 30;
  124 /* counter for blocking SADB_ACQUIRE.*/
  125 VNET_DEFINE_STATIC(int, key_blockacq_count) = 10;
  126 /* lifetime for blocking SADB_ACQUIRE.*/
  127 VNET_DEFINE_STATIC(int, key_blockacq_lifetime) = 20;
  128 /* preferred old sa rather than new sa.*/
  129 VNET_DEFINE_STATIC(int, key_preferred_oldsa) = 1;
  130 #define V_key_spi_trycnt        VNET(key_spi_trycnt)
  131 #define V_key_spi_minval        VNET(key_spi_minval)
  132 #define V_key_spi_maxval        VNET(key_spi_maxval)
  133 #define V_policy_id             VNET(policy_id)
  134 #define V_key_int_random        VNET(key_int_random)
  135 #define V_key_larval_lifetime   VNET(key_larval_lifetime)
  136 #define V_key_blockacq_count    VNET(key_blockacq_count)
  137 #define V_key_blockacq_lifetime VNET(key_blockacq_lifetime)
  138 #define V_key_preferred_oldsa   VNET(key_preferred_oldsa)
  139 
  140 VNET_DEFINE_STATIC(u_int32_t, acq_seq) = 0;
  141 #define V_acq_seq               VNET(acq_seq)
  142 
  143 VNET_DEFINE_STATIC(uint32_t, sp_genid) = 0;
  144 #define V_sp_genid              VNET(sp_genid)
  145 
  146 /* SPD */
  147 TAILQ_HEAD(secpolicy_queue, secpolicy);
  148 LIST_HEAD(secpolicy_list, secpolicy);
  149 VNET_DEFINE_STATIC(struct secpolicy_queue, sptree[IPSEC_DIR_MAX]);
  150 VNET_DEFINE_STATIC(struct secpolicy_queue, sptree_ifnet[IPSEC_DIR_MAX]);
  151 static struct rmlock sptree_lock;
  152 #define V_sptree                VNET(sptree)
  153 #define V_sptree_ifnet          VNET(sptree_ifnet)
  154 #define SPTREE_LOCK_INIT()      rm_init(&sptree_lock, "sptree")
  155 #define SPTREE_LOCK_DESTROY()   rm_destroy(&sptree_lock)
  156 #define SPTREE_RLOCK_TRACKER    struct rm_priotracker sptree_tracker
  157 #define SPTREE_RLOCK()          rm_rlock(&sptree_lock, &sptree_tracker)
  158 #define SPTREE_RUNLOCK()        rm_runlock(&sptree_lock, &sptree_tracker)
  159 #define SPTREE_RLOCK_ASSERT()   rm_assert(&sptree_lock, RA_RLOCKED)
  160 #define SPTREE_WLOCK()          rm_wlock(&sptree_lock)
  161 #define SPTREE_WUNLOCK()        rm_wunlock(&sptree_lock)
  162 #define SPTREE_WLOCK_ASSERT()   rm_assert(&sptree_lock, RA_WLOCKED)
  163 #define SPTREE_UNLOCK_ASSERT()  rm_assert(&sptree_lock, RA_UNLOCKED)
  164 
  165 /* Hash table for lookup SP using unique id */
  166 VNET_DEFINE_STATIC(struct secpolicy_list *, sphashtbl);
  167 VNET_DEFINE_STATIC(u_long, sphash_mask);
  168 #define V_sphashtbl             VNET(sphashtbl)
  169 #define V_sphash_mask           VNET(sphash_mask)
  170 
  171 #define SPHASH_NHASH_LOG2       7
  172 #define SPHASH_NHASH            (1 << SPHASH_NHASH_LOG2)
  173 #define SPHASH_HASHVAL(id)      (key_u32hash(id) & V_sphash_mask)
  174 #define SPHASH_HASH(id)         &V_sphashtbl[SPHASH_HASHVAL(id)]
  175 
  176 /* SPD cache */
  177 struct spdcache_entry {
  178    struct secpolicyindex spidx; /* secpolicyindex */
  179    struct secpolicy *sp;        /* cached policy to be used */
  180 
  181    LIST_ENTRY(spdcache_entry) chain;
  182 };
  183 LIST_HEAD(spdcache_entry_list, spdcache_entry);
  184 
  185 #define SPDCACHE_MAX_ENTRIES_PER_HASH   8
  186 
  187 VNET_DEFINE_STATIC(u_int, key_spdcache_maxentries) = 0;
  188 #define V_key_spdcache_maxentries       VNET(key_spdcache_maxentries)
  189 VNET_DEFINE_STATIC(u_int, key_spdcache_threshold) = 32;
  190 #define V_key_spdcache_threshold        VNET(key_spdcache_threshold)
  191 VNET_DEFINE_STATIC(unsigned long, spd_size) = 0;
  192 #define V_spd_size              VNET(spd_size)
  193 
  194 #define SPDCACHE_ENABLED()      (V_key_spdcache_maxentries != 0)
  195 #define SPDCACHE_ACTIVE() \
  196         (SPDCACHE_ENABLED() && V_spd_size >= V_key_spdcache_threshold)
  197 
  198 VNET_DEFINE_STATIC(struct spdcache_entry_list *, spdcachehashtbl);
  199 VNET_DEFINE_STATIC(u_long, spdcachehash_mask);
  200 #define V_spdcachehashtbl       VNET(spdcachehashtbl)
  201 #define V_spdcachehash_mask     VNET(spdcachehash_mask)
  202 
  203 #define SPDCACHE_HASHVAL(idx) \
  204         (key_addrprotohash(&(idx)->src, &(idx)->dst, &(idx)->ul_proto) &  \
  205             V_spdcachehash_mask)
  206 
  207 /* Each cache line is protected by a mutex */
  208 VNET_DEFINE_STATIC(struct mtx *, spdcache_lock);
  209 #define V_spdcache_lock         VNET(spdcache_lock)
  210 
  211 #define SPDCACHE_LOCK_INIT(a) \
  212         mtx_init(&V_spdcache_lock[a], "spdcache", \
  213             "fast ipsec SPD cache", MTX_DEF|MTX_DUPOK)
  214 #define SPDCACHE_LOCK_DESTROY(a)        mtx_destroy(&V_spdcache_lock[a])
  215 #define SPDCACHE_LOCK(a)                mtx_lock(&V_spdcache_lock[a]);
  216 #define SPDCACHE_UNLOCK(a)              mtx_unlock(&V_spdcache_lock[a]);
  217 
  218 static struct sx spi_alloc_lock;
  219 #define SPI_ALLOC_LOCK_INIT()           sx_init(&spi_alloc_lock, "spialloc")
  220 #define SPI_ALLOC_LOCK_DESTROY()        sx_destroy(&spi_alloc_lock)
  221 #define SPI_ALLOC_LOCK()                sx_xlock(&spi_alloc_lock)
  222 #define SPI_ALLOC_UNLOCK()              sx_unlock(&spi_alloc_lock)
  223 #define SPI_ALLOC_LOCK_ASSERT()         sx_assert(&spi_alloc_lock, SA_XLOCKED)
  224 
  225 /* SAD */
  226 TAILQ_HEAD(secashead_queue, secashead);
  227 LIST_HEAD(secashead_list, secashead);
  228 VNET_DEFINE_STATIC(struct secashead_queue, sahtree);
  229 static struct rmlock sahtree_lock;
  230 #define V_sahtree               VNET(sahtree)
  231 #define SAHTREE_LOCK_INIT()     rm_init(&sahtree_lock, "sahtree")
  232 #define SAHTREE_LOCK_DESTROY()  rm_destroy(&sahtree_lock)
  233 #define SAHTREE_RLOCK_TRACKER   struct rm_priotracker sahtree_tracker
  234 #define SAHTREE_RLOCK()         rm_rlock(&sahtree_lock, &sahtree_tracker)
  235 #define SAHTREE_RUNLOCK()       rm_runlock(&sahtree_lock, &sahtree_tracker)
  236 #define SAHTREE_RLOCK_ASSERT()  rm_assert(&sahtree_lock, RA_RLOCKED)
  237 #define SAHTREE_WLOCK()         rm_wlock(&sahtree_lock)
  238 #define SAHTREE_WUNLOCK()       rm_wunlock(&sahtree_lock)
  239 #define SAHTREE_WLOCK_ASSERT()  rm_assert(&sahtree_lock, RA_WLOCKED)
  240 #define SAHTREE_UNLOCK_ASSERT() rm_assert(&sahtree_lock, RA_UNLOCKED)
  241 
  242 /* Hash table for lookup in SAD using SA addresses */
  243 VNET_DEFINE_STATIC(struct secashead_list *, sahaddrhashtbl);
  244 VNET_DEFINE_STATIC(u_long, sahaddrhash_mask);
  245 #define V_sahaddrhashtbl        VNET(sahaddrhashtbl)
  246 #define V_sahaddrhash_mask      VNET(sahaddrhash_mask)
  247 
  248 #define SAHHASH_NHASH_LOG2      7
  249 #define SAHHASH_NHASH           (1 << SAHHASH_NHASH_LOG2)
  250 #define SAHADDRHASH_HASHVAL(idx)        \
  251         (key_addrprotohash(&(idx)->src, &(idx)->dst, &(idx)->proto) & \
  252             V_sahaddrhash_mask)
  253 #define SAHADDRHASH_HASH(saidx)         \
  254     &V_sahaddrhashtbl[SAHADDRHASH_HASHVAL(saidx)]
  255 
  256 /* Hash table for lookup in SAD using SPI */
  257 LIST_HEAD(secasvar_list, secasvar);
  258 VNET_DEFINE_STATIC(struct secasvar_list *, savhashtbl);
  259 VNET_DEFINE_STATIC(u_long, savhash_mask);
  260 #define V_savhashtbl            VNET(savhashtbl)
  261 #define V_savhash_mask          VNET(savhash_mask)
  262 #define SAVHASH_NHASH_LOG2      7
  263 #define SAVHASH_NHASH           (1 << SAVHASH_NHASH_LOG2)
  264 #define SAVHASH_HASHVAL(spi)    (key_u32hash(spi) & V_savhash_mask)
  265 #define SAVHASH_HASH(spi)       &V_savhashtbl[SAVHASH_HASHVAL(spi)]
  266 
  267 static uint32_t
  268 key_addrprotohash(const union sockaddr_union *src,
  269     const union sockaddr_union *dst, const uint8_t *proto)
  270 {
  271         uint32_t hval;
  272 
  273         hval = fnv_32_buf(proto, sizeof(*proto),
  274             FNV1_32_INIT);
  275         switch (dst->sa.sa_family) {
  276 #ifdef INET
  277         case AF_INET:
  278                 hval = fnv_32_buf(&src->sin.sin_addr,
  279                     sizeof(in_addr_t), hval);
  280                 hval = fnv_32_buf(&dst->sin.sin_addr,
  281                     sizeof(in_addr_t), hval);
  282                 break;
  283 #endif
  284 #ifdef INET6
  285         case AF_INET6:
  286                 hval = fnv_32_buf(&src->sin6.sin6_addr,
  287                     sizeof(struct in6_addr), hval);
  288                 hval = fnv_32_buf(&dst->sin6.sin6_addr,
  289                     sizeof(struct in6_addr), hval);
  290                 break;
  291 #endif
  292         default:
  293                 hval = 0;
  294                 ipseclog((LOG_DEBUG, "%s: unknown address family %d\n",
  295                     __func__, dst->sa.sa_family));
  296         }
  297         return (hval);
  298 }
  299 
  300 static uint32_t
  301 key_u32hash(uint32_t val)
  302 {
  303 
  304         return (fnv_32_buf(&val, sizeof(val), FNV1_32_INIT));
  305 }
  306 
  307                                                         /* registed list */
  308 VNET_DEFINE_STATIC(LIST_HEAD(_regtree, secreg), regtree[SADB_SATYPE_MAX + 1]);
  309 #define V_regtree               VNET(regtree)
  310 static struct mtx regtree_lock;
  311 #define REGTREE_LOCK_INIT() \
  312         mtx_init(&regtree_lock, "regtree", "fast ipsec regtree", MTX_DEF)
  313 #define REGTREE_LOCK_DESTROY()  mtx_destroy(&regtree_lock)
  314 #define REGTREE_LOCK()          mtx_lock(&regtree_lock)
  315 #define REGTREE_UNLOCK()        mtx_unlock(&regtree_lock)
  316 #define REGTREE_LOCK_ASSERT()   mtx_assert(&regtree_lock, MA_OWNED)
  317 
  318 /* Acquiring list */
  319 LIST_HEAD(secacq_list, secacq);
  320 VNET_DEFINE_STATIC(struct secacq_list, acqtree);
  321 #define V_acqtree               VNET(acqtree)
  322 static struct mtx acq_lock;
  323 #define ACQ_LOCK_INIT() \
  324     mtx_init(&acq_lock, "acqtree", "ipsec SA acquiring list", MTX_DEF)
  325 #define ACQ_LOCK_DESTROY()      mtx_destroy(&acq_lock)
  326 #define ACQ_LOCK()              mtx_lock(&acq_lock)
  327 #define ACQ_UNLOCK()            mtx_unlock(&acq_lock)
  328 #define ACQ_LOCK_ASSERT()       mtx_assert(&acq_lock, MA_OWNED)
  329 
  330 /* Hash table for lookup in ACQ list using SA addresses */
  331 VNET_DEFINE_STATIC(struct secacq_list *, acqaddrhashtbl);
  332 VNET_DEFINE_STATIC(u_long, acqaddrhash_mask);
  333 #define V_acqaddrhashtbl        VNET(acqaddrhashtbl)
  334 #define V_acqaddrhash_mask      VNET(acqaddrhash_mask)
  335 
  336 /* Hash table for lookup in ACQ list using SEQ number */
  337 VNET_DEFINE_STATIC(struct secacq_list *, acqseqhashtbl);
  338 VNET_DEFINE_STATIC(u_long, acqseqhash_mask);
  339 #define V_acqseqhashtbl         VNET(acqseqhashtbl)
  340 #define V_acqseqhash_mask       VNET(acqseqhash_mask)
  341 
  342 #define ACQHASH_NHASH_LOG2      7
  343 #define ACQHASH_NHASH           (1 << ACQHASH_NHASH_LOG2)
  344 #define ACQADDRHASH_HASHVAL(idx)        \
  345         (key_addrprotohash(&(idx)->src, &(idx)->dst, &(idx)->proto) & \
  346             V_acqaddrhash_mask)
  347 #define ACQSEQHASH_HASHVAL(seq)         \
  348     (key_u32hash(seq) & V_acqseqhash_mask)
  349 #define ACQADDRHASH_HASH(saidx) \
  350     &V_acqaddrhashtbl[ACQADDRHASH_HASHVAL(saidx)]
  351 #define ACQSEQHASH_HASH(seq)    \
  352     &V_acqseqhashtbl[ACQSEQHASH_HASHVAL(seq)]
  353                                                         /* SP acquiring list */
  354 VNET_DEFINE_STATIC(LIST_HEAD(_spacqtree, secspacq), spacqtree);
  355 #define V_spacqtree             VNET(spacqtree)
  356 static struct mtx spacq_lock;
  357 #define SPACQ_LOCK_INIT() \
  358         mtx_init(&spacq_lock, "spacqtree", \
  359                 "fast ipsec security policy acquire list", MTX_DEF)
  360 #define SPACQ_LOCK_DESTROY()    mtx_destroy(&spacq_lock)
  361 #define SPACQ_LOCK()            mtx_lock(&spacq_lock)
  362 #define SPACQ_UNLOCK()          mtx_unlock(&spacq_lock)
  363 #define SPACQ_LOCK_ASSERT()     mtx_assert(&spacq_lock, MA_OWNED)
  364 
  365 static const int minsize[] = {
  366         sizeof(struct sadb_msg),        /* SADB_EXT_RESERVED */
  367         sizeof(struct sadb_sa),         /* SADB_EXT_SA */
  368         sizeof(struct sadb_lifetime),   /* SADB_EXT_LIFETIME_CURRENT */
  369         sizeof(struct sadb_lifetime),   /* SADB_EXT_LIFETIME_HARD */
  370         sizeof(struct sadb_lifetime),   /* SADB_EXT_LIFETIME_SOFT */
  371         sizeof(struct sadb_address),    /* SADB_EXT_ADDRESS_SRC */
  372         sizeof(struct sadb_address),    /* SADB_EXT_ADDRESS_DST */
  373         sizeof(struct sadb_address),    /* SADB_EXT_ADDRESS_PROXY */
  374         sizeof(struct sadb_key),        /* SADB_EXT_KEY_AUTH */
  375         sizeof(struct sadb_key),        /* SADB_EXT_KEY_ENCRYPT */
  376         sizeof(struct sadb_ident),      /* SADB_EXT_IDENTITY_SRC */
  377         sizeof(struct sadb_ident),      /* SADB_EXT_IDENTITY_DST */
  378         sizeof(struct sadb_sens),       /* SADB_EXT_SENSITIVITY */
  379         sizeof(struct sadb_prop),       /* SADB_EXT_PROPOSAL */
  380         sizeof(struct sadb_supported),  /* SADB_EXT_SUPPORTED_AUTH */
  381         sizeof(struct sadb_supported),  /* SADB_EXT_SUPPORTED_ENCRYPT */
  382         sizeof(struct sadb_spirange),   /* SADB_EXT_SPIRANGE */
  383         0,                              /* SADB_X_EXT_KMPRIVATE */
  384         sizeof(struct sadb_x_policy),   /* SADB_X_EXT_POLICY */
  385         sizeof(struct sadb_x_sa2),      /* SADB_X_SA2 */
  386         sizeof(struct sadb_x_nat_t_type),/* SADB_X_EXT_NAT_T_TYPE */
  387         sizeof(struct sadb_x_nat_t_port),/* SADB_X_EXT_NAT_T_SPORT */
  388         sizeof(struct sadb_x_nat_t_port),/* SADB_X_EXT_NAT_T_DPORT */
  389         sizeof(struct sadb_address),    /* SADB_X_EXT_NAT_T_OAI */
  390         sizeof(struct sadb_address),    /* SADB_X_EXT_NAT_T_OAR */
  391         sizeof(struct sadb_x_nat_t_frag),/* SADB_X_EXT_NAT_T_FRAG */
  392         sizeof(struct sadb_x_sa_replay), /* SADB_X_EXT_SA_REPLAY */
  393         sizeof(struct sadb_address),    /* SADB_X_EXT_NEW_ADDRESS_SRC */
  394         sizeof(struct sadb_address),    /* SADB_X_EXT_NEW_ADDRESS_DST */
  395 };
  396 _Static_assert(sizeof(minsize)/sizeof(int) == SADB_EXT_MAX + 1, "minsize size mismatch");
  397 
  398 static const int maxsize[] = {
  399         sizeof(struct sadb_msg),        /* SADB_EXT_RESERVED */
  400         sizeof(struct sadb_sa),         /* SADB_EXT_SA */
  401         sizeof(struct sadb_lifetime),   /* SADB_EXT_LIFETIME_CURRENT */
  402         sizeof(struct sadb_lifetime),   /* SADB_EXT_LIFETIME_HARD */
  403         sizeof(struct sadb_lifetime),   /* SADB_EXT_LIFETIME_SOFT */
  404         0,                              /* SADB_EXT_ADDRESS_SRC */
  405         0,                              /* SADB_EXT_ADDRESS_DST */
  406         0,                              /* SADB_EXT_ADDRESS_PROXY */
  407         0,                              /* SADB_EXT_KEY_AUTH */
  408         0,                              /* SADB_EXT_KEY_ENCRYPT */
  409         0,                              /* SADB_EXT_IDENTITY_SRC */
  410         0,                              /* SADB_EXT_IDENTITY_DST */
  411         0,                              /* SADB_EXT_SENSITIVITY */
  412         0,                              /* SADB_EXT_PROPOSAL */
  413         0,                              /* SADB_EXT_SUPPORTED_AUTH */
  414         0,                              /* SADB_EXT_SUPPORTED_ENCRYPT */
  415         sizeof(struct sadb_spirange),   /* SADB_EXT_SPIRANGE */
  416         0,                              /* SADB_X_EXT_KMPRIVATE */
  417         0,                              /* SADB_X_EXT_POLICY */
  418         sizeof(struct sadb_x_sa2),      /* SADB_X_SA2 */
  419         sizeof(struct sadb_x_nat_t_type),/* SADB_X_EXT_NAT_T_TYPE */
  420         sizeof(struct sadb_x_nat_t_port),/* SADB_X_EXT_NAT_T_SPORT */
  421         sizeof(struct sadb_x_nat_t_port),/* SADB_X_EXT_NAT_T_DPORT */
  422         0,                              /* SADB_X_EXT_NAT_T_OAI */
  423         0,                              /* SADB_X_EXT_NAT_T_OAR */
  424         sizeof(struct sadb_x_nat_t_frag),/* SADB_X_EXT_NAT_T_FRAG */
  425         sizeof(struct sadb_x_sa_replay), /* SADB_X_EXT_SA_REPLAY */
  426         0,                              /* SADB_X_EXT_NEW_ADDRESS_SRC */
  427         0,                              /* SADB_X_EXT_NEW_ADDRESS_DST */
  428 };
  429 _Static_assert(sizeof(maxsize)/sizeof(int) == SADB_EXT_MAX + 1, "minsize size mismatch");
  430 
  431 /*
  432  * Internal values for SA flags:
  433  * SADB_X_EXT_F_CLONED means that SA was cloned by key_updateaddresses,
  434  *      thus we will not free the most of SA content in key_delsav().
  435  */
  436 #define SADB_X_EXT_F_CLONED     0x80000000
  437 
  438 #define SADB_CHECKLEN(_mhp, _ext)                       \
  439     ((_mhp)->extlen[(_ext)] < minsize[(_ext)] || (maxsize[(_ext)] != 0 && \
  440         ((_mhp)->extlen[(_ext)] > maxsize[(_ext)])))
  441 #define SADB_CHECKHDR(_mhp, _ext)       ((_mhp)->ext[(_ext)] == NULL)
  442 
  443 VNET_DEFINE_STATIC(int, ipsec_esp_keymin) = 256;
  444 VNET_DEFINE_STATIC(int, ipsec_esp_auth) = 0;
  445 VNET_DEFINE_STATIC(int, ipsec_ah_keymin) = 128;
  446 
  447 #define V_ipsec_esp_keymin      VNET(ipsec_esp_keymin)
  448 #define V_ipsec_esp_auth        VNET(ipsec_esp_auth)
  449 #define V_ipsec_ah_keymin       VNET(ipsec_ah_keymin)
  450 
  451 #ifdef IPSEC_DEBUG
  452 VNET_DEFINE(int, ipsec_debug) = 1;
  453 #else
  454 VNET_DEFINE(int, ipsec_debug) = 0;
  455 #endif
  456 
  457 #ifdef INET
  458 SYSCTL_DECL(_net_inet_ipsec);
  459 SYSCTL_INT(_net_inet_ipsec, IPSECCTL_DEBUG, debug,
  460     CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ipsec_debug), 0,
  461     "Enable IPsec debugging output when set.");
  462 #endif
  463 #ifdef INET6
  464 SYSCTL_DECL(_net_inet6_ipsec6);
  465 SYSCTL_INT(_net_inet6_ipsec6, IPSECCTL_DEBUG, debug,
  466     CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ipsec_debug), 0,
  467     "Enable IPsec debugging output when set.");
  468 #endif
  469 
  470 SYSCTL_INT(_net_key, KEYCTL_DEBUG_LEVEL,        debug,
  471         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(key_debug_level), 0, "");
  472 
  473 /* max count of trial for the decision of spi value */
  474 SYSCTL_INT(_net_key, KEYCTL_SPI_TRY, spi_trycnt,
  475         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(key_spi_trycnt), 0, "");
  476 
  477 /* minimum spi value to allocate automatically. */
  478 SYSCTL_INT(_net_key, KEYCTL_SPI_MIN_VALUE, spi_minval,
  479         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(key_spi_minval), 0, "");
  480 
  481 /* maximun spi value to allocate automatically. */
  482 SYSCTL_INT(_net_key, KEYCTL_SPI_MAX_VALUE, spi_maxval,
  483         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(key_spi_maxval), 0, "");
  484 
  485 /* interval to initialize randseed */
  486 SYSCTL_INT(_net_key, KEYCTL_RANDOM_INT, int_random,
  487         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(key_int_random), 0, "");
  488 
  489 /* lifetime for larval SA */
  490 SYSCTL_INT(_net_key, KEYCTL_LARVAL_LIFETIME, larval_lifetime,
  491         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(key_larval_lifetime), 0, "");
  492 
  493 /* counter for blocking to send SADB_ACQUIRE to IKEd */
  494 SYSCTL_INT(_net_key, KEYCTL_BLOCKACQ_COUNT, blockacq_count,
  495         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(key_blockacq_count), 0, "");
  496 
  497 /* lifetime for blocking to send SADB_ACQUIRE to IKEd */
  498 SYSCTL_INT(_net_key, KEYCTL_BLOCKACQ_LIFETIME, blockacq_lifetime,
  499         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(key_blockacq_lifetime), 0, "");
  500 
  501 /* ESP auth */
  502 SYSCTL_INT(_net_key, KEYCTL_ESP_AUTH, esp_auth,
  503         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ipsec_esp_auth), 0, "");
  504 
  505 /* minimum ESP key length */
  506 SYSCTL_INT(_net_key, KEYCTL_ESP_KEYMIN, esp_keymin,
  507         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ipsec_esp_keymin), 0, "");
  508 
  509 /* minimum AH key length */
  510 SYSCTL_INT(_net_key, KEYCTL_AH_KEYMIN, ah_keymin,
  511         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ipsec_ah_keymin), 0, "");
  512 
  513 /* perfered old SA rather than new SA */
  514 SYSCTL_INT(_net_key, KEYCTL_PREFERED_OLDSA, preferred_oldsa,
  515         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(key_preferred_oldsa), 0, "");
  516 
  517 SYSCTL_NODE(_net_key, OID_AUTO, spdcache, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
  518     "SPD cache");
  519 
  520 SYSCTL_UINT(_net_key_spdcache, OID_AUTO, maxentries,
  521         CTLFLAG_VNET | CTLFLAG_RDTUN, &VNET_NAME(key_spdcache_maxentries), 0,
  522         "Maximum number of entries in the SPD cache"
  523         " (power of 2, 0 to disable)");
  524 
  525 SYSCTL_UINT(_net_key_spdcache, OID_AUTO, threshold,
  526         CTLFLAG_VNET | CTLFLAG_RDTUN, &VNET_NAME(key_spdcache_threshold), 0,
  527         "Number of SPs that make the SPD cache active");
  528 
  529 #define __LIST_CHAINED(elm) \
  530         (!((elm)->chain.le_next == NULL && (elm)->chain.le_prev == NULL))
  531 
  532 MALLOC_DEFINE(M_IPSEC_SA, "secasvar", "ipsec security association");
  533 MALLOC_DEFINE(M_IPSEC_SAH, "sahead", "ipsec sa head");
  534 MALLOC_DEFINE(M_IPSEC_SP, "ipsecpolicy", "ipsec security policy");
  535 MALLOC_DEFINE(M_IPSEC_SR, "ipsecrequest", "ipsec security request");
  536 MALLOC_DEFINE(M_IPSEC_MISC, "ipsec-misc", "ipsec miscellaneous");
  537 MALLOC_DEFINE(M_IPSEC_SAQ, "ipsec-saq", "ipsec sa acquire");
  538 MALLOC_DEFINE(M_IPSEC_SAR, "ipsec-reg", "ipsec sa acquire");
  539 MALLOC_DEFINE(M_IPSEC_SPDCACHE, "ipsec-spdcache", "ipsec SPD cache");
  540 
  541 static uma_zone_t __read_mostly ipsec_key_lft_zone;
  542 
  543 /*
  544  * set parameters into secpolicyindex buffer.
  545  * Must allocate secpolicyindex buffer passed to this function.
  546  */
  547 #define KEY_SETSECSPIDX(_dir, s, d, ps, pd, ulp, idx) \
  548 do { \
  549         bzero((idx), sizeof(struct secpolicyindex));                         \
  550         (idx)->dir = (_dir);                                                 \
  551         (idx)->prefs = (ps);                                                 \
  552         (idx)->prefd = (pd);                                                 \
  553         (idx)->ul_proto = (ulp);                                             \
  554         bcopy((s), &(idx)->src, ((const struct sockaddr *)(s))->sa_len);     \
  555         bcopy((d), &(idx)->dst, ((const struct sockaddr *)(d))->sa_len);     \
  556 } while (0)
  557 
  558 /*
  559  * set parameters into secasindex buffer.
  560  * Must allocate secasindex buffer before calling this function.
  561  */
  562 #define KEY_SETSECASIDX(p, m, r, s, d, idx) \
  563 do { \
  564         bzero((idx), sizeof(struct secasindex));                             \
  565         (idx)->proto = (p);                                                  \
  566         (idx)->mode = (m);                                                   \
  567         (idx)->reqid = (r);                                                  \
  568         bcopy((s), &(idx)->src, ((const struct sockaddr *)(s))->sa_len);     \
  569         bcopy((d), &(idx)->dst, ((const struct sockaddr *)(d))->sa_len);     \
  570         key_porttosaddr(&(idx)->src.sa, 0);                                  \
  571         key_porttosaddr(&(idx)->dst.sa, 0);                                  \
  572 } while (0)
  573 
  574 /* key statistics */
  575 struct _keystat {
  576         u_long getspi_count; /* the avarage of count to try to get new SPI */
  577 } keystat;
  578 
  579 struct sadb_msghdr {
  580         struct sadb_msg *msg;
  581         struct sadb_ext *ext[SADB_EXT_MAX + 1];
  582         int extoff[SADB_EXT_MAX + 1];
  583         int extlen[SADB_EXT_MAX + 1];
  584 };
  585 
  586 static struct supported_ealgs {
  587         int sadb_alg;
  588         const struct enc_xform *xform;
  589 } supported_ealgs[] = {
  590         { SADB_X_EALG_AES,              &enc_xform_aes_cbc },
  591         { SADB_EALG_NULL,               &enc_xform_null },
  592         { SADB_X_EALG_AESCTR,           &enc_xform_aes_icm },
  593         { SADB_X_EALG_AESGCM16,         &enc_xform_aes_nist_gcm },
  594         { SADB_X_EALG_AESGMAC,          &enc_xform_aes_nist_gmac },
  595         { SADB_X_EALG_CHACHA20POLY1305, &enc_xform_chacha20_poly1305 },
  596 };
  597 
  598 static struct supported_aalgs {
  599         int sadb_alg;
  600         const struct auth_hash *xform;
  601 } supported_aalgs[] = {
  602         { SADB_X_AALG_NULL,             &auth_hash_null },
  603         { SADB_AALG_SHA1HMAC,           &auth_hash_hmac_sha1 },
  604         { SADB_X_AALG_SHA2_256,         &auth_hash_hmac_sha2_256 },
  605         { SADB_X_AALG_SHA2_384,         &auth_hash_hmac_sha2_384 },
  606         { SADB_X_AALG_SHA2_512,         &auth_hash_hmac_sha2_512 },
  607         { SADB_X_AALG_AES128GMAC,       &auth_hash_nist_gmac_aes_128 },
  608         { SADB_X_AALG_AES192GMAC,       &auth_hash_nist_gmac_aes_192 },
  609         { SADB_X_AALG_AES256GMAC,       &auth_hash_nist_gmac_aes_256 },
  610         { SADB_X_AALG_CHACHA20POLY1305, &auth_hash_poly1305 },
  611 };
  612 
  613 static struct supported_calgs {
  614         int sadb_alg;
  615         const struct comp_algo *xform;
  616 } supported_calgs[] = {
  617         { SADB_X_CALG_DEFLATE,          &comp_algo_deflate },
  618 };
  619 
  620 #ifndef IPSEC_DEBUG2
  621 static struct callout key_timer;
  622 #endif
  623 
  624 static void key_unlink(struct secpolicy *);
  625 static void key_detach(struct secpolicy *);
  626 static struct secpolicy *key_do_allocsp(struct secpolicyindex *spidx, u_int dir);
  627 static struct secpolicy *key_getsp(struct secpolicyindex *);
  628 static struct secpolicy *key_getspbyid(u_int32_t);
  629 static struct mbuf *key_gather_mbuf(struct mbuf *,
  630         const struct sadb_msghdr *, int, int, ...);
  631 static int key_spdadd(struct socket *, struct mbuf *,
  632         const struct sadb_msghdr *);
  633 static uint32_t key_getnewspid(void);
  634 static int key_spddelete(struct socket *, struct mbuf *,
  635         const struct sadb_msghdr *);
  636 static int key_spddelete2(struct socket *, struct mbuf *,
  637         const struct sadb_msghdr *);
  638 static int key_spdget(struct socket *, struct mbuf *,
  639         const struct sadb_msghdr *);
  640 static int key_spdflush(struct socket *, struct mbuf *,
  641         const struct sadb_msghdr *);
  642 static int key_spddump(struct socket *, struct mbuf *,
  643         const struct sadb_msghdr *);
  644 static struct mbuf *key_setdumpsp(struct secpolicy *,
  645         u_int8_t, u_int32_t, u_int32_t);
  646 static struct mbuf *key_sp2mbuf(struct secpolicy *);
  647 static size_t key_getspreqmsglen(struct secpolicy *);
  648 static int key_spdexpire(struct secpolicy *);
  649 static struct secashead *key_newsah(struct secasindex *);
  650 static void key_freesah(struct secashead **);
  651 static void key_delsah(struct secashead *);
  652 static struct secasvar *key_newsav(const struct sadb_msghdr *,
  653     struct secasindex *, uint32_t, int *);
  654 static void key_delsav(struct secasvar *);
  655 static void key_unlinksav(struct secasvar *);
  656 static struct secashead *key_getsah(struct secasindex *);
  657 static int key_checkspidup(uint32_t);
  658 static struct secasvar *key_getsavbyspi(uint32_t);
  659 static int key_setnatt(struct secasvar *, const struct sadb_msghdr *);
  660 static int key_setsaval(struct secasvar *, const struct sadb_msghdr *);
  661 static int key_updatelifetimes(struct secasvar *, const struct sadb_msghdr *);
  662 static int key_updateaddresses(struct socket *, struct mbuf *,
  663     const struct sadb_msghdr *, struct secasvar *, struct secasindex *);
  664 
  665 static struct mbuf *key_setdumpsa(struct secasvar *, u_int8_t,
  666         u_int8_t, u_int32_t, u_int32_t);
  667 static struct mbuf *key_setsadbmsg(u_int8_t, u_int16_t, u_int8_t,
  668         u_int32_t, pid_t, u_int16_t);
  669 static struct mbuf *key_setsadbsa(struct secasvar *);
  670 static struct mbuf *key_setsadbaddr(u_int16_t,
  671         const struct sockaddr *, u_int8_t, u_int16_t);
  672 static struct mbuf *key_setsadbxport(u_int16_t, u_int16_t);
  673 static struct mbuf *key_setsadbxtype(u_int16_t);
  674 static struct mbuf *key_setsadbxsa2(u_int8_t, u_int32_t, u_int32_t);
  675 static struct mbuf *key_setsadbxsareplay(u_int32_t);
  676 static struct mbuf *key_setsadbxpolicy(u_int16_t, u_int8_t,
  677         u_int32_t, u_int32_t);
  678 static struct seckey *key_dup_keymsg(const struct sadb_key *, size_t,
  679     struct malloc_type *);
  680 static struct seclifetime *key_dup_lifemsg(const struct sadb_lifetime *src,
  681     struct malloc_type *);
  682 
  683 /* flags for key_cmpsaidx() */
  684 #define CMP_HEAD        1       /* protocol, addresses. */
  685 #define CMP_MODE_REQID  2       /* additionally HEAD, reqid, mode. */
  686 #define CMP_REQID       3       /* additionally HEAD, reaid. */
  687 #define CMP_EXACTLY     4       /* all elements. */
  688 static int key_cmpsaidx(const struct secasindex *,
  689     const struct secasindex *, int);
  690 static int key_cmpspidx_exactly(struct secpolicyindex *,
  691     struct secpolicyindex *);
  692 static int key_cmpspidx_withmask(struct secpolicyindex *,
  693     struct secpolicyindex *);
  694 static int key_bbcmp(const void *, const void *, u_int);
  695 static uint8_t key_satype2proto(uint8_t);
  696 static uint8_t key_proto2satype(uint8_t);
  697 
  698 static int key_getspi(struct socket *, struct mbuf *,
  699         const struct sadb_msghdr *);
  700 static uint32_t key_do_getnewspi(struct sadb_spirange *, struct secasindex *);
  701 static int key_update(struct socket *, struct mbuf *,
  702         const struct sadb_msghdr *);
  703 static int key_add(struct socket *, struct mbuf *,
  704         const struct sadb_msghdr *);
  705 static int key_setident(struct secashead *, const struct sadb_msghdr *);
  706 static struct mbuf *key_getmsgbuf_x1(struct mbuf *,
  707         const struct sadb_msghdr *);
  708 static int key_delete(struct socket *, struct mbuf *,
  709         const struct sadb_msghdr *);
  710 static int key_delete_all(struct socket *, struct mbuf *,
  711         const struct sadb_msghdr *, struct secasindex *);
  712 static int key_get(struct socket *, struct mbuf *,
  713         const struct sadb_msghdr *);
  714 
  715 static void key_getcomb_setlifetime(struct sadb_comb *);
  716 static struct mbuf *key_getcomb_ealg(void);
  717 static struct mbuf *key_getcomb_ah(void);
  718 static struct mbuf *key_getcomb_ipcomp(void);
  719 static struct mbuf *key_getprop(const struct secasindex *);
  720 
  721 static int key_acquire(const struct secasindex *, struct secpolicy *);
  722 static uint32_t key_newacq(const struct secasindex *, int *);
  723 static uint32_t key_getacq(const struct secasindex *, int *);
  724 static int key_acqdone(const struct secasindex *, uint32_t);
  725 static int key_acqreset(uint32_t);
  726 static struct secspacq *key_newspacq(struct secpolicyindex *);
  727 static struct secspacq *key_getspacq(struct secpolicyindex *);
  728 static int key_acquire2(struct socket *, struct mbuf *,
  729         const struct sadb_msghdr *);
  730 static int key_register(struct socket *, struct mbuf *,
  731         const struct sadb_msghdr *);
  732 static int key_expire(struct secasvar *, int);
  733 static int key_flush(struct socket *, struct mbuf *,
  734         const struct sadb_msghdr *);
  735 static int key_dump(struct socket *, struct mbuf *,
  736         const struct sadb_msghdr *);
  737 static int key_promisc(struct socket *, struct mbuf *,
  738         const struct sadb_msghdr *);
  739 static int key_senderror(struct socket *, struct mbuf *, int);
  740 static int key_validate_ext(const struct sadb_ext *, int);
  741 static int key_align(struct mbuf *, struct sadb_msghdr *);
  742 static struct mbuf *key_setlifetime(struct seclifetime *, uint16_t);
  743 static struct mbuf *key_setkey(struct seckey *, uint16_t);
  744 
  745 static void spdcache_init(void);
  746 static void spdcache_clear(void);
  747 static struct spdcache_entry *spdcache_entry_alloc(
  748         const struct secpolicyindex *spidx,
  749         struct secpolicy *policy);
  750 static void spdcache_entry_free(struct spdcache_entry *entry);
  751 #ifdef VIMAGE
  752 static void spdcache_destroy(void);
  753 #endif
  754 
  755 #define DBG_IPSEC_INITREF(t, p) do {                            \
  756         refcount_init(&(p)->refcnt, 1);                         \
  757         KEYDBG(KEY_STAMP,                                       \
  758             printf("%s: Initialize refcnt %s(%p) = %u\n",       \
  759             __func__, #t, (p), (p)->refcnt));                   \
  760 } while (0)
  761 #define DBG_IPSEC_ADDREF(t, p)  do {                            \
  762         refcount_acquire(&(p)->refcnt);                         \
  763         KEYDBG(KEY_STAMP,                                       \
  764             printf("%s: Acquire refcnt %s(%p) -> %u\n",         \
  765             __func__, #t, (p), (p)->refcnt));                   \
  766 } while (0)
  767 #define DBG_IPSEC_DELREF(t, p)  do {                            \
  768         KEYDBG(KEY_STAMP,                                       \
  769             printf("%s: Release refcnt %s(%p) -> %u\n",         \
  770             __func__, #t, (p), (p)->refcnt - 1));               \
  771         refcount_release(&(p)->refcnt);                         \
  772 } while (0)
  773 
  774 #define IPSEC_INITREF(t, p)     refcount_init(&(p)->refcnt, 1)
  775 #define IPSEC_ADDREF(t, p)      refcount_acquire(&(p)->refcnt)
  776 #define IPSEC_DELREF(t, p)      refcount_release(&(p)->refcnt)
  777 
  778 #define SP_INITREF(p)   IPSEC_INITREF(SP, p)
  779 #define SP_ADDREF(p)    IPSEC_ADDREF(SP, p)
  780 #define SP_DELREF(p)    IPSEC_DELREF(SP, p)
  781 
  782 #define SAH_INITREF(p)  IPSEC_INITREF(SAH, p)
  783 #define SAH_ADDREF(p)   IPSEC_ADDREF(SAH, p)
  784 #define SAH_DELREF(p)   IPSEC_DELREF(SAH, p)
  785 
  786 #define SAV_INITREF(p)  IPSEC_INITREF(SAV, p)
  787 #define SAV_ADDREF(p)   IPSEC_ADDREF(SAV, p)
  788 #define SAV_DELREF(p)   IPSEC_DELREF(SAV, p)
  789 
  790 /*
  791  * Update the refcnt while holding the SPTREE lock.
  792  */
  793 void
  794 key_addref(struct secpolicy *sp)
  795 {
  796 
  797         SP_ADDREF(sp);
  798 }
  799 
  800 /*
  801  * Return 0 when there are known to be no SP's for the specified
  802  * direction.  Otherwise return 1.  This is used by IPsec code
  803  * to optimize performance.
  804  */
  805 int
  806 key_havesp(u_int dir)
  807 {
  808 
  809         IPSEC_ASSERT(dir == IPSEC_DIR_INBOUND || dir == IPSEC_DIR_OUTBOUND,
  810                 ("invalid direction %u", dir));
  811         return (TAILQ_FIRST(&V_sptree[dir]) != NULL);
  812 }
  813 
  814 int
  815 key_havesp_any(void)
  816 {
  817 
  818         return (V_spd_size != 0);
  819 }
  820 
  821 /*
  822  * Allocate a single mbuf with a buffer of the desired length.  The buffer is
  823  * pre-zeroed to help ensure that uninitialized pad bytes are not leaked.
  824  */
  825 static struct mbuf *
  826 key_mget(u_int len)
  827 {
  828         struct mbuf *m;
  829 
  830         KASSERT(len <= MCLBYTES,
  831             ("%s: invalid buffer length %u", __func__, len));
  832 
  833         m = m_get2(len, M_NOWAIT, MT_DATA, M_PKTHDR);
  834         if (m == NULL)
  835                 return (NULL);
  836         memset(mtod(m, void *), 0, len);
  837         return (m);
  838 }
  839 
  840 /* %%% IPsec policy management */
  841 /*
  842  * Return current SPDB generation.
  843  */
  844 uint32_t
  845 key_getspgen(void)
  846 {
  847 
  848         return (V_sp_genid);
  849 }
  850 
  851 void
  852 key_bumpspgen(void)
  853 {
  854 
  855         V_sp_genid++;
  856 }
  857 
  858 static int
  859 key_checksockaddrs(struct sockaddr *src, struct sockaddr *dst)
  860 {
  861 
  862         /* family match */
  863         if (src->sa_family != dst->sa_family)
  864                 return (EINVAL);
  865         /* sa_len match */
  866         if (src->sa_len != dst->sa_len)
  867                 return (EINVAL);
  868         switch (src->sa_family) {
  869 #ifdef INET
  870         case AF_INET:
  871                 if (src->sa_len != sizeof(struct sockaddr_in))
  872                         return (EINVAL);
  873                 break;
  874 #endif
  875 #ifdef INET6
  876         case AF_INET6:
  877                 if (src->sa_len != sizeof(struct sockaddr_in6))
  878                         return (EINVAL);
  879                 break;
  880 #endif
  881         default:
  882                 return (EAFNOSUPPORT);
  883         }
  884         return (0);
  885 }
  886 
  887 struct secpolicy *
  888 key_do_allocsp(struct secpolicyindex *spidx, u_int dir)
  889 {
  890         SPTREE_RLOCK_TRACKER;
  891         struct secpolicy *sp;
  892 
  893         IPSEC_ASSERT(spidx != NULL, ("null spidx"));
  894         IPSEC_ASSERT(dir == IPSEC_DIR_INBOUND || dir == IPSEC_DIR_OUTBOUND,
  895                 ("invalid direction %u", dir));
  896 
  897         SPTREE_RLOCK();
  898         TAILQ_FOREACH(sp, &V_sptree[dir], chain) {
  899                 if (key_cmpspidx_withmask(&sp->spidx, spidx)) {
  900                         SP_ADDREF(sp);
  901                         break;
  902                 }
  903         }
  904         SPTREE_RUNLOCK();
  905         return (sp);
  906 }
  907 
  908 /*
  909  * allocating a SP for OUTBOUND or INBOUND packet.
  910  * Must call key_freesp() later.
  911  * OUT: NULL:   not found
  912  *      others: found and return the pointer.
  913  */
  914 struct secpolicy *
  915 key_allocsp(struct secpolicyindex *spidx, u_int dir)
  916 {
  917         struct spdcache_entry *entry, *lastentry, *tmpentry;
  918         struct secpolicy *sp;
  919         uint32_t hashv;
  920         int nb_entries;
  921 
  922         if (!SPDCACHE_ACTIVE()) {
  923                 sp = key_do_allocsp(spidx, dir);
  924                 goto out;
  925         }
  926 
  927         hashv = SPDCACHE_HASHVAL(spidx);
  928         SPDCACHE_LOCK(hashv);
  929         nb_entries = 0;
  930         LIST_FOREACH_SAFE(entry, &V_spdcachehashtbl[hashv], chain, tmpentry) {
  931                 /* Removed outdated entries */
  932                 if (entry->sp != NULL &&
  933                     entry->sp->state == IPSEC_SPSTATE_DEAD) {
  934                         LIST_REMOVE(entry, chain);
  935                         spdcache_entry_free(entry);
  936                         continue;
  937                 }
  938 
  939                 nb_entries++;
  940                 if (!key_cmpspidx_exactly(&entry->spidx, spidx)) {
  941                         lastentry = entry;
  942                         continue;
  943                 }
  944 
  945                 sp = entry->sp;
  946                 if (entry->sp != NULL)
  947                         SP_ADDREF(sp);
  948 
  949                 /* IPSECSTAT_INC(ips_spdcache_hits); */
  950 
  951                 SPDCACHE_UNLOCK(hashv);
  952                 goto out;
  953         }
  954 
  955         /* IPSECSTAT_INC(ips_spdcache_misses); */
  956 
  957         sp = key_do_allocsp(spidx, dir);
  958         entry = spdcache_entry_alloc(spidx, sp);
  959         if (entry != NULL) {
  960                 if (nb_entries >= SPDCACHE_MAX_ENTRIES_PER_HASH) {
  961                         LIST_REMOVE(lastentry, chain);
  962                         spdcache_entry_free(lastentry);
  963                 }
  964 
  965                 LIST_INSERT_HEAD(&V_spdcachehashtbl[hashv], entry, chain);
  966         }
  967 
  968         SPDCACHE_UNLOCK(hashv);
  969 
  970 out:
  971         if (sp != NULL) {       /* found a SPD entry */
  972                 sp->lastused = time_second;
  973                 KEYDBG(IPSEC_STAMP,
  974                     printf("%s: return SP(%p)\n", __func__, sp));
  975                 KEYDBG(IPSEC_DATA, kdebug_secpolicy(sp));
  976         } else {
  977                 KEYDBG(IPSEC_DATA,
  978                     printf("%s: lookup failed for ", __func__);
  979                     kdebug_secpolicyindex(spidx, NULL));
  980         }
  981         return (sp);
  982 }
  983 
  984 /*
  985  * Allocating an SA entry for an *INBOUND* or *OUTBOUND* TCP packet, signed
  986  * or should be signed by MD5 signature.
  987  * We don't use key_allocsa() for such lookups, because we don't know SPI.
  988  * Unlike ESP and AH protocols, SPI isn't transmitted in the TCP header with
  989  * signed packet. We use SADB only as storage for password.
  990  * OUT: positive:       corresponding SA for given saidx found.
  991  *      NULL:           SA not found
  992  */
  993 struct secasvar *
  994 key_allocsa_tcpmd5(struct secasindex *saidx)
  995 {
  996         SAHTREE_RLOCK_TRACKER;
  997         struct secashead *sah;
  998         struct secasvar *sav;
  999 
 1000         IPSEC_ASSERT(saidx->proto == IPPROTO_TCP,
 1001             ("unexpected security protocol %u", saidx->proto));
 1002         IPSEC_ASSERT(saidx->mode == IPSEC_MODE_TCPMD5,
 1003             ("unexpected mode %u", saidx->mode));
 1004 
 1005         SAHTREE_RLOCK();
 1006         LIST_FOREACH(sah, SAHADDRHASH_HASH(saidx), addrhash) {
 1007                 KEYDBG(IPSEC_DUMP,
 1008                     printf("%s: checking SAH\n", __func__);
 1009                     kdebug_secash(sah, "  "));
 1010                 if (sah->saidx.proto != IPPROTO_TCP)
 1011                         continue;
 1012                 if (!key_sockaddrcmp(&saidx->dst.sa, &sah->saidx.dst.sa, 0) &&
 1013                     !key_sockaddrcmp(&saidx->src.sa, &sah->saidx.src.sa, 0))
 1014                         break;
 1015         }
 1016         if (sah != NULL) {
 1017                 if (V_key_preferred_oldsa)
 1018                         sav = TAILQ_LAST(&sah->savtree_alive, secasvar_queue);
 1019                 else
 1020                         sav = TAILQ_FIRST(&sah->savtree_alive);
 1021                 if (sav != NULL)
 1022                         SAV_ADDREF(sav);
 1023         } else
 1024                 sav = NULL;
 1025         SAHTREE_RUNLOCK();
 1026 
 1027         if (sav != NULL) {
 1028                 KEYDBG(IPSEC_STAMP,
 1029                     printf("%s: return SA(%p)\n", __func__, sav));
 1030                 KEYDBG(IPSEC_DATA, kdebug_secasv(sav));
 1031         } else {
 1032                 KEYDBG(IPSEC_STAMP,
 1033                     printf("%s: SA not found\n", __func__));
 1034                 KEYDBG(IPSEC_DATA, kdebug_secasindex(saidx, NULL));
 1035         }
 1036         return (sav);
 1037 }
 1038 
 1039 /*
 1040  * Allocating an SA entry for an *OUTBOUND* packet.
 1041  * OUT: positive:       corresponding SA for given saidx found.
 1042  *      NULL:           SA not found, but will be acquired, check *error
 1043  *                      for acquiring status.
 1044  */
 1045 struct secasvar *
 1046 key_allocsa_policy(struct secpolicy *sp, const struct secasindex *saidx,
 1047     int *error)
 1048 {
 1049         SAHTREE_RLOCK_TRACKER;
 1050         struct secashead *sah;
 1051         struct secasvar *sav;
 1052 
 1053         IPSEC_ASSERT(saidx != NULL, ("null saidx"));
 1054         IPSEC_ASSERT(saidx->mode == IPSEC_MODE_TRANSPORT ||
 1055                 saidx->mode == IPSEC_MODE_TUNNEL,
 1056                 ("unexpected policy %u", saidx->mode));
 1057 
 1058         /*
 1059          * We check new SA in the IPsec request because a different
 1060          * SA may be involved each time this request is checked, either
 1061          * because new SAs are being configured, or this request is
 1062          * associated with an unconnected datagram socket, or this request
 1063          * is associated with a system default policy.
 1064          */
 1065         SAHTREE_RLOCK();
 1066         LIST_FOREACH(sah, SAHADDRHASH_HASH(saidx), addrhash) {
 1067                 KEYDBG(IPSEC_DUMP,
 1068                     printf("%s: checking SAH\n", __func__);
 1069                     kdebug_secash(sah, "  "));
 1070                 if (key_cmpsaidx(&sah->saidx, saidx, CMP_MODE_REQID))
 1071                         break;
 1072         }
 1073         if (sah != NULL) {
 1074                 /*
 1075                  * Allocate the oldest SA available according to
 1076                  * draft-jenkins-ipsec-rekeying-03.
 1077                  */
 1078                 if (V_key_preferred_oldsa)
 1079                         sav = TAILQ_LAST(&sah->savtree_alive, secasvar_queue);
 1080                 else
 1081                         sav = TAILQ_FIRST(&sah->savtree_alive);
 1082                 if (sav != NULL)
 1083                         SAV_ADDREF(sav);
 1084         } else
 1085                 sav = NULL;
 1086         SAHTREE_RUNLOCK();
 1087 
 1088         if (sav != NULL) {
 1089                 *error = 0;
 1090                 KEYDBG(IPSEC_STAMP,
 1091                     printf("%s: chosen SA(%p) for SP(%p)\n", __func__,
 1092                         sav, sp));
 1093                 KEYDBG(IPSEC_DATA, kdebug_secasv(sav));
 1094                 return (sav); /* return referenced SA */
 1095         }
 1096 
 1097         /* there is no SA */
 1098         *error = key_acquire(saidx, sp);
 1099         if ((*error) != 0)
 1100                 ipseclog((LOG_DEBUG,
 1101                     "%s: error %d returned from key_acquire()\n",
 1102                         __func__, *error));
 1103         KEYDBG(IPSEC_STAMP,
 1104             printf("%s: acquire SA for SP(%p), error %d\n",
 1105                 __func__, sp, *error));
 1106         KEYDBG(IPSEC_DATA, kdebug_secasindex(saidx, NULL));
 1107         return (NULL);
 1108 }
 1109 
 1110 /*
 1111  * allocating a usable SA entry for a *INBOUND* packet.
 1112  * Must call key_freesav() later.
 1113  * OUT: positive:       pointer to a usable sav (i.e. MATURE or DYING state).
 1114  *      NULL:           not found, or error occurred.
 1115  *
 1116  * According to RFC 2401 SA is uniquely identified by a triple SPI,
 1117  * destination address, and security protocol. But according to RFC 4301,
 1118  * SPI by itself suffices to specify an SA.
 1119  *
 1120  * Note that, however, we do need to keep source address in IPsec SA.
 1121  * IKE specification and PF_KEY specification do assume that we
 1122  * keep source address in IPsec SA.  We see a tricky situation here.
 1123  */
 1124 struct secasvar *
 1125 key_allocsa(union sockaddr_union *dst, uint8_t proto, uint32_t spi)
 1126 {
 1127         SAHTREE_RLOCK_TRACKER;
 1128         struct secasvar *sav;
 1129 
 1130         IPSEC_ASSERT(proto == IPPROTO_ESP || proto == IPPROTO_AH ||
 1131             proto == IPPROTO_IPCOMP, ("unexpected security protocol %u",
 1132             proto));
 1133 
 1134         SAHTREE_RLOCK();
 1135         LIST_FOREACH(sav, SAVHASH_HASH(spi), spihash) {
 1136                 if (sav->spi == spi)
 1137                         break;
 1138         }
 1139         /*
 1140          * We use single SPI namespace for all protocols, so it is
 1141          * impossible to have SPI duplicates in the SAVHASH.
 1142          */
 1143         if (sav != NULL) {
 1144                 if (sav->state != SADB_SASTATE_LARVAL &&
 1145                     sav->sah->saidx.proto == proto &&
 1146                     key_sockaddrcmp(&dst->sa,
 1147                         &sav->sah->saidx.dst.sa, 0) == 0)
 1148                         SAV_ADDREF(sav);
 1149                 else
 1150                         sav = NULL;
 1151         }
 1152         SAHTREE_RUNLOCK();
 1153 
 1154         if (sav == NULL) {
 1155                 KEYDBG(IPSEC_STAMP,
 1156                     char buf[IPSEC_ADDRSTRLEN];
 1157                     printf("%s: SA not found for spi %u proto %u dst %s\n",
 1158                         __func__, ntohl(spi), proto, ipsec_address(dst, buf,
 1159                         sizeof(buf))));
 1160         } else {
 1161                 KEYDBG(IPSEC_STAMP,
 1162                     printf("%s: return SA(%p)\n", __func__, sav));
 1163                 KEYDBG(IPSEC_DATA, kdebug_secasv(sav));
 1164         }
 1165         return (sav);
 1166 }
 1167 
 1168 struct secasvar *
 1169 key_allocsa_tunnel(union sockaddr_union *src, union sockaddr_union *dst,
 1170     uint8_t proto)
 1171 {
 1172         SAHTREE_RLOCK_TRACKER;
 1173         struct secasindex saidx;
 1174         struct secashead *sah;
 1175         struct secasvar *sav;
 1176 
 1177         IPSEC_ASSERT(src != NULL, ("null src address"));
 1178         IPSEC_ASSERT(dst != NULL, ("null dst address"));
 1179 
 1180         KEY_SETSECASIDX(proto, IPSEC_MODE_TUNNEL, 0, &src->sa,
 1181             &dst->sa, &saidx);
 1182 
 1183         sav = NULL;
 1184         SAHTREE_RLOCK();
 1185         LIST_FOREACH(sah, SAHADDRHASH_HASH(&saidx), addrhash) {
 1186                 if (IPSEC_MODE_TUNNEL != sah->saidx.mode)
 1187                         continue;
 1188                 if (proto != sah->saidx.proto)
 1189                         continue;
 1190                 if (key_sockaddrcmp(&src->sa, &sah->saidx.src.sa, 0) != 0)
 1191                         continue;
 1192                 if (key_sockaddrcmp(&dst->sa, &sah->saidx.dst.sa, 0) != 0)
 1193                         continue;
 1194                 /* XXXAE: is key_preferred_oldsa reasonably?*/
 1195                 if (V_key_preferred_oldsa)
 1196                         sav = TAILQ_LAST(&sah->savtree_alive, secasvar_queue);
 1197                 else
 1198                         sav = TAILQ_FIRST(&sah->savtree_alive);
 1199                 if (sav != NULL) {
 1200                         SAV_ADDREF(sav);
 1201                         break;
 1202                 }
 1203         }
 1204         SAHTREE_RUNLOCK();
 1205         KEYDBG(IPSEC_STAMP,
 1206             printf("%s: return SA(%p)\n", __func__, sav));
 1207         if (sav != NULL)
 1208                 KEYDBG(IPSEC_DATA, kdebug_secasv(sav));
 1209         return (sav);
 1210 }
 1211 
 1212 /*
 1213  * Must be called after calling key_allocsp().
 1214  */
 1215 void
 1216 key_freesp(struct secpolicy **spp)
 1217 {
 1218         struct secpolicy *sp = *spp;
 1219 
 1220         IPSEC_ASSERT(sp != NULL, ("null sp"));
 1221         if (SP_DELREF(sp) == 0)
 1222                 return;
 1223 
 1224         KEYDBG(IPSEC_STAMP,
 1225             printf("%s: last reference to SP(%p)\n", __func__, sp));
 1226         KEYDBG(IPSEC_DATA, kdebug_secpolicy(sp));
 1227 
 1228         *spp = NULL;
 1229         while (sp->tcount > 0)
 1230                 ipsec_delisr(sp->req[--sp->tcount]);
 1231         free(sp, M_IPSEC_SP);
 1232 }
 1233 
 1234 static void
 1235 key_unlink(struct secpolicy *sp)
 1236 {
 1237         SPTREE_WLOCK();
 1238         key_detach(sp);
 1239         SPTREE_WUNLOCK();
 1240         if (SPDCACHE_ENABLED())
 1241                 spdcache_clear();
 1242         key_freesp(&sp);
 1243 }
 1244 
 1245 static void
 1246 key_detach(struct secpolicy *sp)
 1247 {
 1248         IPSEC_ASSERT(sp->spidx.dir == IPSEC_DIR_INBOUND ||
 1249             sp->spidx.dir == IPSEC_DIR_OUTBOUND,
 1250             ("invalid direction %u", sp->spidx.dir));
 1251         SPTREE_WLOCK_ASSERT();
 1252 
 1253         KEYDBG(KEY_STAMP,
 1254             printf("%s: SP(%p)\n", __func__, sp));
 1255         if (sp->state != IPSEC_SPSTATE_ALIVE) {
 1256                 /* SP is already unlinked */
 1257                 return;
 1258         }
 1259         sp->state = IPSEC_SPSTATE_DEAD;
 1260         TAILQ_REMOVE(&V_sptree[sp->spidx.dir], sp, chain);
 1261         V_spd_size--;
 1262         LIST_REMOVE(sp, idhash);
 1263         V_sp_genid++;
 1264 }
 1265 
 1266 /*
 1267  * insert a secpolicy into the SP database. Lower priorities first
 1268  */
 1269 static void
 1270 key_insertsp(struct secpolicy *newsp)
 1271 {
 1272         struct secpolicy *sp;
 1273 
 1274         SPTREE_WLOCK_ASSERT();
 1275         TAILQ_FOREACH(sp, &V_sptree[newsp->spidx.dir], chain) {
 1276                 if (newsp->priority < sp->priority) {
 1277                         TAILQ_INSERT_BEFORE(sp, newsp, chain);
 1278                         goto done;
 1279                 }
 1280         }
 1281         TAILQ_INSERT_TAIL(&V_sptree[newsp->spidx.dir], newsp, chain);
 1282 done:
 1283         LIST_INSERT_HEAD(SPHASH_HASH(newsp->id), newsp, idhash);
 1284         newsp->state = IPSEC_SPSTATE_ALIVE;
 1285         V_spd_size++;
 1286         V_sp_genid++;
 1287 }
 1288 
 1289 /*
 1290  * Insert a bunch of VTI secpolicies into the SPDB.
 1291  * We keep VTI policies in the separate list due to following reasons:
 1292  * 1) they should be immutable to user's or some deamon's attempts to
 1293  *    delete. The only way delete such policies - destroy or unconfigure
 1294  *    corresponding virtual inteface.
 1295  * 2) such policies have traffic selector that matches all traffic per
 1296  *    address family.
 1297  * Since all VTI policies have the same priority, we don't care about
 1298  * policies order.
 1299  */
 1300 int
 1301 key_register_ifnet(struct secpolicy **spp, u_int count)
 1302 {
 1303         struct mbuf *m;
 1304         u_int i;
 1305 
 1306         SPTREE_WLOCK();
 1307         /*
 1308          * First of try to acquire id for each SP.
 1309          */
 1310         for (i = 0; i < count; i++) {
 1311                 IPSEC_ASSERT(spp[i]->spidx.dir == IPSEC_DIR_INBOUND ||
 1312                     spp[i]->spidx.dir == IPSEC_DIR_OUTBOUND,
 1313                     ("invalid direction %u", spp[i]->spidx.dir));
 1314 
 1315                 if ((spp[i]->id = key_getnewspid()) == 0) {
 1316                         SPTREE_WUNLOCK();
 1317                         return (EAGAIN);
 1318                 }
 1319         }
 1320         for (i = 0; i < count; i++) {
 1321                 TAILQ_INSERT_TAIL(&V_sptree_ifnet[spp[i]->spidx.dir],
 1322                     spp[i], chain);
 1323                 /*
 1324                  * NOTE: despite the fact that we keep VTI SP in the
 1325                  * separate list, SPHASH contains policies from both
 1326                  * sources. Thus SADB_X_SPDGET will correctly return
 1327                  * SP by id, because it uses SPHASH for lookups.
 1328                  */
 1329                 LIST_INSERT_HEAD(SPHASH_HASH(spp[i]->id), spp[i], idhash);
 1330                 spp[i]->state = IPSEC_SPSTATE_IFNET;
 1331         }
 1332         SPTREE_WUNLOCK();
 1333         /*
 1334          * Notify user processes about new SP.
 1335          */
 1336         for (i = 0; i < count; i++) {
 1337                 m = key_setdumpsp(spp[i], SADB_X_SPDADD, 0, 0);
 1338                 if (m != NULL)
 1339                         key_sendup_mbuf(NULL, m, KEY_SENDUP_ALL);
 1340         }
 1341         return (0);
 1342 }
 1343 
 1344 void
 1345 key_unregister_ifnet(struct secpolicy **spp, u_int count)
 1346 {
 1347         struct mbuf *m;
 1348         u_int i;
 1349 
 1350         SPTREE_WLOCK();
 1351         for (i = 0; i < count; i++) {
 1352                 IPSEC_ASSERT(spp[i]->spidx.dir == IPSEC_DIR_INBOUND ||
 1353                     spp[i]->spidx.dir == IPSEC_DIR_OUTBOUND,
 1354                     ("invalid direction %u", spp[i]->spidx.dir));
 1355 
 1356                 if (spp[i]->state != IPSEC_SPSTATE_IFNET)
 1357                         continue;
 1358                 spp[i]->state = IPSEC_SPSTATE_DEAD;
 1359                 TAILQ_REMOVE(&V_sptree_ifnet[spp[i]->spidx.dir],
 1360                     spp[i], chain);
 1361                 V_spd_size--;
 1362                 LIST_REMOVE(spp[i], idhash);
 1363         }
 1364         SPTREE_WUNLOCK();
 1365         if (SPDCACHE_ENABLED())
 1366                 spdcache_clear();
 1367 
 1368         for (i = 0; i < count; i++) {
 1369                 m = key_setdumpsp(spp[i], SADB_X_SPDDELETE, 0, 0);
 1370                 if (m != NULL)
 1371                         key_sendup_mbuf(NULL, m, KEY_SENDUP_ALL);
 1372         }
 1373 }
 1374 
 1375 /*
 1376  * Must be called after calling key_allocsa().
 1377  * This function is called by key_freesp() to free some SA allocated
 1378  * for a policy.
 1379  */
 1380 void
 1381 key_freesav(struct secasvar **psav)
 1382 {
 1383         struct secasvar *sav = *psav;
 1384 
 1385         IPSEC_ASSERT(sav != NULL, ("null sav"));
 1386         CURVNET_ASSERT_SET();
 1387         if (SAV_DELREF(sav) == 0)
 1388                 return;
 1389 
 1390         KEYDBG(IPSEC_STAMP,
 1391             printf("%s: last reference to SA(%p)\n", __func__, sav));
 1392 
 1393         *psav = NULL;
 1394         key_delsav(sav);
 1395 }
 1396 
 1397 /*
 1398  * Unlink SA from SAH and SPI hash under SAHTREE_WLOCK.
 1399  * Expect that SA has extra reference due to lookup.
 1400  * Release this references, also release SAH reference after unlink.
 1401  */
 1402 static void
 1403 key_unlinksav(struct secasvar *sav)
 1404 {
 1405         struct secashead *sah;
 1406 
 1407         KEYDBG(KEY_STAMP,
 1408             printf("%s: SA(%p)\n", __func__, sav));
 1409 
 1410         CURVNET_ASSERT_SET();
 1411         SAHTREE_UNLOCK_ASSERT();
 1412         SAHTREE_WLOCK();
 1413         if (sav->state == SADB_SASTATE_DEAD) {
 1414                 /* SA is already unlinked */
 1415                 SAHTREE_WUNLOCK();
 1416                 return;
 1417         }
 1418         /* Unlink from SAH */
 1419         if (sav->state == SADB_SASTATE_LARVAL)
 1420                 TAILQ_REMOVE(&sav->sah->savtree_larval, sav, chain);
 1421         else
 1422                 TAILQ_REMOVE(&sav->sah->savtree_alive, sav, chain);
 1423         /* Unlink from SPI hash */
 1424         LIST_REMOVE(sav, spihash);
 1425         sav->state = SADB_SASTATE_DEAD;
 1426         sah = sav->sah;
 1427         SAHTREE_WUNLOCK();
 1428         key_freesav(&sav);
 1429         /* Since we are unlinked, release reference to SAH */
 1430         key_freesah(&sah);
 1431 }
 1432 
 1433 /* %%% SPD management */
 1434 /*
 1435  * search SPD
 1436  * OUT: NULL    : not found
 1437  *      others  : found, pointer to a SP.
 1438  */
 1439 static struct secpolicy *
 1440 key_getsp(struct secpolicyindex *spidx)
 1441 {
 1442         SPTREE_RLOCK_TRACKER;
 1443         struct secpolicy *sp;
 1444 
 1445         IPSEC_ASSERT(spidx != NULL, ("null spidx"));
 1446 
 1447         SPTREE_RLOCK();
 1448         TAILQ_FOREACH(sp, &V_sptree[spidx->dir], chain) {
 1449                 if (key_cmpspidx_exactly(spidx, &sp->spidx)) {
 1450                         SP_ADDREF(sp);
 1451                         break;
 1452                 }
 1453         }
 1454         SPTREE_RUNLOCK();
 1455 
 1456         return sp;
 1457 }
 1458 
 1459 /*
 1460  * get SP by index.
 1461  * OUT: NULL    : not found
 1462  *      others  : found, pointer to referenced SP.
 1463  */
 1464 static struct secpolicy *
 1465 key_getspbyid(uint32_t id)
 1466 {
 1467         SPTREE_RLOCK_TRACKER;
 1468         struct secpolicy *sp;
 1469 
 1470         SPTREE_RLOCK();
 1471         LIST_FOREACH(sp, SPHASH_HASH(id), idhash) {
 1472                 if (sp->id == id) {
 1473                         SP_ADDREF(sp);
 1474                         break;
 1475                 }
 1476         }
 1477         SPTREE_RUNLOCK();
 1478         return (sp);
 1479 }
 1480 
 1481 struct secpolicy *
 1482 key_newsp(void)
 1483 {
 1484         struct secpolicy *sp;
 1485 
 1486         sp = malloc(sizeof(*sp), M_IPSEC_SP, M_NOWAIT | M_ZERO);
 1487         if (sp != NULL)
 1488                 SP_INITREF(sp);
 1489         return (sp);
 1490 }
 1491 
 1492 struct ipsecrequest *
 1493 ipsec_newisr(void)
 1494 {
 1495 
 1496         return (malloc(sizeof(struct ipsecrequest), M_IPSEC_SR,
 1497             M_NOWAIT | M_ZERO));
 1498 }
 1499 
 1500 void
 1501 ipsec_delisr(struct ipsecrequest *p)
 1502 {
 1503 
 1504         free(p, M_IPSEC_SR);
 1505 }
 1506 
 1507 /*
 1508  * create secpolicy structure from sadb_x_policy structure.
 1509  * NOTE: `state', `secpolicyindex' and 'id' in secpolicy structure
 1510  * are not set, so must be set properly later.
 1511  */
 1512 struct secpolicy *
 1513 key_msg2sp(struct sadb_x_policy *xpl0, size_t len, int *error)
 1514 {
 1515         struct secpolicy *newsp;
 1516 
 1517         IPSEC_ASSERT(xpl0 != NULL, ("null xpl0"));
 1518         IPSEC_ASSERT(len >= sizeof(*xpl0), ("policy too short: %zu", len));
 1519 
 1520         if (len != PFKEY_EXTLEN(xpl0)) {
 1521                 ipseclog((LOG_DEBUG, "%s: Invalid msg length.\n", __func__));
 1522                 *error = EINVAL;
 1523                 return NULL;
 1524         }
 1525 
 1526         if ((newsp = key_newsp()) == NULL) {
 1527                 *error = ENOBUFS;
 1528                 return NULL;
 1529         }
 1530 
 1531         newsp->spidx.dir = xpl0->sadb_x_policy_dir;
 1532         newsp->policy = xpl0->sadb_x_policy_type;
 1533         newsp->priority = xpl0->sadb_x_policy_priority;
 1534         newsp->tcount = 0;
 1535 
 1536         /* check policy */
 1537         switch (xpl0->sadb_x_policy_type) {
 1538         case IPSEC_POLICY_DISCARD:
 1539         case IPSEC_POLICY_NONE:
 1540         case IPSEC_POLICY_ENTRUST:
 1541         case IPSEC_POLICY_BYPASS:
 1542                 break;
 1543 
 1544         case IPSEC_POLICY_IPSEC:
 1545             {
 1546                 struct sadb_x_ipsecrequest *xisr;
 1547                 struct ipsecrequest *isr;
 1548                 int tlen;
 1549 
 1550                 /* validity check */
 1551                 if (PFKEY_EXTLEN(xpl0) < sizeof(*xpl0)) {
 1552                         ipseclog((LOG_DEBUG, "%s: Invalid msg length.\n",
 1553                                 __func__));
 1554                         key_freesp(&newsp);
 1555                         *error = EINVAL;
 1556                         return NULL;
 1557                 }
 1558 
 1559                 tlen = PFKEY_EXTLEN(xpl0) - sizeof(*xpl0);
 1560                 xisr = (struct sadb_x_ipsecrequest *)(xpl0 + 1);
 1561 
 1562                 while (tlen > 0) {
 1563                         /* length check */
 1564                         if (xisr->sadb_x_ipsecrequest_len < sizeof(*xisr) ||
 1565                             xisr->sadb_x_ipsecrequest_len > tlen) {
 1566                                 ipseclog((LOG_DEBUG, "%s: invalid ipsecrequest "
 1567                                         "length.\n", __func__));
 1568                                 key_freesp(&newsp);
 1569                                 *error = EINVAL;
 1570                                 return NULL;
 1571                         }
 1572 
 1573                         if (newsp->tcount >= IPSEC_MAXREQ) {
 1574                                 ipseclog((LOG_DEBUG,
 1575                                     "%s: too many ipsecrequests.\n",
 1576                                     __func__));
 1577                                 key_freesp(&newsp);
 1578                                 *error = EINVAL;
 1579                                 return (NULL);
 1580                         }
 1581 
 1582                         /* allocate request buffer */
 1583                         /* NB: data structure is zero'd */
 1584                         isr = ipsec_newisr();
 1585                         if (isr == NULL) {
 1586                                 ipseclog((LOG_DEBUG,
 1587                                     "%s: No more memory.\n", __func__));
 1588                                 key_freesp(&newsp);
 1589                                 *error = ENOBUFS;
 1590                                 return NULL;
 1591                         }
 1592 
 1593                         newsp->req[newsp->tcount++] = isr;
 1594 
 1595                         /* set values */
 1596                         switch (xisr->sadb_x_ipsecrequest_proto) {
 1597                         case IPPROTO_ESP:
 1598                         case IPPROTO_AH:
 1599                         case IPPROTO_IPCOMP:
 1600                                 break;
 1601                         default:
 1602                                 ipseclog((LOG_DEBUG,
 1603                                     "%s: invalid proto type=%u\n", __func__,
 1604                                     xisr->sadb_x_ipsecrequest_proto));
 1605                                 key_freesp(&newsp);
 1606                                 *error = EPROTONOSUPPORT;
 1607                                 return NULL;
 1608                         }
 1609                         isr->saidx.proto =
 1610                             (uint8_t)xisr->sadb_x_ipsecrequest_proto;
 1611 
 1612                         switch (xisr->sadb_x_ipsecrequest_mode) {
 1613                         case IPSEC_MODE_TRANSPORT:
 1614                         case IPSEC_MODE_TUNNEL:
 1615                                 break;
 1616                         case IPSEC_MODE_ANY:
 1617                         default:
 1618                                 ipseclog((LOG_DEBUG,
 1619                                     "%s: invalid mode=%u\n", __func__,
 1620                                     xisr->sadb_x_ipsecrequest_mode));
 1621                                 key_freesp(&newsp);
 1622                                 *error = EINVAL;
 1623                                 return NULL;
 1624                         }
 1625                         isr->saidx.mode = xisr->sadb_x_ipsecrequest_mode;
 1626 
 1627                         switch (xisr->sadb_x_ipsecrequest_level) {
 1628                         case IPSEC_LEVEL_DEFAULT:
 1629                         case IPSEC_LEVEL_USE:
 1630                         case IPSEC_LEVEL_REQUIRE:
 1631                                 break;
 1632                         case IPSEC_LEVEL_UNIQUE:
 1633                                 /* validity check */
 1634                                 /*
 1635                                  * If range violation of reqid, kernel will
 1636                                  * update it, don't refuse it.
 1637                                  */
 1638                                 if (xisr->sadb_x_ipsecrequest_reqid
 1639                                                 > IPSEC_MANUAL_REQID_MAX) {
 1640                                         ipseclog((LOG_DEBUG,
 1641                                             "%s: reqid=%d range "
 1642                                             "violation, updated by kernel.\n",
 1643                                             __func__,
 1644                                             xisr->sadb_x_ipsecrequest_reqid));
 1645                                         xisr->sadb_x_ipsecrequest_reqid = 0;
 1646                                 }
 1647 
 1648                                 /* allocate new reqid id if reqid is zero. */
 1649                                 if (xisr->sadb_x_ipsecrequest_reqid == 0) {
 1650                                         u_int32_t reqid;
 1651                                         if ((reqid = key_newreqid()) == 0) {
 1652                                                 key_freesp(&newsp);
 1653                                                 *error = ENOBUFS;
 1654                                                 return NULL;
 1655                                         }
 1656                                         isr->saidx.reqid = reqid;
 1657                                         xisr->sadb_x_ipsecrequest_reqid = reqid;
 1658                                 } else {
 1659                                 /* set it for manual keying. */
 1660                                         isr->saidx.reqid =
 1661                                             xisr->sadb_x_ipsecrequest_reqid;
 1662                                 }
 1663                                 break;
 1664 
 1665                         default:
 1666                                 ipseclog((LOG_DEBUG, "%s: invalid level=%u\n",
 1667                                         __func__,
 1668                                         xisr->sadb_x_ipsecrequest_level));
 1669                                 key_freesp(&newsp);
 1670                                 *error = EINVAL;
 1671                                 return NULL;
 1672                         }
 1673                         isr->level = xisr->sadb_x_ipsecrequest_level;
 1674 
 1675                         /* set IP addresses if there */
 1676                         if (xisr->sadb_x_ipsecrequest_len > sizeof(*xisr)) {
 1677                                 struct sockaddr *paddr;
 1678 
 1679                                 len = tlen - sizeof(*xisr);
 1680                                 paddr = (struct sockaddr *)(xisr + 1);
 1681                                 /* validity check */
 1682                                 if (len < sizeof(struct sockaddr) ||
 1683                                     len < 2 * paddr->sa_len ||
 1684                                     paddr->sa_len > sizeof(isr->saidx.src)) {
 1685                                         ipseclog((LOG_DEBUG, "%s: invalid "
 1686                                                 "request address length.\n",
 1687                                                 __func__));
 1688                                         key_freesp(&newsp);
 1689                                         *error = EINVAL;
 1690                                         return NULL;
 1691                                 }
 1692                                 /*
 1693                                  * Request length should be enough to keep
 1694                                  * source and destination addresses.
 1695                                  */
 1696                                 if (xisr->sadb_x_ipsecrequest_len <
 1697                                     sizeof(*xisr) + 2 * paddr->sa_len) {
 1698                                         ipseclog((LOG_DEBUG, "%s: invalid "
 1699                                             "ipsecrequest length.\n",
 1700                                             __func__));
 1701                                         key_freesp(&newsp);
 1702                                         *error = EINVAL;
 1703                                         return (NULL);
 1704                                 }
 1705                                 bcopy(paddr, &isr->saidx.src, paddr->sa_len);
 1706                                 paddr = (struct sockaddr *)((caddr_t)paddr +
 1707                                     paddr->sa_len);
 1708 
 1709                                 /* validity check */
 1710                                 if (paddr->sa_len !=
 1711                                     isr->saidx.src.sa.sa_len) {
 1712                                         ipseclog((LOG_DEBUG, "%s: invalid "
 1713                                                 "request address length.\n",
 1714                                                 __func__));
 1715                                         key_freesp(&newsp);
 1716                                         *error = EINVAL;
 1717                                         return NULL;
 1718                                 }
 1719                                 /* AF family should match */
 1720                                 if (paddr->sa_family !=
 1721                                     isr->saidx.src.sa.sa_family) {
 1722                                         ipseclog((LOG_DEBUG, "%s: address "
 1723                                             "family doesn't match.\n",
 1724                                                 __func__));
 1725                                         key_freesp(&newsp);
 1726                                         *error = EINVAL;
 1727                                         return (NULL);
 1728                                 }
 1729                                 bcopy(paddr, &isr->saidx.dst, paddr->sa_len);
 1730                         } else {
 1731                                 /*
 1732                                  * Addresses for TUNNEL mode requests are
 1733                                  * mandatory.
 1734                                  */
 1735                                 if (isr->saidx.mode == IPSEC_MODE_TUNNEL) {
 1736                                         ipseclog((LOG_DEBUG, "%s: missing "
 1737                                             "request addresses.\n", __func__));
 1738                                         key_freesp(&newsp);
 1739                                         *error = EINVAL;
 1740                                         return (NULL);
 1741                                 }
 1742                         }
 1743                         tlen -= xisr->sadb_x_ipsecrequest_len;
 1744 
 1745                         /* validity check */
 1746                         if (tlen < 0) {
 1747                                 ipseclog((LOG_DEBUG, "%s: becoming tlen < 0.\n",
 1748                                         __func__));
 1749                                 key_freesp(&newsp);
 1750                                 *error = EINVAL;
 1751                                 return NULL;
 1752                         }
 1753 
 1754                         xisr = (struct sadb_x_ipsecrequest *)((caddr_t)xisr
 1755                                          + xisr->sadb_x_ipsecrequest_len);
 1756                 }
 1757                 /* XXXAE: LARVAL SP */
 1758                 if (newsp->tcount < 1) {
 1759                         ipseclog((LOG_DEBUG, "%s: valid IPSEC transforms "
 1760                             "not found.\n", __func__));
 1761                         key_freesp(&newsp);
 1762                         *error = EINVAL;
 1763                         return (NULL);
 1764                 }
 1765             }
 1766                 break;
 1767         default:
 1768                 ipseclog((LOG_DEBUG, "%s: invalid policy type.\n", __func__));
 1769                 key_freesp(&newsp);
 1770                 *error = EINVAL;
 1771                 return NULL;
 1772         }
 1773 
 1774         *error = 0;
 1775         return (newsp);
 1776 }
 1777 
 1778 uint32_t
 1779 key_newreqid(void)
 1780 {
 1781         static uint32_t auto_reqid = IPSEC_MANUAL_REQID_MAX + 1;
 1782 
 1783         if (auto_reqid == ~0)
 1784                 auto_reqid = IPSEC_MANUAL_REQID_MAX + 1;
 1785         else
 1786                 auto_reqid++;
 1787 
 1788         /* XXX should be unique check */
 1789         return (auto_reqid);
 1790 }
 1791 
 1792 /*
 1793  * copy secpolicy struct to sadb_x_policy structure indicated.
 1794  */
 1795 static struct mbuf *
 1796 key_sp2mbuf(struct secpolicy *sp)
 1797 {
 1798         struct mbuf *m;
 1799         size_t tlen;
 1800 
 1801         tlen = key_getspreqmsglen(sp);
 1802         m = m_get2(tlen, M_NOWAIT, MT_DATA, 0);
 1803         if (m == NULL)
 1804                 return (NULL);
 1805         m_align(m, tlen);
 1806         m->m_len = tlen;
 1807         if (key_sp2msg(sp, m->m_data, &tlen) != 0) {
 1808                 m_freem(m);
 1809                 return (NULL);
 1810         }
 1811         return (m);
 1812 }
 1813 
 1814 int
 1815 key_sp2msg(struct secpolicy *sp, void *request, size_t *len)
 1816 {
 1817         struct sadb_x_ipsecrequest *xisr;
 1818         struct sadb_x_policy *xpl;
 1819         struct ipsecrequest *isr;
 1820         size_t xlen, ilen;
 1821         caddr_t p;
 1822         int error, i;
 1823 
 1824         IPSEC_ASSERT(sp != NULL, ("null policy"));
 1825 
 1826         xlen = sizeof(*xpl);
 1827         if (*len < xlen)
 1828                 return (EINVAL);
 1829 
 1830         error = 0;
 1831         bzero(request, *len);
 1832         xpl = (struct sadb_x_policy *)request;
 1833         xpl->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
 1834         xpl->sadb_x_policy_type = sp->policy;
 1835         xpl->sadb_x_policy_dir = sp->spidx.dir;
 1836         xpl->sadb_x_policy_id = sp->id;
 1837         xpl->sadb_x_policy_priority = sp->priority;
 1838         switch (sp->state) {
 1839         case IPSEC_SPSTATE_IFNET:
 1840                 xpl->sadb_x_policy_scope = IPSEC_POLICYSCOPE_IFNET;
 1841                 break;
 1842         case IPSEC_SPSTATE_PCB:
 1843                 xpl->sadb_x_policy_scope = IPSEC_POLICYSCOPE_PCB;
 1844                 break;
 1845         default:
 1846                 xpl->sadb_x_policy_scope = IPSEC_POLICYSCOPE_GLOBAL;
 1847         }
 1848 
 1849         /* if is the policy for ipsec ? */
 1850         if (sp->policy == IPSEC_POLICY_IPSEC) {
 1851                 p = (caddr_t)xpl + sizeof(*xpl);
 1852                 for (i = 0; i < sp->tcount; i++) {
 1853                         isr = sp->req[i];
 1854                         ilen = PFKEY_ALIGN8(sizeof(*xisr) +
 1855                             isr->saidx.src.sa.sa_len +
 1856                             isr->saidx.dst.sa.sa_len);
 1857                         xlen += ilen;
 1858                         if (xlen > *len) {
 1859                                 error = ENOBUFS;
 1860                                 /* Calculate needed size */
 1861                                 continue;
 1862                         }
 1863                         xisr = (struct sadb_x_ipsecrequest *)p;
 1864                         xisr->sadb_x_ipsecrequest_len = ilen;
 1865                         xisr->sadb_x_ipsecrequest_proto = isr->saidx.proto;
 1866                         xisr->sadb_x_ipsecrequest_mode = isr->saidx.mode;
 1867                         xisr->sadb_x_ipsecrequest_level = isr->level;
 1868                         xisr->sadb_x_ipsecrequest_reqid = isr->saidx.reqid;
 1869 
 1870                         p += sizeof(*xisr);
 1871                         bcopy(&isr->saidx.src, p, isr->saidx.src.sa.sa_len);
 1872                         p += isr->saidx.src.sa.sa_len;
 1873                         bcopy(&isr->saidx.dst, p, isr->saidx.dst.sa.sa_len);
 1874                         p += isr->saidx.dst.sa.sa_len;
 1875                 }
 1876         }
 1877         xpl->sadb_x_policy_len = PFKEY_UNIT64(xlen);
 1878         if (error == 0)
 1879                 *len = xlen;
 1880         else
 1881                 *len = sizeof(*xpl);
 1882         return (error);
 1883 }
 1884 
 1885 /* m will not be freed nor modified */
 1886 static struct mbuf *
 1887 key_gather_mbuf(struct mbuf *m, const struct sadb_msghdr *mhp,
 1888     int ndeep, int nitem, ...)
 1889 {
 1890         va_list ap;
 1891         int idx;
 1892         int i;
 1893         struct mbuf *result = NULL, *n;
 1894         int len;
 1895 
 1896         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 1897         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 1898 
 1899         va_start(ap, nitem);
 1900         for (i = 0; i < nitem; i++) {
 1901                 idx = va_arg(ap, int);
 1902                 if (idx < 0 || idx > SADB_EXT_MAX)
 1903                         goto fail;
 1904                 /* don't attempt to pull empty extension */
 1905                 if (idx == SADB_EXT_RESERVED && mhp->msg == NULL)
 1906                         continue;
 1907                 if (idx != SADB_EXT_RESERVED  &&
 1908                     (mhp->ext[idx] == NULL || mhp->extlen[idx] == 0))
 1909                         continue;
 1910 
 1911                 if (idx == SADB_EXT_RESERVED) {
 1912                         len = PFKEY_ALIGN8(sizeof(struct sadb_msg));
 1913 
 1914                         IPSEC_ASSERT(len <= MHLEN, ("header too big %u", len));
 1915 
 1916                         MGETHDR(n, M_NOWAIT, MT_DATA);
 1917                         if (!n)
 1918                                 goto fail;
 1919                         n->m_len = len;
 1920                         n->m_next = NULL;
 1921                         m_copydata(m, 0, sizeof(struct sadb_msg),
 1922                             mtod(n, caddr_t));
 1923                 } else if (i < ndeep) {
 1924                         len = mhp->extlen[idx];
 1925                         n = m_get2(len, M_NOWAIT, MT_DATA, 0);
 1926                         if (n == NULL)
 1927                                 goto fail;
 1928                         m_align(n, len);
 1929                         n->m_len = len;
 1930                         m_copydata(m, mhp->extoff[idx], mhp->extlen[idx],
 1931                             mtod(n, caddr_t));
 1932                 } else {
 1933                         n = m_copym(m, mhp->extoff[idx], mhp->extlen[idx],
 1934                             M_NOWAIT);
 1935                 }
 1936                 if (n == NULL)
 1937                         goto fail;
 1938 
 1939                 if (result)
 1940                         m_cat(result, n);
 1941                 else
 1942                         result = n;
 1943         }
 1944         va_end(ap);
 1945 
 1946         if ((result->m_flags & M_PKTHDR) != 0) {
 1947                 result->m_pkthdr.len = 0;
 1948                 for (n = result; n; n = n->m_next)
 1949                         result->m_pkthdr.len += n->m_len;
 1950         }
 1951 
 1952         return result;
 1953 
 1954 fail:
 1955         m_freem(result);
 1956         va_end(ap);
 1957         return NULL;
 1958 }
 1959 
 1960 /*
 1961  * SADB_X_SPDADD, SADB_X_SPDSETIDX or SADB_X_SPDUPDATE processing
 1962  * add an entry to SP database, when received
 1963  *   <base, address(SD), (lifetime(H),) policy>
 1964  * from the user(?).
 1965  * Adding to SP database,
 1966  * and send
 1967  *   <base, address(SD), (lifetime(H),) policy>
 1968  * to the socket which was send.
 1969  *
 1970  * SPDADD set a unique policy entry.
 1971  * SPDSETIDX like SPDADD without a part of policy requests.
 1972  * SPDUPDATE replace a unique policy entry.
 1973  *
 1974  * XXXAE: serialize this in PF_KEY to avoid races.
 1975  * m will always be freed.
 1976  */
 1977 static int
 1978 key_spdadd(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 1979 {
 1980         struct secpolicyindex spidx;
 1981         struct sadb_address *src0, *dst0;
 1982         struct sadb_x_policy *xpl0, *xpl;
 1983         struct sadb_lifetime *lft = NULL;
 1984         struct secpolicy *newsp, *oldsp;
 1985         int error;
 1986 
 1987         IPSEC_ASSERT(so != NULL, ("null socket"));
 1988         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 1989         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 1990         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 1991 
 1992         if (SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_SRC) ||
 1993             SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_DST) ||
 1994             SADB_CHECKHDR(mhp, SADB_X_EXT_POLICY)) {
 1995                 ipseclog((LOG_DEBUG,
 1996                     "%s: invalid message: missing required header.\n",
 1997                     __func__));
 1998                 return key_senderror(so, m, EINVAL);
 1999         }
 2000         if (SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_SRC) ||
 2001             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_DST) ||
 2002             SADB_CHECKLEN(mhp, SADB_X_EXT_POLICY)) {
 2003                 ipseclog((LOG_DEBUG,
 2004                     "%s: invalid message: wrong header size.\n", __func__));
 2005                 return key_senderror(so, m, EINVAL);
 2006         }
 2007         if (!SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD)) {
 2008                 if (SADB_CHECKLEN(mhp, SADB_EXT_LIFETIME_HARD)) {
 2009                         ipseclog((LOG_DEBUG,
 2010                             "%s: invalid message: wrong header size.\n",
 2011                             __func__));
 2012                         return key_senderror(so, m, EINVAL);
 2013                 }
 2014                 lft = (struct sadb_lifetime *)mhp->ext[SADB_EXT_LIFETIME_HARD];
 2015         }
 2016 
 2017         src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC];
 2018         dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST];
 2019         xpl0 = (struct sadb_x_policy *)mhp->ext[SADB_X_EXT_POLICY];
 2020 
 2021         /* check the direciton */
 2022         switch (xpl0->sadb_x_policy_dir) {
 2023         case IPSEC_DIR_INBOUND:
 2024         case IPSEC_DIR_OUTBOUND:
 2025                 break;
 2026         default:
 2027                 ipseclog((LOG_DEBUG, "%s: invalid SP direction.\n", __func__));
 2028                 return key_senderror(so, m, EINVAL);
 2029         }
 2030         /* key_spdadd() accepts DISCARD, NONE and IPSEC. */
 2031         if (xpl0->sadb_x_policy_type != IPSEC_POLICY_DISCARD &&
 2032             xpl0->sadb_x_policy_type != IPSEC_POLICY_NONE &&
 2033             xpl0->sadb_x_policy_type != IPSEC_POLICY_IPSEC) {
 2034                 ipseclog((LOG_DEBUG, "%s: invalid policy type.\n", __func__));
 2035                 return key_senderror(so, m, EINVAL);
 2036         }
 2037 
 2038         /* policy requests are mandatory when action is ipsec. */
 2039         if (xpl0->sadb_x_policy_type == IPSEC_POLICY_IPSEC &&
 2040             mhp->extlen[SADB_X_EXT_POLICY] <= sizeof(*xpl0)) {
 2041                 ipseclog((LOG_DEBUG,
 2042                     "%s: policy requests required.\n", __func__));
 2043                 return key_senderror(so, m, EINVAL);
 2044         }
 2045 
 2046         error = key_checksockaddrs((struct sockaddr *)(src0 + 1),
 2047             (struct sockaddr *)(dst0 + 1));
 2048         if (error != 0 ||
 2049             src0->sadb_address_proto != dst0->sadb_address_proto) {
 2050                 ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
 2051                 return key_senderror(so, m, error);
 2052         }
 2053         /* make secindex */
 2054         KEY_SETSECSPIDX(xpl0->sadb_x_policy_dir,
 2055                         src0 + 1,
 2056                         dst0 + 1,
 2057                         src0->sadb_address_prefixlen,
 2058                         dst0->sadb_address_prefixlen,
 2059                         src0->sadb_address_proto,
 2060                         &spidx);
 2061         /* Checking there is SP already or not. */
 2062         oldsp = key_getsp(&spidx);
 2063         if (oldsp != NULL) {
 2064                 if (mhp->msg->sadb_msg_type == SADB_X_SPDUPDATE) {
 2065                         KEYDBG(KEY_STAMP,
 2066                             printf("%s: unlink SP(%p) for SPDUPDATE\n",
 2067                                 __func__, oldsp));
 2068                         KEYDBG(KEY_DATA, kdebug_secpolicy(oldsp));
 2069                 } else {
 2070                         key_freesp(&oldsp);
 2071                         ipseclog((LOG_DEBUG,
 2072                             "%s: a SP entry exists already.\n", __func__));
 2073                         return (key_senderror(so, m, EEXIST));
 2074                 }
 2075         }
 2076 
 2077         /* allocate new SP entry */
 2078         if ((newsp = key_msg2sp(xpl0, PFKEY_EXTLEN(xpl0), &error)) == NULL) {
 2079                 if (oldsp != NULL) {
 2080                         key_unlink(oldsp);
 2081                         key_freesp(&oldsp); /* second for our reference */
 2082                 }
 2083                 return key_senderror(so, m, error);
 2084         }
 2085 
 2086         newsp->lastused = newsp->created = time_second;
 2087         newsp->lifetime = lft ? lft->sadb_lifetime_addtime : 0;
 2088         newsp->validtime = lft ? lft->sadb_lifetime_usetime : 0;
 2089         bcopy(&spidx, &newsp->spidx, sizeof(spidx));
 2090 
 2091         SPTREE_WLOCK();
 2092         if ((newsp->id = key_getnewspid()) == 0) {
 2093                 if (oldsp != NULL)
 2094                         key_detach(oldsp);
 2095                 SPTREE_WUNLOCK();
 2096                 if (oldsp != NULL) {
 2097                         key_freesp(&oldsp); /* first for key_detach */
 2098                         IPSEC_ASSERT(oldsp != NULL, ("null oldsp: refcount bug"));
 2099                         key_freesp(&oldsp); /* second for our reference */
 2100                         if (SPDCACHE_ENABLED()) /* refresh cache because of key_detach */
 2101                                 spdcache_clear();
 2102                 }
 2103                 key_freesp(&newsp);
 2104                 return key_senderror(so, m, ENOBUFS);
 2105         }
 2106         if (oldsp != NULL)
 2107                 key_detach(oldsp);
 2108         key_insertsp(newsp);
 2109         SPTREE_WUNLOCK();
 2110         if (oldsp != NULL) {
 2111                 key_freesp(&oldsp); /* first for key_detach */
 2112                 IPSEC_ASSERT(oldsp != NULL, ("null oldsp: refcount bug"));
 2113                 key_freesp(&oldsp); /* second for our reference */
 2114         }
 2115         if (SPDCACHE_ENABLED())
 2116                 spdcache_clear();
 2117         KEYDBG(KEY_STAMP,
 2118             printf("%s: SP(%p)\n", __func__, newsp));
 2119         KEYDBG(KEY_DATA, kdebug_secpolicy(newsp));
 2120 
 2121     {
 2122         struct mbuf *n, *mpolicy;
 2123         struct sadb_msg *newmsg;
 2124         int off;
 2125 
 2126         /* create new sadb_msg to reply. */
 2127         if (lft) {
 2128                 n = key_gather_mbuf(m, mhp, 2, 5, SADB_EXT_RESERVED,
 2129                     SADB_X_EXT_POLICY, SADB_EXT_LIFETIME_HARD,
 2130                     SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST);
 2131         } else {
 2132                 n = key_gather_mbuf(m, mhp, 2, 4, SADB_EXT_RESERVED,
 2133                     SADB_X_EXT_POLICY,
 2134                     SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST);
 2135         }
 2136         if (!n)
 2137                 return key_senderror(so, m, ENOBUFS);
 2138 
 2139         if (n->m_len < sizeof(*newmsg)) {
 2140                 n = m_pullup(n, sizeof(*newmsg));
 2141                 if (!n)
 2142                         return key_senderror(so, m, ENOBUFS);
 2143         }
 2144         newmsg = mtod(n, struct sadb_msg *);
 2145         newmsg->sadb_msg_errno = 0;
 2146         newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len);
 2147 
 2148         off = 0;
 2149         mpolicy = m_pulldown(n, PFKEY_ALIGN8(sizeof(struct sadb_msg)),
 2150             sizeof(*xpl), &off);
 2151         if (mpolicy == NULL) {
 2152                 /* n is already freed */
 2153                 return key_senderror(so, m, ENOBUFS);
 2154         }
 2155         xpl = (struct sadb_x_policy *)(mtod(mpolicy, caddr_t) + off);
 2156         if (xpl->sadb_x_policy_exttype != SADB_X_EXT_POLICY) {
 2157                 m_freem(n);
 2158                 return key_senderror(so, m, EINVAL);
 2159         }
 2160         xpl->sadb_x_policy_id = newsp->id;
 2161 
 2162         m_freem(m);
 2163         return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
 2164     }
 2165 }
 2166 
 2167 /*
 2168  * get new policy id.
 2169  * OUT:
 2170  *      0:      failure.
 2171  *      others: success.
 2172  */
 2173 static uint32_t
 2174 key_getnewspid(void)
 2175 {
 2176         struct secpolicy *sp;
 2177         uint32_t newid = 0;
 2178         int tries, limit;
 2179 
 2180         SPTREE_WLOCK_ASSERT();
 2181 
 2182         limit = atomic_load_int(&V_key_spi_trycnt);
 2183         for (tries = 0; tries < limit; tries++) {
 2184                 if (V_policy_id == ~0) /* overflowed */
 2185                         newid = V_policy_id = 1;
 2186                 else
 2187                         newid = ++V_policy_id;
 2188                 LIST_FOREACH(sp, SPHASH_HASH(newid), idhash) {
 2189                         if (sp->id == newid)
 2190                                 break;
 2191                 }
 2192                 if (sp == NULL)
 2193                         break;
 2194         }
 2195         if (tries == limit || newid == 0) {
 2196                 ipseclog((LOG_DEBUG, "%s: failed to allocate policy id.\n",
 2197                     __func__));
 2198                 return (0);
 2199         }
 2200         return (newid);
 2201 }
 2202 
 2203 /*
 2204  * SADB_SPDDELETE processing
 2205  * receive
 2206  *   <base, address(SD), policy(*)>
 2207  * from the user(?), and set SADB_SASTATE_DEAD,
 2208  * and send,
 2209  *   <base, address(SD), policy(*)>
 2210  * to the ikmpd.
 2211  * policy(*) including direction of policy.
 2212  *
 2213  * m will always be freed.
 2214  */
 2215 static int
 2216 key_spddelete(struct socket *so, struct mbuf *m,
 2217     const struct sadb_msghdr *mhp)
 2218 {
 2219         struct secpolicyindex spidx;
 2220         struct sadb_address *src0, *dst0;
 2221         struct sadb_x_policy *xpl0;
 2222         struct secpolicy *sp;
 2223 
 2224         IPSEC_ASSERT(so != NULL, ("null so"));
 2225         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 2226         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 2227         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 2228 
 2229         if (SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_SRC) ||
 2230             SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_DST) ||
 2231             SADB_CHECKHDR(mhp, SADB_X_EXT_POLICY)) {
 2232                 ipseclog((LOG_DEBUG,
 2233                     "%s: invalid message: missing required header.\n",
 2234                     __func__));
 2235                 return key_senderror(so, m, EINVAL);
 2236         }
 2237         if (SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_SRC) ||
 2238             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_DST) ||
 2239             SADB_CHECKLEN(mhp, SADB_X_EXT_POLICY)) {
 2240                 ipseclog((LOG_DEBUG,
 2241                     "%s: invalid message: wrong header size.\n", __func__));
 2242                 return key_senderror(so, m, EINVAL);
 2243         }
 2244 
 2245         src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC];
 2246         dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST];
 2247         xpl0 = (struct sadb_x_policy *)mhp->ext[SADB_X_EXT_POLICY];
 2248 
 2249         /* check the direciton */
 2250         switch (xpl0->sadb_x_policy_dir) {
 2251         case IPSEC_DIR_INBOUND:
 2252         case IPSEC_DIR_OUTBOUND:
 2253                 break;
 2254         default:
 2255                 ipseclog((LOG_DEBUG, "%s: invalid SP direction.\n", __func__));
 2256                 return key_senderror(so, m, EINVAL);
 2257         }
 2258         /* Only DISCARD, NONE and IPSEC are allowed */
 2259         if (xpl0->sadb_x_policy_type != IPSEC_POLICY_DISCARD &&
 2260             xpl0->sadb_x_policy_type != IPSEC_POLICY_NONE &&
 2261             xpl0->sadb_x_policy_type != IPSEC_POLICY_IPSEC) {
 2262                 ipseclog((LOG_DEBUG, "%s: invalid policy type.\n", __func__));
 2263                 return key_senderror(so, m, EINVAL);
 2264         }
 2265         if (key_checksockaddrs((struct sockaddr *)(src0 + 1),
 2266             (struct sockaddr *)(dst0 + 1)) != 0 ||
 2267             src0->sadb_address_proto != dst0->sadb_address_proto) {
 2268                 ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
 2269                 return key_senderror(so, m, EINVAL);
 2270         }
 2271         /* make secindex */
 2272         KEY_SETSECSPIDX(xpl0->sadb_x_policy_dir,
 2273                         src0 + 1,
 2274                         dst0 + 1,
 2275                         src0->sadb_address_prefixlen,
 2276                         dst0->sadb_address_prefixlen,
 2277                         src0->sadb_address_proto,
 2278                         &spidx);
 2279 
 2280         /* Is there SP in SPD ? */
 2281         if ((sp = key_getsp(&spidx)) == NULL) {
 2282                 ipseclog((LOG_DEBUG, "%s: no SP found.\n", __func__));
 2283                 return key_senderror(so, m, EINVAL);
 2284         }
 2285 
 2286         /* save policy id to buffer to be returned. */
 2287         xpl0->sadb_x_policy_id = sp->id;
 2288 
 2289         KEYDBG(KEY_STAMP,
 2290             printf("%s: SP(%p)\n", __func__, sp));
 2291         KEYDBG(KEY_DATA, kdebug_secpolicy(sp));
 2292         key_unlink(sp);
 2293         key_freesp(&sp);
 2294 
 2295     {
 2296         struct mbuf *n;
 2297         struct sadb_msg *newmsg;
 2298 
 2299         /* create new sadb_msg to reply. */
 2300         n = key_gather_mbuf(m, mhp, 1, 4, SADB_EXT_RESERVED,
 2301             SADB_X_EXT_POLICY, SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST);
 2302         if (!n)
 2303                 return key_senderror(so, m, ENOBUFS);
 2304 
 2305         newmsg = mtod(n, struct sadb_msg *);
 2306         newmsg->sadb_msg_errno = 0;
 2307         newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len);
 2308 
 2309         m_freem(m);
 2310         return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
 2311     }
 2312 }
 2313 
 2314 /*
 2315  * SADB_SPDDELETE2 processing
 2316  * receive
 2317  *   <base, policy(*)>
 2318  * from the user(?), and set SADB_SASTATE_DEAD,
 2319  * and send,
 2320  *   <base, policy(*)>
 2321  * to the ikmpd.
 2322  * policy(*) including direction of policy.
 2323  *
 2324  * m will always be freed.
 2325  */
 2326 static int
 2327 key_spddelete2(struct socket *so, struct mbuf *m,
 2328     const struct sadb_msghdr *mhp)
 2329 {
 2330         struct secpolicy *sp;
 2331         uint32_t id;
 2332 
 2333         IPSEC_ASSERT(so != NULL, ("null socket"));
 2334         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 2335         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 2336         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 2337 
 2338         if (SADB_CHECKHDR(mhp, SADB_X_EXT_POLICY) ||
 2339             SADB_CHECKLEN(mhp, SADB_X_EXT_POLICY)) {
 2340                 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n",
 2341                     __func__));
 2342                 return key_senderror(so, m, EINVAL);
 2343         }
 2344 
 2345         id = ((struct sadb_x_policy *)
 2346             mhp->ext[SADB_X_EXT_POLICY])->sadb_x_policy_id;
 2347 
 2348         /* Is there SP in SPD ? */
 2349         if ((sp = key_getspbyid(id)) == NULL) {
 2350                 ipseclog((LOG_DEBUG, "%s: no SP found for id %u.\n",
 2351                     __func__, id));
 2352                 return key_senderror(so, m, EINVAL);
 2353         }
 2354 
 2355         KEYDBG(KEY_STAMP,
 2356             printf("%s: SP(%p)\n", __func__, sp));
 2357         KEYDBG(KEY_DATA, kdebug_secpolicy(sp));
 2358         key_unlink(sp);
 2359         if (sp->state != IPSEC_SPSTATE_DEAD) {
 2360                 ipseclog((LOG_DEBUG, "%s: failed to delete SP with id %u.\n",
 2361                     __func__, id));
 2362                 key_freesp(&sp);
 2363                 return (key_senderror(so, m, EACCES));
 2364         }
 2365         key_freesp(&sp);
 2366 
 2367     {
 2368         struct mbuf *n, *nn;
 2369         struct sadb_msg *newmsg;
 2370         int off, len;
 2371 
 2372         /* create new sadb_msg to reply. */
 2373         len = PFKEY_ALIGN8(sizeof(struct sadb_msg));
 2374 
 2375         n = key_mget(len);
 2376         if (n == NULL)
 2377                 return key_senderror(so, m, ENOBUFS);
 2378 
 2379         n->m_len = len;
 2380         n->m_next = NULL;
 2381         off = 0;
 2382 
 2383         m_copydata(m, 0, sizeof(struct sadb_msg), mtod(n, caddr_t) + off);
 2384         off += PFKEY_ALIGN8(sizeof(struct sadb_msg));
 2385 
 2386         IPSEC_ASSERT(off == len, ("length inconsistency (off %u len %u)",
 2387                 off, len));
 2388 
 2389         n->m_next = m_copym(m, mhp->extoff[SADB_X_EXT_POLICY],
 2390             mhp->extlen[SADB_X_EXT_POLICY], M_NOWAIT);
 2391         if (!n->m_next) {
 2392                 m_freem(n);
 2393                 return key_senderror(so, m, ENOBUFS);
 2394         }
 2395 
 2396         n->m_pkthdr.len = 0;
 2397         for (nn = n; nn; nn = nn->m_next)
 2398                 n->m_pkthdr.len += nn->m_len;
 2399 
 2400         newmsg = mtod(n, struct sadb_msg *);
 2401         newmsg->sadb_msg_errno = 0;
 2402         newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len);
 2403 
 2404         m_freem(m);
 2405         return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
 2406     }
 2407 }
 2408 
 2409 /*
 2410  * SADB_X_SPDGET processing
 2411  * receive
 2412  *   <base, policy(*)>
 2413  * from the user(?),
 2414  * and send,
 2415  *   <base, address(SD), policy>
 2416  * to the ikmpd.
 2417  * policy(*) including direction of policy.
 2418  *
 2419  * m will always be freed.
 2420  */
 2421 static int
 2422 key_spdget(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 2423 {
 2424         struct secpolicy *sp;
 2425         struct mbuf *n;
 2426         uint32_t id;
 2427 
 2428         IPSEC_ASSERT(so != NULL, ("null socket"));
 2429         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 2430         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 2431         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 2432 
 2433         if (SADB_CHECKHDR(mhp, SADB_X_EXT_POLICY) ||
 2434             SADB_CHECKLEN(mhp, SADB_X_EXT_POLICY)) {
 2435                 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n",
 2436                     __func__));
 2437                 return key_senderror(so, m, EINVAL);
 2438         }
 2439 
 2440         id = ((struct sadb_x_policy *)
 2441             mhp->ext[SADB_X_EXT_POLICY])->sadb_x_policy_id;
 2442 
 2443         /* Is there SP in SPD ? */
 2444         if ((sp = key_getspbyid(id)) == NULL) {
 2445                 ipseclog((LOG_DEBUG, "%s: no SP found for id %u.\n",
 2446                     __func__, id));
 2447                 return key_senderror(so, m, ENOENT);
 2448         }
 2449 
 2450         n = key_setdumpsp(sp, SADB_X_SPDGET, mhp->msg->sadb_msg_seq,
 2451             mhp->msg->sadb_msg_pid);
 2452         key_freesp(&sp);
 2453         if (n != NULL) {
 2454                 m_freem(m);
 2455                 return key_sendup_mbuf(so, n, KEY_SENDUP_ONE);
 2456         } else
 2457                 return key_senderror(so, m, ENOBUFS);
 2458 }
 2459 
 2460 /*
 2461  * SADB_X_SPDACQUIRE processing.
 2462  * Acquire policy and SA(s) for a *OUTBOUND* packet.
 2463  * send
 2464  *   <base, policy(*)>
 2465  * to KMD, and expect to receive
 2466  *   <base> with SADB_X_SPDACQUIRE if error occurred,
 2467  * or
 2468  *   <base, policy>
 2469  * with SADB_X_SPDUPDATE from KMD by PF_KEY.
 2470  * policy(*) is without policy requests.
 2471  *
 2472  *    0     : succeed
 2473  *    others: error number
 2474  */
 2475 int
 2476 key_spdacquire(struct secpolicy *sp)
 2477 {
 2478         struct mbuf *result = NULL, *m;
 2479         struct secspacq *newspacq;
 2480 
 2481         IPSEC_ASSERT(sp != NULL, ("null secpolicy"));
 2482         IPSEC_ASSERT(sp->req == NULL, ("policy exists"));
 2483         IPSEC_ASSERT(sp->policy == IPSEC_POLICY_IPSEC,
 2484                 ("policy not IPSEC %u", sp->policy));
 2485 
 2486         /* Get an entry to check whether sent message or not. */
 2487         newspacq = key_getspacq(&sp->spidx);
 2488         if (newspacq != NULL) {
 2489                 if (V_key_blockacq_count < newspacq->count) {
 2490                         /* reset counter and do send message. */
 2491                         newspacq->count = 0;
 2492                 } else {
 2493                         /* increment counter and do nothing. */
 2494                         newspacq->count++;
 2495                         SPACQ_UNLOCK();
 2496                         return (0);
 2497                 }
 2498                 SPACQ_UNLOCK();
 2499         } else {
 2500                 /* make new entry for blocking to send SADB_ACQUIRE. */
 2501                 newspacq = key_newspacq(&sp->spidx);
 2502                 if (newspacq == NULL)
 2503                         return ENOBUFS;
 2504         }
 2505 
 2506         /* create new sadb_msg to reply. */
 2507         m = key_setsadbmsg(SADB_X_SPDACQUIRE, 0, 0, 0, 0, 0);
 2508         if (!m)
 2509                 return ENOBUFS;
 2510 
 2511         result = m;
 2512 
 2513         result->m_pkthdr.len = 0;
 2514         for (m = result; m; m = m->m_next)
 2515                 result->m_pkthdr.len += m->m_len;
 2516 
 2517         mtod(result, struct sadb_msg *)->sadb_msg_len =
 2518             PFKEY_UNIT64(result->m_pkthdr.len);
 2519 
 2520         return key_sendup_mbuf(NULL, m, KEY_SENDUP_REGISTERED);
 2521 }
 2522 
 2523 /*
 2524  * SADB_SPDFLUSH processing
 2525  * receive
 2526  *   <base>
 2527  * from the user, and free all entries in secpctree.
 2528  * and send,
 2529  *   <base>
 2530  * to the user.
 2531  * NOTE: what to do is only marking SADB_SASTATE_DEAD.
 2532  *
 2533  * m will always be freed.
 2534  */
 2535 static int
 2536 key_spdflush(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 2537 {
 2538         struct secpolicy_queue drainq;
 2539         struct sadb_msg *newmsg;
 2540         struct secpolicy *sp, *nextsp;
 2541         u_int dir;
 2542 
 2543         IPSEC_ASSERT(so != NULL, ("null socket"));
 2544         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 2545         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 2546         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 2547 
 2548         if (m->m_len != PFKEY_ALIGN8(sizeof(struct sadb_msg)))
 2549                 return key_senderror(so, m, EINVAL);
 2550 
 2551         TAILQ_INIT(&drainq);
 2552         SPTREE_WLOCK();
 2553         for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
 2554                 TAILQ_CONCAT(&drainq, &V_sptree[dir], chain);
 2555         }
 2556         /*
 2557          * We need to set state to DEAD for each policy to be sure,
 2558          * that another thread won't try to unlink it.
 2559          * Also remove SP from sphash.
 2560          */
 2561         TAILQ_FOREACH(sp, &drainq, chain) {
 2562                 sp->state = IPSEC_SPSTATE_DEAD;
 2563                 LIST_REMOVE(sp, idhash);
 2564         }
 2565         V_sp_genid++;
 2566         V_spd_size = 0;
 2567         SPTREE_WUNLOCK();
 2568         if (SPDCACHE_ENABLED())
 2569                 spdcache_clear();
 2570         sp = TAILQ_FIRST(&drainq);
 2571         while (sp != NULL) {
 2572                 nextsp = TAILQ_NEXT(sp, chain);
 2573                 key_freesp(&sp);
 2574                 sp = nextsp;
 2575         }
 2576 
 2577         if (sizeof(struct sadb_msg) > m->m_len + M_TRAILINGSPACE(m)) {
 2578                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 2579                 return key_senderror(so, m, ENOBUFS);
 2580         }
 2581 
 2582         if (m->m_next)
 2583                 m_freem(m->m_next);
 2584         m->m_next = NULL;
 2585         m->m_pkthdr.len = m->m_len = PFKEY_ALIGN8(sizeof(struct sadb_msg));
 2586         newmsg = mtod(m, struct sadb_msg *);
 2587         newmsg->sadb_msg_errno = 0;
 2588         newmsg->sadb_msg_len = PFKEY_UNIT64(m->m_pkthdr.len);
 2589 
 2590         return key_sendup_mbuf(so, m, KEY_SENDUP_ALL);
 2591 }
 2592 
 2593 static uint8_t
 2594 key_satype2scopemask(uint8_t satype)
 2595 {
 2596 
 2597         if (satype == IPSEC_POLICYSCOPE_ANY)
 2598                 return (0xff);
 2599         return (satype);
 2600 }
 2601 /*
 2602  * SADB_SPDDUMP processing
 2603  * receive
 2604  *   <base>
 2605  * from the user, and dump all SP leaves and send,
 2606  *   <base> .....
 2607  * to the ikmpd.
 2608  *
 2609  * NOTE:
 2610  *   sadb_msg_satype is considered as mask of policy scopes.
 2611  *   m will always be freed.
 2612  */
 2613 static int
 2614 key_spddump(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 2615 {
 2616         SPTREE_RLOCK_TRACKER;
 2617         struct secpolicy *sp;
 2618         struct mbuf *n;
 2619         int cnt;
 2620         u_int dir, scope;
 2621 
 2622         IPSEC_ASSERT(so != NULL, ("null socket"));
 2623         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 2624         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 2625         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 2626 
 2627         /* search SPD entry and get buffer size. */
 2628         cnt = 0;
 2629         scope = key_satype2scopemask(mhp->msg->sadb_msg_satype);
 2630         SPTREE_RLOCK();
 2631         for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
 2632                 if (scope & IPSEC_POLICYSCOPE_GLOBAL) {
 2633                         TAILQ_FOREACH(sp, &V_sptree[dir], chain)
 2634                                 cnt++;
 2635                 }
 2636                 if (scope & IPSEC_POLICYSCOPE_IFNET) {
 2637                         TAILQ_FOREACH(sp, &V_sptree_ifnet[dir], chain)
 2638                                 cnt++;
 2639                 }
 2640         }
 2641 
 2642         if (cnt == 0) {
 2643                 SPTREE_RUNLOCK();
 2644                 return key_senderror(so, m, ENOENT);
 2645         }
 2646 
 2647         for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
 2648                 if (scope & IPSEC_POLICYSCOPE_GLOBAL) {
 2649                         TAILQ_FOREACH(sp, &V_sptree[dir], chain) {
 2650                                 --cnt;
 2651                                 n = key_setdumpsp(sp, SADB_X_SPDDUMP, cnt,
 2652                                     mhp->msg->sadb_msg_pid);
 2653 
 2654                                 if (n != NULL)
 2655                                         key_sendup_mbuf(so, n, KEY_SENDUP_ONE);
 2656                         }
 2657                 }
 2658                 if (scope & IPSEC_POLICYSCOPE_IFNET) {
 2659                         TAILQ_FOREACH(sp, &V_sptree_ifnet[dir], chain) {
 2660                                 --cnt;
 2661                                 n = key_setdumpsp(sp, SADB_X_SPDDUMP, cnt,
 2662                                     mhp->msg->sadb_msg_pid);
 2663 
 2664                                 if (n != NULL)
 2665                                         key_sendup_mbuf(so, n, KEY_SENDUP_ONE);
 2666                         }
 2667                 }
 2668         }
 2669 
 2670         SPTREE_RUNLOCK();
 2671         m_freem(m);
 2672         return (0);
 2673 }
 2674 
 2675 static struct mbuf *
 2676 key_setdumpsp(struct secpolicy *sp, u_int8_t type, u_int32_t seq,
 2677     u_int32_t pid)
 2678 {
 2679         struct mbuf *result = NULL, *m;
 2680         struct seclifetime lt;
 2681 
 2682         m = key_setsadbmsg(type, 0, SADB_SATYPE_UNSPEC, seq, pid, sp->refcnt);
 2683         if (!m)
 2684                 goto fail;
 2685         result = m;
 2686 
 2687         m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC,
 2688             &sp->spidx.src.sa, sp->spidx.prefs,
 2689             sp->spidx.ul_proto);
 2690         if (!m)
 2691                 goto fail;
 2692         m_cat(result, m);
 2693 
 2694         m = key_setsadbaddr(SADB_EXT_ADDRESS_DST,
 2695             &sp->spidx.dst.sa, sp->spidx.prefd,
 2696             sp->spidx.ul_proto);
 2697         if (!m)
 2698                 goto fail;
 2699         m_cat(result, m);
 2700 
 2701         m = key_sp2mbuf(sp);
 2702         if (!m)
 2703                 goto fail;
 2704         m_cat(result, m);
 2705 
 2706         if(sp->lifetime){
 2707                 lt.addtime=sp->created;
 2708                 lt.usetime= sp->lastused;
 2709                 m = key_setlifetime(&lt, SADB_EXT_LIFETIME_CURRENT);
 2710                 if (!m)
 2711                         goto fail;
 2712                 m_cat(result, m);
 2713                 
 2714                 lt.addtime=sp->lifetime;
 2715                 lt.usetime= sp->validtime;
 2716                 m = key_setlifetime(&lt, SADB_EXT_LIFETIME_HARD);
 2717                 if (!m)
 2718                         goto fail;
 2719                 m_cat(result, m);
 2720         }
 2721 
 2722         if ((result->m_flags & M_PKTHDR) == 0)
 2723                 goto fail;
 2724 
 2725         if (result->m_len < sizeof(struct sadb_msg)) {
 2726                 result = m_pullup(result, sizeof(struct sadb_msg));
 2727                 if (result == NULL)
 2728                         goto fail;
 2729         }
 2730 
 2731         result->m_pkthdr.len = 0;
 2732         for (m = result; m; m = m->m_next)
 2733                 result->m_pkthdr.len += m->m_len;
 2734 
 2735         mtod(result, struct sadb_msg *)->sadb_msg_len =
 2736             PFKEY_UNIT64(result->m_pkthdr.len);
 2737 
 2738         return result;
 2739 
 2740 fail:
 2741         m_freem(result);
 2742         return NULL;
 2743 }
 2744 /*
 2745  * get PFKEY message length for security policy and request.
 2746  */
 2747 static size_t
 2748 key_getspreqmsglen(struct secpolicy *sp)
 2749 {
 2750         size_t tlen, len;
 2751         int i;
 2752 
 2753         tlen = sizeof(struct sadb_x_policy);
 2754         /* if is the policy for ipsec ? */
 2755         if (sp->policy != IPSEC_POLICY_IPSEC)
 2756                 return (tlen);
 2757 
 2758         /* get length of ipsec requests */
 2759         for (i = 0; i < sp->tcount; i++) {
 2760                 len = sizeof(struct sadb_x_ipsecrequest)
 2761                         + sp->req[i]->saidx.src.sa.sa_len
 2762                         + sp->req[i]->saidx.dst.sa.sa_len;
 2763 
 2764                 tlen += PFKEY_ALIGN8(len);
 2765         }
 2766         return (tlen);
 2767 }
 2768 
 2769 /*
 2770  * SADB_SPDEXPIRE processing
 2771  * send
 2772  *   <base, address(SD), lifetime(CH), policy>
 2773  * to KMD by PF_KEY.
 2774  *
 2775  * OUT: 0       : succeed
 2776  *      others  : error number
 2777  */
 2778 static int
 2779 key_spdexpire(struct secpolicy *sp)
 2780 {
 2781         struct sadb_lifetime *lt;
 2782         struct mbuf *result = NULL, *m;
 2783         int len, error = -1;
 2784 
 2785         IPSEC_ASSERT(sp != NULL, ("null secpolicy"));
 2786 
 2787         KEYDBG(KEY_STAMP,
 2788             printf("%s: SP(%p)\n", __func__, sp));
 2789         KEYDBG(KEY_DATA, kdebug_secpolicy(sp));
 2790 
 2791         /* set msg header */
 2792         m = key_setsadbmsg(SADB_X_SPDEXPIRE, 0, 0, 0, 0, 0);
 2793         if (!m) {
 2794                 error = ENOBUFS;
 2795                 goto fail;
 2796         }
 2797         result = m;
 2798 
 2799         /* create lifetime extension (current and hard) */
 2800         len = PFKEY_ALIGN8(sizeof(*lt)) * 2;
 2801         m = m_get2(len, M_NOWAIT, MT_DATA, 0);
 2802         if (m == NULL) {
 2803                 error = ENOBUFS;
 2804                 goto fail;
 2805         }
 2806         m_align(m, len);
 2807         m->m_len = len;
 2808         bzero(mtod(m, caddr_t), len);
 2809         lt = mtod(m, struct sadb_lifetime *);
 2810         lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime));
 2811         lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT;
 2812         lt->sadb_lifetime_allocations = 0;
 2813         lt->sadb_lifetime_bytes = 0;
 2814         lt->sadb_lifetime_addtime = sp->created;
 2815         lt->sadb_lifetime_usetime = sp->lastused;
 2816         lt = (struct sadb_lifetime *)(mtod(m, caddr_t) + len / 2);
 2817         lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime));
 2818         lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD;
 2819         lt->sadb_lifetime_allocations = 0;
 2820         lt->sadb_lifetime_bytes = 0;
 2821         lt->sadb_lifetime_addtime = sp->lifetime;
 2822         lt->sadb_lifetime_usetime = sp->validtime;
 2823         m_cat(result, m);
 2824 
 2825         /* set sadb_address for source */
 2826         m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC,
 2827             &sp->spidx.src.sa,
 2828             sp->spidx.prefs, sp->spidx.ul_proto);
 2829         if (!m) {
 2830                 error = ENOBUFS;
 2831                 goto fail;
 2832         }
 2833         m_cat(result, m);
 2834 
 2835         /* set sadb_address for destination */
 2836         m = key_setsadbaddr(SADB_EXT_ADDRESS_DST,
 2837             &sp->spidx.dst.sa,
 2838             sp->spidx.prefd, sp->spidx.ul_proto);
 2839         if (!m) {
 2840                 error = ENOBUFS;
 2841                 goto fail;
 2842         }
 2843         m_cat(result, m);
 2844 
 2845         /* set secpolicy */
 2846         m = key_sp2mbuf(sp);
 2847         if (!m) {
 2848                 error = ENOBUFS;
 2849                 goto fail;
 2850         }
 2851         m_cat(result, m);
 2852 
 2853         if ((result->m_flags & M_PKTHDR) == 0) {
 2854                 error = EINVAL;
 2855                 goto fail;
 2856         }
 2857 
 2858         if (result->m_len < sizeof(struct sadb_msg)) {
 2859                 result = m_pullup(result, sizeof(struct sadb_msg));
 2860                 if (result == NULL) {
 2861                         error = ENOBUFS;
 2862                         goto fail;
 2863                 }
 2864         }
 2865 
 2866         result->m_pkthdr.len = 0;
 2867         for (m = result; m; m = m->m_next)
 2868                 result->m_pkthdr.len += m->m_len;
 2869 
 2870         mtod(result, struct sadb_msg *)->sadb_msg_len =
 2871             PFKEY_UNIT64(result->m_pkthdr.len);
 2872 
 2873         return key_sendup_mbuf(NULL, result, KEY_SENDUP_REGISTERED);
 2874 
 2875  fail:
 2876         if (result)
 2877                 m_freem(result);
 2878         return error;
 2879 }
 2880 
 2881 /* %%% SAD management */
 2882 /*
 2883  * allocating and initialize new SA head.
 2884  * OUT: NULL    : failure due to the lack of memory.
 2885  *      others  : pointer to new SA head.
 2886  */
 2887 static struct secashead *
 2888 key_newsah(struct secasindex *saidx)
 2889 {
 2890         struct secashead *sah;
 2891 
 2892         sah = malloc(sizeof(struct secashead), M_IPSEC_SAH,
 2893             M_NOWAIT | M_ZERO);
 2894         if (sah == NULL) {
 2895                 PFKEYSTAT_INC(in_nomem);
 2896                 return (NULL);
 2897         }
 2898         TAILQ_INIT(&sah->savtree_larval);
 2899         TAILQ_INIT(&sah->savtree_alive);
 2900         sah->saidx = *saidx;
 2901         sah->state = SADB_SASTATE_DEAD;
 2902         SAH_INITREF(sah);
 2903 
 2904         KEYDBG(KEY_STAMP,
 2905             printf("%s: SAH(%p)\n", __func__, sah));
 2906         KEYDBG(KEY_DATA, kdebug_secash(sah, NULL));
 2907         return (sah);
 2908 }
 2909 
 2910 static void
 2911 key_freesah(struct secashead **psah)
 2912 {
 2913         struct secashead *sah = *psah;
 2914 
 2915         CURVNET_ASSERT_SET();
 2916 
 2917         if (SAH_DELREF(sah) == 0)
 2918                 return;
 2919 
 2920         KEYDBG(KEY_STAMP,
 2921             printf("%s: last reference to SAH(%p)\n", __func__, sah));
 2922         KEYDBG(KEY_DATA, kdebug_secash(sah, NULL));
 2923 
 2924         *psah = NULL;
 2925         key_delsah(sah);
 2926 }
 2927 
 2928 static void
 2929 key_delsah(struct secashead *sah)
 2930 {
 2931         IPSEC_ASSERT(sah != NULL, ("NULL sah"));
 2932         IPSEC_ASSERT(sah->state == SADB_SASTATE_DEAD,
 2933             ("Attempt to free non DEAD SAH %p", sah));
 2934         IPSEC_ASSERT(TAILQ_EMPTY(&sah->savtree_larval),
 2935             ("Attempt to free SAH %p with LARVAL SA", sah));
 2936         IPSEC_ASSERT(TAILQ_EMPTY(&sah->savtree_alive),
 2937             ("Attempt to free SAH %p with ALIVE SA", sah));
 2938 
 2939         free(sah, M_IPSEC_SAH);
 2940 }
 2941 
 2942 /*
 2943  * allocating a new SA for key_add() and key_getspi() call,
 2944  * and copy the values of mhp into new buffer.
 2945  * When SAD message type is SADB_GETSPI set SA state to LARVAL.
 2946  * For SADB_ADD create and initialize SA with MATURE state.
 2947  * OUT: NULL    : fail
 2948  *      others  : pointer to new secasvar.
 2949  */
 2950 static struct secasvar *
 2951 key_newsav(const struct sadb_msghdr *mhp, struct secasindex *saidx,
 2952     uint32_t spi, int *errp)
 2953 {
 2954         struct secashead *sah;
 2955         struct secasvar *sav;
 2956         int isnew;
 2957 
 2958         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 2959         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 2960         IPSEC_ASSERT(mhp->msg->sadb_msg_type == SADB_GETSPI ||
 2961             mhp->msg->sadb_msg_type == SADB_ADD, ("wrong message type"));
 2962 
 2963         sav = NULL;
 2964         sah = NULL;
 2965         /* check SPI value */
 2966         switch (saidx->proto) {
 2967         case IPPROTO_ESP:
 2968         case IPPROTO_AH:
 2969                 /*
 2970                  * RFC 4302, 2.4. Security Parameters Index (SPI), SPI values
 2971                  * 1-255 reserved by IANA for future use,
 2972                  * 0 for implementation specific, local use.
 2973                  */
 2974                 if (ntohl(spi) <= 255) {
 2975                         ipseclog((LOG_DEBUG, "%s: illegal range of SPI %u.\n",
 2976                             __func__, ntohl(spi)));
 2977                         *errp = EINVAL;
 2978                         goto done;
 2979                 }
 2980                 break;
 2981         }
 2982 
 2983         sav = malloc(sizeof(struct secasvar), M_IPSEC_SA, M_NOWAIT | M_ZERO);
 2984         if (sav == NULL) {
 2985                 *errp = ENOBUFS;
 2986                 goto done;
 2987         }
 2988         sav->lock = malloc_aligned(max(sizeof(struct rmlock),
 2989             CACHE_LINE_SIZE), CACHE_LINE_SIZE, M_IPSEC_MISC,
 2990             M_NOWAIT | M_ZERO);
 2991         if (sav->lock == NULL) {
 2992                 *errp = ENOBUFS;
 2993                 goto done;
 2994         }
 2995         rm_init(sav->lock, "ipsec association");
 2996         sav->lft_c = uma_zalloc_pcpu(ipsec_key_lft_zone, M_NOWAIT | M_ZERO);
 2997         if (sav->lft_c == NULL) {
 2998                 *errp = ENOBUFS;
 2999                 goto done;
 3000         }
 3001 
 3002         sav->spi = spi;
 3003         sav->seq = mhp->msg->sadb_msg_seq;
 3004         sav->state = SADB_SASTATE_LARVAL;
 3005         sav->pid = (pid_t)mhp->msg->sadb_msg_pid;
 3006         SAV_INITREF(sav);
 3007 again:
 3008         sah = key_getsah(saidx);
 3009         if (sah == NULL) {
 3010                 /* create a new SA index */
 3011                 sah = key_newsah(saidx);
 3012                 if (sah == NULL) {
 3013                         ipseclog((LOG_DEBUG,
 3014                             "%s: No more memory.\n", __func__));
 3015                         *errp = ENOBUFS;
 3016                         goto done;
 3017                 }
 3018                 isnew = 1;
 3019         } else
 3020                 isnew = 0;
 3021 
 3022         sav->sah = sah;
 3023         if (mhp->msg->sadb_msg_type == SADB_GETSPI) {
 3024                 sav->created = time_second;
 3025         } else if (sav->state == SADB_SASTATE_LARVAL) {
 3026                 /*
 3027                  * Do not call key_setsaval() second time in case
 3028                  * of `goto again`. We will have MATURE state.
 3029                  */
 3030                 *errp = key_setsaval(sav, mhp);
 3031                 if (*errp != 0)
 3032                         goto done;
 3033                 sav->state = SADB_SASTATE_MATURE;
 3034         }
 3035 
 3036         SAHTREE_WLOCK();
 3037         /*
 3038          * Check that existing SAH wasn't unlinked.
 3039          * Since we didn't hold the SAHTREE lock, it is possible,
 3040          * that callout handler or key_flush() or key_delete() could
 3041          * unlink this SAH.
 3042          */
 3043         if (isnew == 0 && sah->state == SADB_SASTATE_DEAD) {
 3044                 SAHTREE_WUNLOCK();
 3045                 key_freesah(&sah);      /* reference from key_getsah() */
 3046                 goto again;
 3047         }
 3048         if (isnew != 0) {
 3049                 /*
 3050                  * Add new SAH into SADB.
 3051                  *
 3052                  * XXXAE: we can serialize key_add and key_getspi calls, so
 3053                  * several threads will not fight in the race.
 3054                  * Otherwise we should check under SAHTREE lock, that this
 3055                  * SAH would not added twice.
 3056                  */
 3057                 TAILQ_INSERT_HEAD(&V_sahtree, sah, chain);
 3058                 /* Add new SAH into hash by addresses */
 3059                 LIST_INSERT_HEAD(SAHADDRHASH_HASH(saidx), sah, addrhash);
 3060                 /* Now we are linked in the chain */
 3061                 sah->state = SADB_SASTATE_MATURE;
 3062                 /*
 3063                  * SAV references this new SAH.
 3064                  * In case of existing SAH we reuse reference
 3065                  * from key_getsah().
 3066                  */
 3067                 SAH_ADDREF(sah);
 3068         }
 3069         /* Link SAV with SAH */
 3070         if (sav->state == SADB_SASTATE_MATURE)
 3071                 TAILQ_INSERT_HEAD(&sah->savtree_alive, sav, chain);
 3072         else
 3073                 TAILQ_INSERT_HEAD(&sah->savtree_larval, sav, chain);
 3074         /* Add SAV into SPI hash */
 3075         LIST_INSERT_HEAD(SAVHASH_HASH(sav->spi), sav, spihash);
 3076         SAHTREE_WUNLOCK();
 3077         *errp = 0;      /* success */
 3078 done:
 3079         if (*errp != 0) {
 3080                 if (sav != NULL) {
 3081                         if (sav->lock != NULL) {
 3082                                 rm_destroy(sav->lock);
 3083                                 free(sav->lock, M_IPSEC_MISC);
 3084                         }
 3085                         if (sav->lft_c != NULL)
 3086                                 uma_zfree_pcpu(ipsec_key_lft_zone, sav->lft_c);
 3087                         free(sav, M_IPSEC_SA), sav = NULL;
 3088                 }
 3089                 if (sah != NULL)
 3090                         key_freesah(&sah);
 3091                 if (*errp == ENOBUFS) {
 3092                         ipseclog((LOG_DEBUG, "%s: No more memory.\n",
 3093                             __func__));
 3094                         PFKEYSTAT_INC(in_nomem);
 3095                 }
 3096         }
 3097         return (sav);
 3098 }
 3099 
 3100 /*
 3101  * free() SA variable entry.
 3102  */
 3103 static void
 3104 key_cleansav(struct secasvar *sav)
 3105 {
 3106 
 3107         if (sav->natt != NULL) {
 3108                 free(sav->natt, M_IPSEC_MISC);
 3109                 sav->natt = NULL;
 3110         }
 3111         if (sav->flags & SADB_X_EXT_F_CLONED)
 3112                 return;
 3113         if (sav->tdb_xform != NULL) {
 3114                 sav->tdb_xform->xf_cleanup(sav);
 3115                 sav->tdb_xform = NULL;
 3116         }
 3117         if (sav->key_auth != NULL) {
 3118                 zfree(sav->key_auth->key_data, M_IPSEC_MISC);
 3119                 free(sav->key_auth, M_IPSEC_MISC);
 3120                 sav->key_auth = NULL;
 3121         }
 3122         if (sav->key_enc != NULL) {
 3123                 zfree(sav->key_enc->key_data, M_IPSEC_MISC);
 3124                 free(sav->key_enc, M_IPSEC_MISC);
 3125                 sav->key_enc = NULL;
 3126         }
 3127         if (sav->replay != NULL) {
 3128                 mtx_destroy(&sav->replay->lock);
 3129                 if (sav->replay->bitmap != NULL)
 3130                         free(sav->replay->bitmap, M_IPSEC_MISC);
 3131                 free(sav->replay, M_IPSEC_MISC);
 3132                 sav->replay = NULL;
 3133         }
 3134         if (sav->lft_h != NULL) {
 3135                 free(sav->lft_h, M_IPSEC_MISC);
 3136                 sav->lft_h = NULL;
 3137         }
 3138         if (sav->lft_s != NULL) {
 3139                 free(sav->lft_s, M_IPSEC_MISC);
 3140                 sav->lft_s = NULL;
 3141         }
 3142 }
 3143 
 3144 /*
 3145  * free() SA variable entry.
 3146  */
 3147 static void
 3148 key_delsav(struct secasvar *sav)
 3149 {
 3150         IPSEC_ASSERT(sav != NULL, ("null sav"));
 3151         IPSEC_ASSERT(sav->state == SADB_SASTATE_DEAD,
 3152             ("attempt to free non DEAD SA %p", sav));
 3153         IPSEC_ASSERT(sav->refcnt == 0, ("reference count %u > 0",
 3154             sav->refcnt));
 3155 
 3156         /*
 3157          * SA must be unlinked from the chain and hashtbl.
 3158          * If SA was cloned, we leave all fields untouched,
 3159          * except NAT-T config.
 3160          */
 3161         key_cleansav(sav);
 3162         if ((sav->flags & SADB_X_EXT_F_CLONED) == 0) {
 3163                 rm_destroy(sav->lock);
 3164                 free(sav->lock, M_IPSEC_MISC);
 3165                 uma_zfree_pcpu(ipsec_key_lft_zone, sav->lft_c);
 3166         }
 3167         free(sav, M_IPSEC_SA);
 3168 }
 3169 
 3170 /*
 3171  * search SAH.
 3172  * OUT:
 3173  *      NULL    : not found
 3174  *      others  : found, referenced pointer to a SAH.
 3175  */
 3176 static struct secashead *
 3177 key_getsah(struct secasindex *saidx)
 3178 {
 3179         SAHTREE_RLOCK_TRACKER;
 3180         struct secashead *sah;
 3181 
 3182         SAHTREE_RLOCK();
 3183         LIST_FOREACH(sah, SAHADDRHASH_HASH(saidx), addrhash) {
 3184             if (key_cmpsaidx(&sah->saidx, saidx, CMP_MODE_REQID) != 0) {
 3185                     SAH_ADDREF(sah);
 3186                     break;
 3187             }
 3188         }
 3189         SAHTREE_RUNLOCK();
 3190         return (sah);
 3191 }
 3192 
 3193 /*
 3194  * Check not to be duplicated SPI.
 3195  * OUT:
 3196  *      0       : not found
 3197  *      1       : found SA with given SPI.
 3198  */
 3199 static int
 3200 key_checkspidup(uint32_t spi)
 3201 {
 3202         SAHTREE_RLOCK_TRACKER;
 3203         struct secasvar *sav;
 3204 
 3205         /* Assume SPI is in network byte order */
 3206         SAHTREE_RLOCK();
 3207         LIST_FOREACH(sav, SAVHASH_HASH(spi), spihash) {
 3208                 if (sav->spi == spi)
 3209                         break;
 3210         }
 3211         SAHTREE_RUNLOCK();
 3212         return (sav != NULL);
 3213 }
 3214 
 3215 /*
 3216  * Search SA by SPI.
 3217  * OUT:
 3218  *      NULL    : not found
 3219  *      others  : found, referenced pointer to a SA.
 3220  */
 3221 static struct secasvar *
 3222 key_getsavbyspi(uint32_t spi)
 3223 {
 3224         SAHTREE_RLOCK_TRACKER;
 3225         struct secasvar *sav;
 3226 
 3227         /* Assume SPI is in network byte order */
 3228         SAHTREE_RLOCK();
 3229         LIST_FOREACH(sav, SAVHASH_HASH(spi), spihash) {
 3230                 if (sav->spi != spi)
 3231                         continue;
 3232                 SAV_ADDREF(sav);
 3233                 break;
 3234         }
 3235         SAHTREE_RUNLOCK();
 3236         return (sav);
 3237 }
 3238 
 3239 static int
 3240 key_updatelifetimes(struct secasvar *sav, const struct sadb_msghdr *mhp)
 3241 {
 3242         struct seclifetime *lft_h, *lft_s, *tmp;
 3243 
 3244         /* Lifetime extension is optional, check that it is present. */
 3245         if (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD) &&
 3246             SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT)) {
 3247                 /*
 3248                  * In case of SADB_UPDATE we may need to change
 3249                  * existing lifetimes.
 3250                  */
 3251                 if (sav->state == SADB_SASTATE_MATURE) {
 3252                         lft_h = lft_s = NULL;
 3253                         goto reset;
 3254                 }
 3255                 return (0);
 3256         }
 3257         /* Both HARD and SOFT extensions must present */
 3258         if ((SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD) &&
 3259             !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT)) ||
 3260             (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT) &&
 3261             !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD))) {
 3262                 ipseclog((LOG_DEBUG,
 3263                     "%s: invalid message: missing required header.\n",
 3264                     __func__));
 3265                 return (EINVAL);
 3266         }
 3267         if (SADB_CHECKLEN(mhp, SADB_EXT_LIFETIME_HARD) ||
 3268             SADB_CHECKLEN(mhp, SADB_EXT_LIFETIME_SOFT)) {
 3269                 ipseclog((LOG_DEBUG,
 3270                     "%s: invalid message: wrong header size.\n", __func__));
 3271                 return (EINVAL);
 3272         }
 3273         lft_h = key_dup_lifemsg((const struct sadb_lifetime *)
 3274             mhp->ext[SADB_EXT_LIFETIME_HARD], M_IPSEC_MISC);
 3275         if (lft_h == NULL) {
 3276                 PFKEYSTAT_INC(in_nomem);
 3277                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 3278                 return (ENOBUFS);
 3279         }
 3280         lft_s = key_dup_lifemsg((const struct sadb_lifetime *)
 3281             mhp->ext[SADB_EXT_LIFETIME_SOFT], M_IPSEC_MISC);
 3282         if (lft_s == NULL) {
 3283                 PFKEYSTAT_INC(in_nomem);
 3284                 free(lft_h, M_IPSEC_MISC);
 3285                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 3286                 return (ENOBUFS);
 3287         }
 3288 reset:
 3289         if (sav->state != SADB_SASTATE_LARVAL) {
 3290                 /*
 3291                  * key_update() holds reference to this SA,
 3292                  * so it won't be deleted in meanwhile.
 3293                  */
 3294                 SECASVAR_WLOCK(sav);
 3295                 tmp = sav->lft_h;
 3296                 sav->lft_h = lft_h;
 3297                 lft_h = tmp;
 3298 
 3299                 tmp = sav->lft_s;
 3300                 sav->lft_s = lft_s;
 3301                 lft_s = tmp;
 3302                 SECASVAR_WUNLOCK(sav);
 3303                 if (lft_h != NULL)
 3304                         free(lft_h, M_IPSEC_MISC);
 3305                 if (lft_s != NULL)
 3306                         free(lft_s, M_IPSEC_MISC);
 3307                 return (0);
 3308         }
 3309         /* We can update lifetime without holding a lock */
 3310         IPSEC_ASSERT(sav->lft_h == NULL, ("lft_h is already initialized\n"));
 3311         IPSEC_ASSERT(sav->lft_s == NULL, ("lft_s is already initialized\n"));
 3312         sav->lft_h = lft_h;
 3313         sav->lft_s = lft_s;
 3314         return (0);
 3315 }
 3316 
 3317 /*
 3318  * copy SA values from PF_KEY message except *SPI, SEQ, PID and TYPE*.
 3319  * You must update these if need. Expects only LARVAL SAs.
 3320  * OUT: 0:      success.
 3321  *      !0:     failure.
 3322  */
 3323 static int
 3324 key_setsaval(struct secasvar *sav, const struct sadb_msghdr *mhp)
 3325 {
 3326         const struct sadb_sa *sa0;
 3327         const struct sadb_key *key0;
 3328         uint32_t replay;
 3329         size_t len;
 3330         int error;
 3331 
 3332         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 3333         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 3334         IPSEC_ASSERT(sav->state == SADB_SASTATE_LARVAL,
 3335             ("Attempt to update non LARVAL SA"));
 3336 
 3337         /* XXX rewrite */
 3338         error = key_setident(sav->sah, mhp);
 3339         if (error != 0)
 3340                 goto fail;
 3341 
 3342         /* SA */
 3343         if (!SADB_CHECKHDR(mhp, SADB_EXT_SA)) {
 3344                 if (SADB_CHECKLEN(mhp, SADB_EXT_SA)) {
 3345                         error = EINVAL;
 3346                         goto fail;
 3347                 }
 3348                 sa0 = (const struct sadb_sa *)mhp->ext[SADB_EXT_SA];
 3349                 sav->alg_auth = sa0->sadb_sa_auth;
 3350                 sav->alg_enc = sa0->sadb_sa_encrypt;
 3351                 sav->flags = sa0->sadb_sa_flags;
 3352                 if ((sav->flags & SADB_KEY_FLAGS_MAX) != sav->flags) {
 3353                         ipseclog((LOG_DEBUG,
 3354                             "%s: invalid sa_flags 0x%08x.\n", __func__,
 3355                             sav->flags));
 3356                         error = EINVAL;
 3357                         goto fail;
 3358                 }
 3359 
 3360                 /* Optional replay window */
 3361                 replay = 0;
 3362                 if ((sa0->sadb_sa_flags & SADB_X_EXT_OLD) == 0)
 3363                         replay = sa0->sadb_sa_replay;
 3364                 if (!SADB_CHECKHDR(mhp, SADB_X_EXT_SA_REPLAY)) {
 3365                         if (SADB_CHECKLEN(mhp, SADB_X_EXT_SA_REPLAY)) {
 3366                                 error = EINVAL;
 3367                                 goto fail;
 3368                         }
 3369                         replay = ((const struct sadb_x_sa_replay *)
 3370                             mhp->ext[SADB_X_EXT_SA_REPLAY])->sadb_x_sa_replay_replay;
 3371 
 3372                         if (replay > UINT32_MAX - 32) {
 3373                                 ipseclog((LOG_DEBUG,
 3374                                     "%s: replay window too big.\n", __func__));
 3375                                 error = EINVAL;
 3376                                 goto fail;
 3377                         }
 3378 
 3379                         replay = (replay + 7) >> 3;
 3380                 }
 3381 
 3382                 sav->replay = malloc(sizeof(struct secreplay), M_IPSEC_MISC,
 3383                     M_NOWAIT | M_ZERO);
 3384                 if (sav->replay == NULL) {
 3385                         PFKEYSTAT_INC(in_nomem);
 3386                         ipseclog((LOG_DEBUG, "%s: No more memory.\n",
 3387                             __func__));
 3388                         error = ENOBUFS;
 3389                         goto fail;
 3390                 }
 3391                 mtx_init(&sav->replay->lock, "ipsec replay", NULL, MTX_DEF);
 3392 
 3393                 if (replay != 0) {
 3394                         /* number of 32b blocks to be allocated */
 3395                         uint32_t bitmap_size;
 3396 
 3397                         /* RFC 6479:
 3398                          * - the allocated replay window size must be
 3399                          *   a power of two.
 3400                          * - use an extra 32b block as a redundant window.
 3401                          */
 3402                         bitmap_size = 1;
 3403                         while (replay + 4 > bitmap_size)
 3404                                 bitmap_size <<= 1;
 3405                         bitmap_size = bitmap_size / 4;
 3406 
 3407                         sav->replay->bitmap = malloc(
 3408                             bitmap_size * sizeof(uint32_t), M_IPSEC_MISC,
 3409                             M_NOWAIT | M_ZERO);
 3410                         if (sav->replay->bitmap == NULL) {
 3411                                 PFKEYSTAT_INC(in_nomem);
 3412                                 ipseclog((LOG_DEBUG, "%s: No more memory.\n",
 3413                                         __func__));
 3414                                 error = ENOBUFS;
 3415                                 goto fail;
 3416                         }
 3417                         sav->replay->bitmap_size = bitmap_size;
 3418                         sav->replay->wsize = replay;
 3419                 }
 3420         }
 3421 
 3422         /* Authentication keys */
 3423         if (!SADB_CHECKHDR(mhp, SADB_EXT_KEY_AUTH)) {
 3424                 if (SADB_CHECKLEN(mhp, SADB_EXT_KEY_AUTH)) {
 3425                         error = EINVAL;
 3426                         goto fail;
 3427                 }
 3428                 error = 0;
 3429                 key0 = (const struct sadb_key *)mhp->ext[SADB_EXT_KEY_AUTH];
 3430                 len = mhp->extlen[SADB_EXT_KEY_AUTH];
 3431                 switch (mhp->msg->sadb_msg_satype) {
 3432                 case SADB_SATYPE_AH:
 3433                 case SADB_SATYPE_ESP:
 3434                 case SADB_X_SATYPE_TCPSIGNATURE:
 3435                         if (len == PFKEY_ALIGN8(sizeof(struct sadb_key)) &&
 3436                             sav->alg_auth != SADB_X_AALG_NULL)
 3437                                 error = EINVAL;
 3438                         break;
 3439                 case SADB_X_SATYPE_IPCOMP:
 3440                 default:
 3441                         error = EINVAL;
 3442                         break;
 3443                 }
 3444                 if (error) {
 3445                         ipseclog((LOG_DEBUG, "%s: invalid key_auth values.\n",
 3446                                 __func__));
 3447                         goto fail;
 3448                 }
 3449 
 3450                 sav->key_auth = key_dup_keymsg(key0, len, M_IPSEC_MISC);
 3451                 if (sav->key_auth == NULL ) {
 3452                         ipseclog((LOG_DEBUG, "%s: No more memory.\n",
 3453                                   __func__));
 3454                         PFKEYSTAT_INC(in_nomem);
 3455                         error = ENOBUFS;
 3456                         goto fail;
 3457                 }
 3458         }
 3459 
 3460         /* Encryption key */
 3461         if (!SADB_CHECKHDR(mhp, SADB_EXT_KEY_ENCRYPT)) {
 3462                 if (SADB_CHECKLEN(mhp, SADB_EXT_KEY_ENCRYPT)) {
 3463                         error = EINVAL;
 3464                         goto fail;
 3465                 }
 3466                 error = 0;
 3467                 key0 = (const struct sadb_key *)mhp->ext[SADB_EXT_KEY_ENCRYPT];
 3468                 len = mhp->extlen[SADB_EXT_KEY_ENCRYPT];
 3469                 switch (mhp->msg->sadb_msg_satype) {
 3470                 case SADB_SATYPE_ESP:
 3471                         if (len == PFKEY_ALIGN8(sizeof(struct sadb_key)) &&
 3472                             sav->alg_enc != SADB_EALG_NULL) {
 3473                                 error = EINVAL;
 3474                                 break;
 3475                         }
 3476                         sav->key_enc = key_dup_keymsg(key0, len, M_IPSEC_MISC);
 3477                         if (sav->key_enc == NULL) {
 3478                                 ipseclog((LOG_DEBUG, "%s: No more memory.\n",
 3479                                         __func__));
 3480                                 PFKEYSTAT_INC(in_nomem);
 3481                                 error = ENOBUFS;
 3482                                 goto fail;
 3483                         }
 3484                         break;
 3485                 case SADB_X_SATYPE_IPCOMP:
 3486                         if (len != PFKEY_ALIGN8(sizeof(struct sadb_key)))
 3487                                 error = EINVAL;
 3488                         sav->key_enc = NULL;    /*just in case*/
 3489                         break;
 3490                 case SADB_SATYPE_AH:
 3491                 case SADB_X_SATYPE_TCPSIGNATURE:
 3492                 default:
 3493                         error = EINVAL;
 3494                         break;
 3495                 }
 3496                 if (error) {
 3497                         ipseclog((LOG_DEBUG, "%s: invalid key_enc value.\n",
 3498                                 __func__));
 3499                         goto fail;
 3500                 }
 3501         }
 3502 
 3503         /* set iv */
 3504         sav->ivlen = 0;
 3505         switch (mhp->msg->sadb_msg_satype) {
 3506         case SADB_SATYPE_AH:
 3507                 if (sav->flags & SADB_X_EXT_DERIV) {
 3508                         ipseclog((LOG_DEBUG, "%s: invalid flag (derived) "
 3509                             "given to AH SA.\n", __func__));
 3510                         error = EINVAL;
 3511                         goto fail;
 3512                 }
 3513                 if (sav->alg_enc != SADB_EALG_NONE) {
 3514                         ipseclog((LOG_DEBUG, "%s: protocol and algorithm "
 3515                             "mismated.\n", __func__));
 3516                         error = EINVAL;
 3517                         goto fail;
 3518                 }
 3519                 error = xform_init(sav, XF_AH);
 3520                 break;
 3521         case SADB_SATYPE_ESP:
 3522                 if ((sav->flags & (SADB_X_EXT_OLD | SADB_X_EXT_DERIV)) ==
 3523                     (SADB_X_EXT_OLD | SADB_X_EXT_DERIV)) {
 3524                         ipseclog((LOG_DEBUG, "%s: invalid flag (derived) "
 3525                             "given to old-esp.\n", __func__));
 3526                         error = EINVAL;
 3527                         goto fail;
 3528                 }
 3529                 error = xform_init(sav, XF_ESP);
 3530                 break;
 3531         case SADB_X_SATYPE_IPCOMP:
 3532                 if (sav->alg_auth != SADB_AALG_NONE) {
 3533                         ipseclog((LOG_DEBUG, "%s: protocol and algorithm "
 3534                             "mismated.\n", __func__));
 3535                         error = EINVAL;
 3536                         goto fail;
 3537                 }
 3538                 if ((sav->flags & SADB_X_EXT_RAWCPI) == 0 &&
 3539                     ntohl(sav->spi) >= 0x10000) {
 3540                         ipseclog((LOG_DEBUG, "%s: invalid cpi for IPComp.\n",
 3541                             __func__));
 3542                         error = EINVAL;
 3543                         goto fail;
 3544                 }
 3545                 error = xform_init(sav, XF_IPCOMP);
 3546                 break;
 3547         case SADB_X_SATYPE_TCPSIGNATURE:
 3548                 if (sav->alg_enc != SADB_EALG_NONE) {
 3549                         ipseclog((LOG_DEBUG, "%s: protocol and algorithm "
 3550                             "mismated.\n", __func__));
 3551                         error = EINVAL;
 3552                         goto fail;
 3553                 }
 3554                 error = xform_init(sav, XF_TCPSIGNATURE);
 3555                 break;
 3556         default:
 3557                 ipseclog((LOG_DEBUG, "%s: Invalid satype.\n", __func__));
 3558                 error = EPROTONOSUPPORT;
 3559                 goto fail;
 3560         }
 3561         if (error) {
 3562                 ipseclog((LOG_DEBUG, "%s: unable to initialize SA type %u.\n",
 3563                     __func__, mhp->msg->sadb_msg_satype));
 3564                 goto fail;
 3565         }
 3566 
 3567         /* Handle NAT-T headers */
 3568         error = key_setnatt(sav, mhp);
 3569         if (error != 0)
 3570                 goto fail;
 3571 
 3572         /* Initialize lifetime for CURRENT */
 3573         sav->firstused = 0;
 3574         sav->created = time_second;
 3575 
 3576         /* lifetimes for HARD and SOFT */
 3577         error = key_updatelifetimes(sav, mhp);
 3578         if (error == 0)
 3579                 return (0);
 3580 fail:
 3581         key_cleansav(sav);
 3582         return (error);
 3583 }
 3584 
 3585 /*
 3586  * subroutine for SADB_GET and SADB_DUMP.
 3587  */
 3588 static struct mbuf *
 3589 key_setdumpsa(struct secasvar *sav, uint8_t type, uint8_t satype,
 3590     uint32_t seq, uint32_t pid)
 3591 {
 3592         struct seclifetime lft_c;
 3593         struct mbuf *result = NULL, *tres = NULL, *m;
 3594         int i, dumporder[] = {
 3595                 SADB_EXT_SA, SADB_X_EXT_SA2, SADB_X_EXT_SA_REPLAY,
 3596                 SADB_EXT_LIFETIME_HARD, SADB_EXT_LIFETIME_SOFT,
 3597                 SADB_EXT_LIFETIME_CURRENT, SADB_EXT_ADDRESS_SRC,
 3598                 SADB_EXT_ADDRESS_DST, SADB_EXT_ADDRESS_PROXY,
 3599                 SADB_EXT_KEY_AUTH, SADB_EXT_KEY_ENCRYPT,
 3600                 SADB_EXT_IDENTITY_SRC, SADB_EXT_IDENTITY_DST,
 3601                 SADB_EXT_SENSITIVITY,
 3602                 SADB_X_EXT_NAT_T_TYPE,
 3603                 SADB_X_EXT_NAT_T_SPORT, SADB_X_EXT_NAT_T_DPORT,
 3604                 SADB_X_EXT_NAT_T_OAI, SADB_X_EXT_NAT_T_OAR,
 3605                 SADB_X_EXT_NAT_T_FRAG,
 3606         };
 3607         uint32_t replay_count;
 3608 
 3609         SECASVAR_RLOCK_TRACKER;
 3610 
 3611         m = key_setsadbmsg(type, 0, satype, seq, pid, sav->refcnt);
 3612         if (m == NULL)
 3613                 goto fail;
 3614         result = m;
 3615 
 3616         for (i = nitems(dumporder) - 1; i >= 0; i--) {
 3617                 m = NULL;
 3618                 switch (dumporder[i]) {
 3619                 case SADB_EXT_SA:
 3620                         m = key_setsadbsa(sav);
 3621                         if (!m)
 3622                                 goto fail;
 3623                         break;
 3624 
 3625                 case SADB_X_EXT_SA2: {
 3626                         SECASVAR_RLOCK(sav);
 3627                         replay_count = sav->replay ? sav->replay->count : 0;
 3628                         SECASVAR_RUNLOCK(sav);
 3629                         m = key_setsadbxsa2(sav->sah->saidx.mode, replay_count,
 3630                                         sav->sah->saidx.reqid);
 3631                         if (!m)
 3632                                 goto fail;
 3633                         break;
 3634                 }
 3635                 case SADB_X_EXT_SA_REPLAY:
 3636                         if (sav->replay == NULL ||
 3637                             sav->replay->wsize <= UINT8_MAX)
 3638                                 continue;
 3639 
 3640                         m = key_setsadbxsareplay(sav->replay->wsize);
 3641                         if (!m)
 3642                                 goto fail;
 3643                         break;
 3644 
 3645                 case SADB_EXT_ADDRESS_SRC:
 3646                         m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC,
 3647                             &sav->sah->saidx.src.sa,
 3648                             FULLMASK, IPSEC_ULPROTO_ANY);
 3649                         if (!m)
 3650                                 goto fail;
 3651                         break;
 3652 
 3653                 case SADB_EXT_ADDRESS_DST:
 3654                         m = key_setsadbaddr(SADB_EXT_ADDRESS_DST,
 3655                             &sav->sah->saidx.dst.sa,
 3656                             FULLMASK, IPSEC_ULPROTO_ANY);
 3657                         if (!m)
 3658                                 goto fail;
 3659                         break;
 3660 
 3661                 case SADB_EXT_KEY_AUTH:
 3662                         if (!sav->key_auth)
 3663                                 continue;
 3664                         m = key_setkey(sav->key_auth, SADB_EXT_KEY_AUTH);
 3665                         if (!m)
 3666                                 goto fail;
 3667                         break;
 3668 
 3669                 case SADB_EXT_KEY_ENCRYPT:
 3670                         if (!sav->key_enc)
 3671                                 continue;
 3672                         m = key_setkey(sav->key_enc, SADB_EXT_KEY_ENCRYPT);
 3673                         if (!m)
 3674                                 goto fail;
 3675                         break;
 3676 
 3677                 case SADB_EXT_LIFETIME_CURRENT:
 3678                         lft_c.addtime = sav->created;
 3679                         lft_c.allocations = (uint32_t)counter_u64_fetch(
 3680                             sav->lft_c_allocations);
 3681                         lft_c.bytes = counter_u64_fetch(sav->lft_c_bytes);
 3682                         lft_c.usetime = sav->firstused;
 3683                         m = key_setlifetime(&lft_c, SADB_EXT_LIFETIME_CURRENT);
 3684                         if (!m)
 3685                                 goto fail;
 3686                         break;
 3687 
 3688                 case SADB_EXT_LIFETIME_HARD:
 3689                         if (!sav->lft_h)
 3690                                 continue;
 3691                         m = key_setlifetime(sav->lft_h, 
 3692                                             SADB_EXT_LIFETIME_HARD);
 3693                         if (!m)
 3694                                 goto fail;
 3695                         break;
 3696 
 3697                 case SADB_EXT_LIFETIME_SOFT:
 3698                         if (!sav->lft_s)
 3699                                 continue;
 3700                         m = key_setlifetime(sav->lft_s, 
 3701                                             SADB_EXT_LIFETIME_SOFT);
 3702 
 3703                         if (!m)
 3704                                 goto fail;
 3705                         break;
 3706 
 3707                 case SADB_X_EXT_NAT_T_TYPE:
 3708                         if (sav->natt == NULL)
 3709                                 continue;
 3710                         m = key_setsadbxtype(UDP_ENCAP_ESPINUDP);
 3711                         if (!m)
 3712                                 goto fail;
 3713                         break;
 3714 
 3715                 case SADB_X_EXT_NAT_T_DPORT:
 3716                         if (sav->natt == NULL)
 3717                                 continue;
 3718                         m = key_setsadbxport(sav->natt->dport,
 3719                             SADB_X_EXT_NAT_T_DPORT);
 3720                         if (!m)
 3721                                 goto fail;
 3722                         break;
 3723 
 3724                 case SADB_X_EXT_NAT_T_SPORT:
 3725                         if (sav->natt == NULL)
 3726                                 continue;
 3727                         m = key_setsadbxport(sav->natt->sport,
 3728                             SADB_X_EXT_NAT_T_SPORT);
 3729                         if (!m)
 3730                                 goto fail;
 3731                         break;
 3732 
 3733                 case SADB_X_EXT_NAT_T_OAI:
 3734                         if (sav->natt == NULL ||
 3735                             (sav->natt->flags & IPSEC_NATT_F_OAI) == 0)
 3736                                 continue;
 3737                         m = key_setsadbaddr(SADB_X_EXT_NAT_T_OAI,
 3738                             &sav->natt->oai.sa, FULLMASK, IPSEC_ULPROTO_ANY);
 3739                         if (!m)
 3740                                 goto fail;
 3741                         break;
 3742                 case SADB_X_EXT_NAT_T_OAR:
 3743                         if (sav->natt == NULL ||
 3744                             (sav->natt->flags & IPSEC_NATT_F_OAR) == 0)
 3745                                 continue;
 3746                         m = key_setsadbaddr(SADB_X_EXT_NAT_T_OAR,
 3747                             &sav->natt->oar.sa, FULLMASK, IPSEC_ULPROTO_ANY);
 3748                         if (!m)
 3749                                 goto fail;
 3750                         break;
 3751                 case SADB_X_EXT_NAT_T_FRAG:
 3752                         /* We do not (yet) support those. */
 3753                         continue;
 3754 
 3755                 case SADB_EXT_ADDRESS_PROXY:
 3756                 case SADB_EXT_IDENTITY_SRC:
 3757                 case SADB_EXT_IDENTITY_DST:
 3758                         /* XXX: should we brought from SPD ? */
 3759                 case SADB_EXT_SENSITIVITY:
 3760                 default:
 3761                         continue;
 3762                 }
 3763 
 3764                 if (!m)
 3765                         goto fail;
 3766                 if (tres)
 3767                         m_cat(m, tres);
 3768                 tres = m;
 3769         }
 3770 
 3771         m_cat(result, tres);
 3772         tres = NULL;
 3773         if (result->m_len < sizeof(struct sadb_msg)) {
 3774                 result = m_pullup(result, sizeof(struct sadb_msg));
 3775                 if (result == NULL)
 3776                         goto fail;
 3777         }
 3778 
 3779         result->m_pkthdr.len = 0;
 3780         for (m = result; m; m = m->m_next)
 3781                 result->m_pkthdr.len += m->m_len;
 3782 
 3783         mtod(result, struct sadb_msg *)->sadb_msg_len =
 3784             PFKEY_UNIT64(result->m_pkthdr.len);
 3785 
 3786         return result;
 3787 
 3788 fail:
 3789         m_freem(result);
 3790         m_freem(tres);
 3791         return NULL;
 3792 }
 3793 
 3794 /*
 3795  * set data into sadb_msg.
 3796  */
 3797 static struct mbuf *
 3798 key_setsadbmsg(u_int8_t type, u_int16_t tlen, u_int8_t satype, u_int32_t seq,
 3799     pid_t pid, u_int16_t reserved)
 3800 {
 3801         struct mbuf *m;
 3802         struct sadb_msg *p;
 3803         int len;
 3804 
 3805         len = PFKEY_ALIGN8(sizeof(struct sadb_msg));
 3806         if (len > MCLBYTES)
 3807                 return NULL;
 3808         m = key_mget(len);
 3809         if (m == NULL)
 3810                 return NULL;
 3811         m->m_pkthdr.len = m->m_len = len;
 3812         m->m_next = NULL;
 3813 
 3814         p = mtod(m, struct sadb_msg *);
 3815 
 3816         bzero(p, len);
 3817         p->sadb_msg_version = PF_KEY_V2;
 3818         p->sadb_msg_type = type;
 3819         p->sadb_msg_errno = 0;
 3820         p->sadb_msg_satype = satype;
 3821         p->sadb_msg_len = PFKEY_UNIT64(tlen);
 3822         p->sadb_msg_reserved = reserved;
 3823         p->sadb_msg_seq = seq;
 3824         p->sadb_msg_pid = (u_int32_t)pid;
 3825 
 3826         return m;
 3827 }
 3828 
 3829 /*
 3830  * copy secasvar data into sadb_address.
 3831  */
 3832 static struct mbuf *
 3833 key_setsadbsa(struct secasvar *sav)
 3834 {
 3835         struct mbuf *m;
 3836         struct sadb_sa *p;
 3837         int len;
 3838 
 3839         len = PFKEY_ALIGN8(sizeof(struct sadb_sa));
 3840         m = m_get2(len, M_NOWAIT, MT_DATA, 0);
 3841         if (m == NULL)
 3842                 return (NULL);
 3843         m_align(m, len);
 3844         m->m_len = len;
 3845         p = mtod(m, struct sadb_sa *);
 3846         bzero(p, len);
 3847         p->sadb_sa_len = PFKEY_UNIT64(len);
 3848         p->sadb_sa_exttype = SADB_EXT_SA;
 3849         p->sadb_sa_spi = sav->spi;
 3850         p->sadb_sa_replay = sav->replay ?
 3851             (sav->replay->wsize > UINT8_MAX ? UINT8_MAX :
 3852                 sav->replay->wsize): 0;
 3853         p->sadb_sa_state = sav->state;
 3854         p->sadb_sa_auth = sav->alg_auth;
 3855         p->sadb_sa_encrypt = sav->alg_enc;
 3856         p->sadb_sa_flags = sav->flags & SADB_KEY_FLAGS_MAX;
 3857         return (m);
 3858 }
 3859 
 3860 /*
 3861  * set data into sadb_address.
 3862  */
 3863 static struct mbuf *
 3864 key_setsadbaddr(u_int16_t exttype, const struct sockaddr *saddr,
 3865     u_int8_t prefixlen, u_int16_t ul_proto)
 3866 {
 3867         struct mbuf *m;
 3868         struct sadb_address *p;
 3869         size_t len;
 3870 
 3871         len = PFKEY_ALIGN8(sizeof(struct sadb_address)) +
 3872             PFKEY_ALIGN8(saddr->sa_len);
 3873         m = m_get2(len, M_NOWAIT, MT_DATA, 0);
 3874         if (m == NULL)
 3875                 return (NULL);
 3876         m_align(m, len);
 3877         m->m_len = len;
 3878         p = mtod(m, struct sadb_address *);
 3879 
 3880         bzero(p, len);
 3881         p->sadb_address_len = PFKEY_UNIT64(len);
 3882         p->sadb_address_exttype = exttype;
 3883         p->sadb_address_proto = ul_proto;
 3884         if (prefixlen == FULLMASK) {
 3885                 switch (saddr->sa_family) {
 3886                 case AF_INET:
 3887                         prefixlen = sizeof(struct in_addr) << 3;
 3888                         break;
 3889                 case AF_INET6:
 3890                         prefixlen = sizeof(struct in6_addr) << 3;
 3891                         break;
 3892                 default:
 3893                         ; /*XXX*/
 3894                 }
 3895         }
 3896         p->sadb_address_prefixlen = prefixlen;
 3897         p->sadb_address_reserved = 0;
 3898 
 3899         bcopy(saddr,
 3900             mtod(m, caddr_t) + PFKEY_ALIGN8(sizeof(struct sadb_address)),
 3901             saddr->sa_len);
 3902 
 3903         return m;
 3904 }
 3905 
 3906 /*
 3907  * set data into sadb_x_sa2.
 3908  */
 3909 static struct mbuf *
 3910 key_setsadbxsa2(u_int8_t mode, u_int32_t seq, u_int32_t reqid)
 3911 {
 3912         struct mbuf *m;
 3913         struct sadb_x_sa2 *p;
 3914         size_t len;
 3915 
 3916         len = PFKEY_ALIGN8(sizeof(struct sadb_x_sa2));
 3917         m = m_get2(len, M_NOWAIT, MT_DATA, 0);
 3918         if (m == NULL)
 3919                 return (NULL);
 3920         m_align(m, len);
 3921         m->m_len = len;
 3922         p = mtod(m, struct sadb_x_sa2 *);
 3923 
 3924         bzero(p, len);
 3925         p->sadb_x_sa2_len = PFKEY_UNIT64(len);
 3926         p->sadb_x_sa2_exttype = SADB_X_EXT_SA2;
 3927         p->sadb_x_sa2_mode = mode;
 3928         p->sadb_x_sa2_reserved1 = 0;
 3929         p->sadb_x_sa2_reserved2 = 0;
 3930         p->sadb_x_sa2_sequence = seq;
 3931         p->sadb_x_sa2_reqid = reqid;
 3932 
 3933         return m;
 3934 }
 3935 
 3936 /*
 3937  * Set data into sadb_x_sa_replay.
 3938  */
 3939 static struct mbuf *
 3940 key_setsadbxsareplay(u_int32_t replay)
 3941 {
 3942         struct mbuf *m;
 3943         struct sadb_x_sa_replay *p;
 3944         size_t len;
 3945 
 3946         len = PFKEY_ALIGN8(sizeof(struct sadb_x_sa_replay));
 3947         m = m_get2(len, M_NOWAIT, MT_DATA, 0);
 3948         if (m == NULL)
 3949                 return (NULL);
 3950         m_align(m, len);
 3951         m->m_len = len;
 3952         p = mtod(m, struct sadb_x_sa_replay *);
 3953 
 3954         bzero(p, len);
 3955         p->sadb_x_sa_replay_len = PFKEY_UNIT64(len);
 3956         p->sadb_x_sa_replay_exttype = SADB_X_EXT_SA_REPLAY;
 3957         p->sadb_x_sa_replay_replay = (replay << 3);
 3958 
 3959         return m;
 3960 }
 3961 
 3962 /*
 3963  * Set a type in sadb_x_nat_t_type.
 3964  */
 3965 static struct mbuf *
 3966 key_setsadbxtype(u_int16_t type)
 3967 {
 3968         struct mbuf *m;
 3969         size_t len;
 3970         struct sadb_x_nat_t_type *p;
 3971 
 3972         len = PFKEY_ALIGN8(sizeof(struct sadb_x_nat_t_type));
 3973 
 3974         m = m_get2(len, M_NOWAIT, MT_DATA, 0);
 3975         if (m == NULL)
 3976                 return (NULL);
 3977         m_align(m, len);
 3978         m->m_len = len;
 3979         p = mtod(m, struct sadb_x_nat_t_type *);
 3980 
 3981         bzero(p, len);
 3982         p->sadb_x_nat_t_type_len = PFKEY_UNIT64(len);
 3983         p->sadb_x_nat_t_type_exttype = SADB_X_EXT_NAT_T_TYPE;
 3984         p->sadb_x_nat_t_type_type = type;
 3985 
 3986         return (m);
 3987 }
 3988 /*
 3989  * Set a port in sadb_x_nat_t_port.
 3990  * In contrast to default RFC 2367 behaviour, port is in network byte order.
 3991  */
 3992 static struct mbuf *
 3993 key_setsadbxport(u_int16_t port, u_int16_t type)
 3994 {
 3995         struct mbuf *m;
 3996         size_t len;
 3997         struct sadb_x_nat_t_port *p;
 3998 
 3999         len = PFKEY_ALIGN8(sizeof(struct sadb_x_nat_t_port));
 4000 
 4001         m = m_get2(len, M_NOWAIT, MT_DATA, 0);
 4002         if (m == NULL)
 4003                 return (NULL);
 4004         m_align(m, len);
 4005         m->m_len = len;
 4006         p = mtod(m, struct sadb_x_nat_t_port *);
 4007 
 4008         bzero(p, len);
 4009         p->sadb_x_nat_t_port_len = PFKEY_UNIT64(len);
 4010         p->sadb_x_nat_t_port_exttype = type;
 4011         p->sadb_x_nat_t_port_port = port;
 4012 
 4013         return (m);
 4014 }
 4015 
 4016 /*
 4017  * Get port from sockaddr. Port is in network byte order.
 4018  */
 4019 uint16_t
 4020 key_portfromsaddr(struct sockaddr *sa)
 4021 {
 4022 
 4023         switch (sa->sa_family) {
 4024 #ifdef INET
 4025         case AF_INET:
 4026                 return ((struct sockaddr_in *)sa)->sin_port;
 4027 #endif
 4028 #ifdef INET6
 4029         case AF_INET6:
 4030                 return ((struct sockaddr_in6 *)sa)->sin6_port;
 4031 #endif
 4032         }
 4033         return (0);
 4034 }
 4035 
 4036 /*
 4037  * Set port in struct sockaddr. Port is in network byte order.
 4038  */
 4039 void
 4040 key_porttosaddr(struct sockaddr *sa, uint16_t port)
 4041 {
 4042 
 4043         switch (sa->sa_family) {
 4044 #ifdef INET
 4045         case AF_INET:
 4046                 ((struct sockaddr_in *)sa)->sin_port = port;
 4047                 break;
 4048 #endif
 4049 #ifdef INET6
 4050         case AF_INET6:
 4051                 ((struct sockaddr_in6 *)sa)->sin6_port = port;
 4052                 break;
 4053 #endif
 4054         default:
 4055                 ipseclog((LOG_DEBUG, "%s: unexpected address family %d.\n",
 4056                         __func__, sa->sa_family));
 4057                 break;
 4058         }
 4059 }
 4060 
 4061 /*
 4062  * set data into sadb_x_policy
 4063  */
 4064 static struct mbuf *
 4065 key_setsadbxpolicy(u_int16_t type, u_int8_t dir, u_int32_t id, u_int32_t priority)
 4066 {
 4067         struct mbuf *m;
 4068         struct sadb_x_policy *p;
 4069         size_t len;
 4070 
 4071         len = PFKEY_ALIGN8(sizeof(struct sadb_x_policy));
 4072         m = m_get2(len, M_NOWAIT, MT_DATA, 0);
 4073         if (m == NULL)
 4074                 return (NULL);
 4075         m_align(m, len);
 4076         m->m_len = len;
 4077         p = mtod(m, struct sadb_x_policy *);
 4078 
 4079         bzero(p, len);
 4080         p->sadb_x_policy_len = PFKEY_UNIT64(len);
 4081         p->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
 4082         p->sadb_x_policy_type = type;
 4083         p->sadb_x_policy_dir = dir;
 4084         p->sadb_x_policy_id = id;
 4085         p->sadb_x_policy_priority = priority;
 4086 
 4087         return m;
 4088 }
 4089 
 4090 /* %%% utilities */
 4091 /* Take a key message (sadb_key) from the socket and turn it into one
 4092  * of the kernel's key structures (seckey).
 4093  *
 4094  * IN: pointer to the src
 4095  * OUT: NULL no more memory
 4096  */
 4097 struct seckey *
 4098 key_dup_keymsg(const struct sadb_key *src, size_t len,
 4099     struct malloc_type *type)
 4100 {
 4101         struct seckey *dst;
 4102 
 4103         dst = malloc(sizeof(*dst), type, M_NOWAIT);
 4104         if (dst != NULL) {
 4105                 dst->bits = src->sadb_key_bits;
 4106                 dst->key_data = malloc(len, type, M_NOWAIT);
 4107                 if (dst->key_data != NULL) {
 4108                         bcopy((const char *)(src + 1), dst->key_data, len);
 4109                 } else {
 4110                         ipseclog((LOG_DEBUG, "%s: No more memory.\n",
 4111                             __func__));
 4112                         free(dst, type);
 4113                         dst = NULL;
 4114                 }
 4115         } else {
 4116                 ipseclog((LOG_DEBUG, "%s: No more memory.\n",
 4117                     __func__));
 4118         }
 4119         return (dst);
 4120 }
 4121 
 4122 /* Take a lifetime message (sadb_lifetime) passed in on a socket and
 4123  * turn it into one of the kernel's lifetime structures (seclifetime).
 4124  *
 4125  * IN: pointer to the destination, source and malloc type
 4126  * OUT: NULL, no more memory
 4127  */
 4128 
 4129 static struct seclifetime *
 4130 key_dup_lifemsg(const struct sadb_lifetime *src, struct malloc_type *type)
 4131 {
 4132         struct seclifetime *dst;
 4133 
 4134         dst = malloc(sizeof(*dst), type, M_NOWAIT);
 4135         if (dst == NULL) {
 4136                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 4137                 return (NULL);
 4138         }
 4139         dst->allocations = src->sadb_lifetime_allocations;
 4140         dst->bytes = src->sadb_lifetime_bytes;
 4141         dst->addtime = src->sadb_lifetime_addtime;
 4142         dst->usetime = src->sadb_lifetime_usetime;
 4143         return (dst);
 4144 }
 4145 
 4146 /*
 4147  * compare two secasindex structure.
 4148  * flag can specify to compare 2 saidxes.
 4149  * compare two secasindex structure without both mode and reqid.
 4150  * don't compare port.
 4151  * IN:  
 4152  *      saidx0: source, it can be in SAD.
 4153  *      saidx1: object.
 4154  * OUT: 
 4155  *      1 : equal
 4156  *      0 : not equal
 4157  */
 4158 static int
 4159 key_cmpsaidx(const struct secasindex *saidx0, const struct secasindex *saidx1,
 4160     int flag)
 4161 {
 4162 
 4163         /* sanity */
 4164         if (saidx0 == NULL && saidx1 == NULL)
 4165                 return 1;
 4166 
 4167         if (saidx0 == NULL || saidx1 == NULL)
 4168                 return 0;
 4169 
 4170         if (saidx0->proto != saidx1->proto)
 4171                 return 0;
 4172 
 4173         if (flag == CMP_EXACTLY) {
 4174                 if (saidx0->mode != saidx1->mode)
 4175                         return 0;
 4176                 if (saidx0->reqid != saidx1->reqid)
 4177                         return 0;
 4178                 if (bcmp(&saidx0->src, &saidx1->src,
 4179                     saidx0->src.sa.sa_len) != 0 ||
 4180                     bcmp(&saidx0->dst, &saidx1->dst,
 4181                     saidx0->dst.sa.sa_len) != 0)
 4182                         return 0;
 4183         } else {
 4184                 /* CMP_MODE_REQID, CMP_REQID, CMP_HEAD */
 4185                 if (flag == CMP_MODE_REQID || flag == CMP_REQID) {
 4186                         /*
 4187                          * If reqid of SPD is non-zero, unique SA is required.
 4188                          * The result must be of same reqid in this case.
 4189                          */
 4190                         if (saidx1->reqid != 0 &&
 4191                             saidx0->reqid != saidx1->reqid)
 4192                                 return 0;
 4193                 }
 4194 
 4195                 if (flag == CMP_MODE_REQID) {
 4196                         if (saidx0->mode != IPSEC_MODE_ANY
 4197                          && saidx0->mode != saidx1->mode)
 4198                                 return 0;
 4199                 }
 4200 
 4201                 if (key_sockaddrcmp(&saidx0->src.sa, &saidx1->src.sa, 0) != 0)
 4202                         return 0;
 4203                 if (key_sockaddrcmp(&saidx0->dst.sa, &saidx1->dst.sa, 0) != 0)
 4204                         return 0;
 4205         }
 4206 
 4207         return 1;
 4208 }
 4209 
 4210 /*
 4211  * compare two secindex structure exactly.
 4212  * IN:
 4213  *      spidx0: source, it is often in SPD.
 4214  *      spidx1: object, it is often from PFKEY message.
 4215  * OUT:
 4216  *      1 : equal
 4217  *      0 : not equal
 4218  */
 4219 static int
 4220 key_cmpspidx_exactly(struct secpolicyindex *spidx0,
 4221     struct secpolicyindex *spidx1)
 4222 {
 4223         /* sanity */
 4224         if (spidx0 == NULL && spidx1 == NULL)
 4225                 return 1;
 4226 
 4227         if (spidx0 == NULL || spidx1 == NULL)
 4228                 return 0;
 4229 
 4230         if (spidx0->prefs != spidx1->prefs
 4231          || spidx0->prefd != spidx1->prefd
 4232          || spidx0->ul_proto != spidx1->ul_proto
 4233          || spidx0->dir != spidx1->dir)
 4234                 return 0;
 4235 
 4236         return key_sockaddrcmp(&spidx0->src.sa, &spidx1->src.sa, 1) == 0 &&
 4237                key_sockaddrcmp(&spidx0->dst.sa, &spidx1->dst.sa, 1) == 0;
 4238 }
 4239 
 4240 /*
 4241  * compare two secindex structure with mask.
 4242  * IN:
 4243  *      spidx0: source, it is often in SPD.
 4244  *      spidx1: object, it is often from IP header.
 4245  * OUT:
 4246  *      1 : equal
 4247  *      0 : not equal
 4248  */
 4249 static int
 4250 key_cmpspidx_withmask(struct secpolicyindex *spidx0,
 4251     struct secpolicyindex *spidx1)
 4252 {
 4253         /* sanity */
 4254         if (spidx0 == NULL && spidx1 == NULL)
 4255                 return 1;
 4256 
 4257         if (spidx0 == NULL || spidx1 == NULL)
 4258                 return 0;
 4259 
 4260         if (spidx0->src.sa.sa_family != spidx1->src.sa.sa_family ||
 4261             spidx0->dst.sa.sa_family != spidx1->dst.sa.sa_family ||
 4262             spidx0->src.sa.sa_len != spidx1->src.sa.sa_len ||
 4263             spidx0->dst.sa.sa_len != spidx1->dst.sa.sa_len)
 4264                 return 0;
 4265 
 4266         /* if spidx.ul_proto == IPSEC_ULPROTO_ANY, ignore. */
 4267         if (spidx0->ul_proto != (u_int16_t)IPSEC_ULPROTO_ANY
 4268          && spidx0->ul_proto != spidx1->ul_proto)
 4269                 return 0;
 4270 
 4271         switch (spidx0->src.sa.sa_family) {
 4272         case AF_INET:
 4273                 if (spidx0->src.sin.sin_port != IPSEC_PORT_ANY
 4274                  && spidx0->src.sin.sin_port != spidx1->src.sin.sin_port)
 4275                         return 0;
 4276                 if (!key_bbcmp(&spidx0->src.sin.sin_addr,
 4277                     &spidx1->src.sin.sin_addr, spidx0->prefs))
 4278                         return 0;
 4279                 break;
 4280         case AF_INET6:
 4281                 if (spidx0->src.sin6.sin6_port != IPSEC_PORT_ANY
 4282                  && spidx0->src.sin6.sin6_port != spidx1->src.sin6.sin6_port)
 4283                         return 0;
 4284                 /*
 4285                  * scope_id check. if sin6_scope_id is 0, we regard it
 4286                  * as a wildcard scope, which matches any scope zone ID. 
 4287                  */
 4288                 if (spidx0->src.sin6.sin6_scope_id &&
 4289                     spidx1->src.sin6.sin6_scope_id &&
 4290                     spidx0->src.sin6.sin6_scope_id != spidx1->src.sin6.sin6_scope_id)
 4291                         return 0;
 4292                 if (!key_bbcmp(&spidx0->src.sin6.sin6_addr,
 4293                     &spidx1->src.sin6.sin6_addr, spidx0->prefs))
 4294                         return 0;
 4295                 break;
 4296         default:
 4297                 /* XXX */
 4298                 if (bcmp(&spidx0->src, &spidx1->src, spidx0->src.sa.sa_len) != 0)
 4299                         return 0;
 4300                 break;
 4301         }
 4302 
 4303         switch (spidx0->dst.sa.sa_family) {
 4304         case AF_INET:
 4305                 if (spidx0->dst.sin.sin_port != IPSEC_PORT_ANY
 4306                  && spidx0->dst.sin.sin_port != spidx1->dst.sin.sin_port)
 4307                         return 0;
 4308                 if (!key_bbcmp(&spidx0->dst.sin.sin_addr,
 4309                     &spidx1->dst.sin.sin_addr, spidx0->prefd))
 4310                         return 0;
 4311                 break;
 4312         case AF_INET6:
 4313                 if (spidx0->dst.sin6.sin6_port != IPSEC_PORT_ANY
 4314                  && spidx0->dst.sin6.sin6_port != spidx1->dst.sin6.sin6_port)
 4315                         return 0;
 4316                 /*
 4317                  * scope_id check. if sin6_scope_id is 0, we regard it
 4318                  * as a wildcard scope, which matches any scope zone ID. 
 4319                  */
 4320                 if (spidx0->dst.sin6.sin6_scope_id &&
 4321                     spidx1->dst.sin6.sin6_scope_id &&
 4322                     spidx0->dst.sin6.sin6_scope_id != spidx1->dst.sin6.sin6_scope_id)
 4323                         return 0;
 4324                 if (!key_bbcmp(&spidx0->dst.sin6.sin6_addr,
 4325                     &spidx1->dst.sin6.sin6_addr, spidx0->prefd))
 4326                         return 0;
 4327                 break;
 4328         default:
 4329                 /* XXX */
 4330                 if (bcmp(&spidx0->dst, &spidx1->dst, spidx0->dst.sa.sa_len) != 0)
 4331                         return 0;
 4332                 break;
 4333         }
 4334 
 4335         /* XXX Do we check other field ?  e.g. flowinfo */
 4336 
 4337         return 1;
 4338 }
 4339 
 4340 #ifdef satosin
 4341 #undef satosin
 4342 #endif
 4343 #define satosin(s) ((const struct sockaddr_in *)s)
 4344 #ifdef satosin6
 4345 #undef satosin6
 4346 #endif
 4347 #define satosin6(s) ((const struct sockaddr_in6 *)s)
 4348 /* returns 0 on match */
 4349 int
 4350 key_sockaddrcmp(const struct sockaddr *sa1, const struct sockaddr *sa2,
 4351     int port)
 4352 {
 4353         if (sa1->sa_family != sa2->sa_family || sa1->sa_len != sa2->sa_len)
 4354                 return 1;
 4355 
 4356         switch (sa1->sa_family) {
 4357 #ifdef INET
 4358         case AF_INET:
 4359                 if (sa1->sa_len != sizeof(struct sockaddr_in))
 4360                         return 1;
 4361                 if (satosin(sa1)->sin_addr.s_addr !=
 4362                     satosin(sa2)->sin_addr.s_addr) {
 4363                         return 1;
 4364                 }
 4365                 if (port && satosin(sa1)->sin_port != satosin(sa2)->sin_port)
 4366                         return 1;
 4367                 break;
 4368 #endif
 4369 #ifdef INET6
 4370         case AF_INET6:
 4371                 if (sa1->sa_len != sizeof(struct sockaddr_in6))
 4372                         return 1;       /*EINVAL*/
 4373                 if (satosin6(sa1)->sin6_scope_id !=
 4374                     satosin6(sa2)->sin6_scope_id) {
 4375                         return 1;
 4376                 }
 4377                 if (!IN6_ARE_ADDR_EQUAL(&satosin6(sa1)->sin6_addr,
 4378                     &satosin6(sa2)->sin6_addr)) {
 4379                         return 1;
 4380                 }
 4381                 if (port &&
 4382                     satosin6(sa1)->sin6_port != satosin6(sa2)->sin6_port) {
 4383                         return 1;
 4384                 }
 4385                 break;
 4386 #endif
 4387         default:
 4388                 if (bcmp(sa1, sa2, sa1->sa_len) != 0)
 4389                         return 1;
 4390                 break;
 4391         }
 4392 
 4393         return 0;
 4394 }
 4395 
 4396 /* returns 0 on match */
 4397 int
 4398 key_sockaddrcmp_withmask(const struct sockaddr *sa1,
 4399     const struct sockaddr *sa2, size_t mask)
 4400 {
 4401         if (sa1->sa_family != sa2->sa_family || sa1->sa_len != sa2->sa_len)
 4402                 return (1);
 4403 
 4404         switch (sa1->sa_family) {
 4405 #ifdef INET
 4406         case AF_INET:
 4407                 return (!key_bbcmp(&satosin(sa1)->sin_addr,
 4408                     &satosin(sa2)->sin_addr, mask));
 4409 #endif
 4410 #ifdef INET6
 4411         case AF_INET6:
 4412                 if (satosin6(sa1)->sin6_scope_id !=
 4413                     satosin6(sa2)->sin6_scope_id)
 4414                         return (1);
 4415                 return (!key_bbcmp(&satosin6(sa1)->sin6_addr,
 4416                     &satosin6(sa2)->sin6_addr, mask));
 4417 #endif
 4418         }
 4419         return (1);
 4420 }
 4421 #undef satosin
 4422 #undef satosin6
 4423 
 4424 /*
 4425  * compare two buffers with mask.
 4426  * IN:
 4427  *      addr1: source
 4428  *      addr2: object
 4429  *      bits:  Number of bits to compare
 4430  * OUT:
 4431  *      1 : equal
 4432  *      0 : not equal
 4433  */
 4434 static int
 4435 key_bbcmp(const void *a1, const void *a2, u_int bits)
 4436 {
 4437         const unsigned char *p1 = a1;
 4438         const unsigned char *p2 = a2;
 4439 
 4440         /* XXX: This could be considerably faster if we compare a word
 4441          * at a time, but it is complicated on LSB Endian machines */
 4442 
 4443         /* Handle null pointers */
 4444         if (p1 == NULL || p2 == NULL)
 4445                 return (p1 == p2);
 4446 
 4447         while (bits >= 8) {
 4448                 if (*p1++ != *p2++)
 4449                         return 0;
 4450                 bits -= 8;
 4451         }
 4452 
 4453         if (bits > 0) {
 4454                 u_int8_t mask = ~((1<<(8-bits))-1);
 4455                 if ((*p1 & mask) != (*p2 & mask))
 4456                         return 0;
 4457         }
 4458         return 1;       /* Match! */
 4459 }
 4460 
 4461 static void
 4462 key_flush_spd(time_t now)
 4463 {
 4464         SPTREE_RLOCK_TRACKER;
 4465         struct secpolicy_list drainq;
 4466         struct secpolicy *sp, *nextsp;
 4467         u_int dir;
 4468 
 4469         LIST_INIT(&drainq);
 4470         SPTREE_RLOCK();
 4471         for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
 4472                 TAILQ_FOREACH(sp, &V_sptree[dir], chain) {
 4473                         if (sp->lifetime == 0 && sp->validtime == 0)
 4474                                 continue;
 4475                         if ((sp->lifetime &&
 4476                             now - sp->created > sp->lifetime) ||
 4477                             (sp->validtime &&
 4478                             now - sp->lastused > sp->validtime)) {
 4479                                 /* Hold extra reference to send SPDEXPIRE */
 4480                                 SP_ADDREF(sp);
 4481                                 LIST_INSERT_HEAD(&drainq, sp, drainq);
 4482                         }
 4483                 }
 4484         }
 4485         SPTREE_RUNLOCK();
 4486         if (LIST_EMPTY(&drainq))
 4487                 return;
 4488 
 4489         SPTREE_WLOCK();
 4490         sp = LIST_FIRST(&drainq);
 4491         while (sp != NULL) {
 4492                 nextsp = LIST_NEXT(sp, drainq);
 4493                 /* Check that SP is still linked */
 4494                 if (sp->state != IPSEC_SPSTATE_ALIVE) {
 4495                         LIST_REMOVE(sp, drainq);
 4496                         key_freesp(&sp); /* release extra reference */
 4497                         sp = nextsp;
 4498                         continue;
 4499                 }
 4500                 TAILQ_REMOVE(&V_sptree[sp->spidx.dir], sp, chain);
 4501                 V_spd_size--;
 4502                 LIST_REMOVE(sp, idhash);
 4503                 sp->state = IPSEC_SPSTATE_DEAD;
 4504                 sp = nextsp;
 4505         }
 4506         V_sp_genid++;
 4507         SPTREE_WUNLOCK();
 4508         if (SPDCACHE_ENABLED())
 4509                 spdcache_clear();
 4510 
 4511         sp = LIST_FIRST(&drainq);
 4512         while (sp != NULL) {
 4513                 nextsp = LIST_NEXT(sp, drainq);
 4514                 key_spdexpire(sp);
 4515                 key_freesp(&sp); /* release extra reference */
 4516                 key_freesp(&sp); /* release last reference */
 4517                 sp = nextsp;
 4518         }
 4519 }
 4520 
 4521 static void
 4522 key_flush_sad(time_t now)
 4523 {
 4524         SAHTREE_RLOCK_TRACKER;
 4525         struct secashead_list emptyq;
 4526         struct secasvar_list drainq, hexpireq, sexpireq, freeq;
 4527         struct secashead *sah, *nextsah;
 4528         struct secasvar *sav, *nextsav;
 4529 
 4530         SECASVAR_RLOCK_TRACKER;
 4531 
 4532         LIST_INIT(&drainq);
 4533         LIST_INIT(&hexpireq);
 4534         LIST_INIT(&sexpireq);
 4535         LIST_INIT(&emptyq);
 4536 
 4537         SAHTREE_RLOCK();
 4538         TAILQ_FOREACH(sah, &V_sahtree, chain) {
 4539                 /* Check for empty SAH */
 4540                 if (TAILQ_EMPTY(&sah->savtree_larval) &&
 4541                     TAILQ_EMPTY(&sah->savtree_alive)) {
 4542                         SAH_ADDREF(sah);
 4543                         LIST_INSERT_HEAD(&emptyq, sah, drainq);
 4544                         continue;
 4545                 }
 4546                 /* Add all stale LARVAL SAs into drainq */
 4547                 TAILQ_FOREACH(sav, &sah->savtree_larval, chain) {
 4548                         if (now - sav->created < V_key_larval_lifetime)
 4549                                 continue;
 4550                         SAV_ADDREF(sav);
 4551                         LIST_INSERT_HEAD(&drainq, sav, drainq);
 4552                 }
 4553                 TAILQ_FOREACH(sav, &sah->savtree_alive, chain) {
 4554                         /* lifetimes aren't specified */
 4555                         if (sav->lft_h == NULL)
 4556                                 continue;
 4557                         SECASVAR_RLOCK(sav);
 4558                         /*
 4559                          * Check again with lock held, because it may
 4560                          * be updated by SADB_UPDATE.
 4561                          */
 4562                         if (sav->lft_h == NULL) {
 4563                                 SECASVAR_RUNLOCK(sav);
 4564                                 continue;
 4565                         }
 4566                         /*
 4567                          * RFC 2367:
 4568                          * HARD lifetimes MUST take precedence over SOFT
 4569                          * lifetimes, meaning if the HARD and SOFT lifetimes
 4570                          * are the same, the HARD lifetime will appear on the
 4571                          * EXPIRE message.
 4572                          */
 4573                         /* check HARD lifetime */
 4574                         if ((sav->lft_h->addtime != 0 &&
 4575                             now - sav->created > sav->lft_h->addtime) ||
 4576                             (sav->lft_h->usetime != 0 && sav->firstused &&
 4577                             now - sav->firstused > sav->lft_h->usetime) ||
 4578                             (sav->lft_h->bytes != 0 && counter_u64_fetch(
 4579                                 sav->lft_c_bytes) > sav->lft_h->bytes)) {
 4580                                 SECASVAR_RUNLOCK(sav);
 4581                                 SAV_ADDREF(sav);
 4582                                 LIST_INSERT_HEAD(&hexpireq, sav, drainq);
 4583                                 continue;
 4584                         }
 4585                         /* check SOFT lifetime (only for MATURE SAs) */
 4586                         if (sav->state == SADB_SASTATE_MATURE && (
 4587                             (sav->lft_s->addtime != 0 &&
 4588                             now - sav->created > sav->lft_s->addtime) ||
 4589                             (sav->lft_s->usetime != 0 && sav->firstused &&
 4590                             now - sav->firstused > sav->lft_s->usetime) ||
 4591                             (sav->lft_s->bytes != 0 && counter_u64_fetch(
 4592                                 sav->lft_c_bytes) > sav->lft_s->bytes) ||
 4593                             (!(sav->flags & SADB_X_SAFLAGS_ESN) &&
 4594                             (sav->replay != NULL) && (
 4595                             (sav->replay->count > UINT32_80PCT) ||
 4596                             (sav->replay->last > UINT32_80PCT))))) {
 4597                                 SECASVAR_RUNLOCK(sav);
 4598                                 SAV_ADDREF(sav);
 4599                                 LIST_INSERT_HEAD(&sexpireq, sav, drainq);
 4600                                 continue;
 4601                         }
 4602                         SECASVAR_RUNLOCK(sav);
 4603                 }
 4604         }
 4605         SAHTREE_RUNLOCK();
 4606 
 4607         if (LIST_EMPTY(&emptyq) && LIST_EMPTY(&drainq) &&
 4608             LIST_EMPTY(&hexpireq) && LIST_EMPTY(&sexpireq))
 4609                 return;
 4610 
 4611         LIST_INIT(&freeq);
 4612         SAHTREE_WLOCK();
 4613         /* Unlink stale LARVAL SAs */
 4614         sav = LIST_FIRST(&drainq);
 4615         while (sav != NULL) {
 4616                 nextsav = LIST_NEXT(sav, drainq);
 4617                 /* Check that SA is still LARVAL */
 4618                 if (sav->state != SADB_SASTATE_LARVAL) {
 4619                         LIST_REMOVE(sav, drainq);
 4620                         LIST_INSERT_HEAD(&freeq, sav, drainq);
 4621                         sav = nextsav;
 4622                         continue;
 4623                 }
 4624                 TAILQ_REMOVE(&sav->sah->savtree_larval, sav, chain);
 4625                 LIST_REMOVE(sav, spihash);
 4626                 sav->state = SADB_SASTATE_DEAD;
 4627                 sav = nextsav;
 4628         }
 4629         /* Unlink all SAs with expired HARD lifetime */
 4630         sav = LIST_FIRST(&hexpireq);
 4631         while (sav != NULL) {
 4632                 nextsav = LIST_NEXT(sav, drainq);
 4633                 /* Check that SA is not unlinked */
 4634                 if (sav->state == SADB_SASTATE_DEAD) {
 4635                         LIST_REMOVE(sav, drainq);
 4636                         LIST_INSERT_HEAD(&freeq, sav, drainq);
 4637                         sav = nextsav;
 4638                         continue;
 4639                 }
 4640                 TAILQ_REMOVE(&sav->sah->savtree_alive, sav, chain);
 4641                 LIST_REMOVE(sav, spihash);
 4642                 sav->state = SADB_SASTATE_DEAD;
 4643                 sav = nextsav;
 4644         }
 4645         /* Mark all SAs with expired SOFT lifetime as DYING */
 4646         sav = LIST_FIRST(&sexpireq);
 4647         while (sav != NULL) {
 4648                 nextsav = LIST_NEXT(sav, drainq);
 4649                 /* Check that SA is not unlinked */
 4650                 if (sav->state == SADB_SASTATE_DEAD) {
 4651                         LIST_REMOVE(sav, drainq);
 4652                         LIST_INSERT_HEAD(&freeq, sav, drainq);
 4653                         sav = nextsav;
 4654                         continue;
 4655                 }
 4656                 /*
 4657                  * NOTE: this doesn't change SA order in the chain.
 4658                  */
 4659                 sav->state = SADB_SASTATE_DYING;
 4660                 sav = nextsav;
 4661         }
 4662         /* Unlink empty SAHs */
 4663         sah = LIST_FIRST(&emptyq);
 4664         while (sah != NULL) {
 4665                 nextsah = LIST_NEXT(sah, drainq);
 4666                 /* Check that SAH is still empty and not unlinked */
 4667                 if (sah->state == SADB_SASTATE_DEAD ||
 4668                     !TAILQ_EMPTY(&sah->savtree_larval) ||
 4669                     !TAILQ_EMPTY(&sah->savtree_alive)) {
 4670                         LIST_REMOVE(sah, drainq);
 4671                         key_freesah(&sah); /* release extra reference */
 4672                         sah = nextsah;
 4673                         continue;
 4674                 }
 4675                 TAILQ_REMOVE(&V_sahtree, sah, chain);
 4676                 LIST_REMOVE(sah, addrhash);
 4677                 sah->state = SADB_SASTATE_DEAD;
 4678                 sah = nextsah;
 4679         }
 4680         SAHTREE_WUNLOCK();
 4681 
 4682         /* Send SPDEXPIRE messages */
 4683         sav = LIST_FIRST(&hexpireq);
 4684         while (sav != NULL) {
 4685                 nextsav = LIST_NEXT(sav, drainq);
 4686                 key_expire(sav, 1);
 4687                 key_freesah(&sav->sah); /* release reference from SAV */
 4688                 key_freesav(&sav); /* release extra reference */
 4689                 key_freesav(&sav); /* release last reference */
 4690                 sav = nextsav;
 4691         }
 4692         sav = LIST_FIRST(&sexpireq);
 4693         while (sav != NULL) {
 4694                 nextsav = LIST_NEXT(sav, drainq);
 4695                 key_expire(sav, 0);
 4696                 key_freesav(&sav); /* release extra reference */
 4697                 sav = nextsav;
 4698         }
 4699         /* Free stale LARVAL SAs */
 4700         sav = LIST_FIRST(&drainq);
 4701         while (sav != NULL) {
 4702                 nextsav = LIST_NEXT(sav, drainq);
 4703                 key_freesah(&sav->sah); /* release reference from SAV */
 4704                 key_freesav(&sav); /* release extra reference */
 4705                 key_freesav(&sav); /* release last reference */
 4706                 sav = nextsav;
 4707         }
 4708         /* Free SAs that were unlinked/changed by someone else */
 4709         sav = LIST_FIRST(&freeq);
 4710         while (sav != NULL) {
 4711                 nextsav = LIST_NEXT(sav, drainq);
 4712                 key_freesav(&sav); /* release extra reference */
 4713                 sav = nextsav;
 4714         }
 4715         /* Free empty SAH */
 4716         sah = LIST_FIRST(&emptyq);
 4717         while (sah != NULL) {
 4718                 nextsah = LIST_NEXT(sah, drainq);
 4719                 key_freesah(&sah); /* release extra reference */
 4720                 key_freesah(&sah); /* release last reference */
 4721                 sah = nextsah;
 4722         }
 4723 }
 4724 
 4725 static void
 4726 key_flush_acq(time_t now)
 4727 {
 4728         struct secacq *acq, *nextacq;
 4729 
 4730         /* ACQ tree */
 4731         ACQ_LOCK();
 4732         acq = LIST_FIRST(&V_acqtree);
 4733         while (acq != NULL) {
 4734                 nextacq = LIST_NEXT(acq, chain);
 4735                 if (now - acq->created > V_key_blockacq_lifetime) {
 4736                         LIST_REMOVE(acq, chain);
 4737                         LIST_REMOVE(acq, addrhash);
 4738                         LIST_REMOVE(acq, seqhash);
 4739                         free(acq, M_IPSEC_SAQ);
 4740                 }
 4741                 acq = nextacq;
 4742         }
 4743         ACQ_UNLOCK();
 4744 }
 4745 
 4746 static void
 4747 key_flush_spacq(time_t now)
 4748 {
 4749         struct secspacq *acq, *nextacq;
 4750 
 4751         /* SP ACQ tree */
 4752         SPACQ_LOCK();
 4753         for (acq = LIST_FIRST(&V_spacqtree); acq != NULL; acq = nextacq) {
 4754                 nextacq = LIST_NEXT(acq, chain);
 4755                 if (now - acq->created > V_key_blockacq_lifetime
 4756                  && __LIST_CHAINED(acq)) {
 4757                         LIST_REMOVE(acq, chain);
 4758                         free(acq, M_IPSEC_SAQ);
 4759                 }
 4760         }
 4761         SPACQ_UNLOCK();
 4762 }
 4763 
 4764 /*
 4765  * time handler.
 4766  * scanning SPD and SAD to check status for each entries,
 4767  * and do to remove or to expire.
 4768  * XXX: year 2038 problem may remain.
 4769  */
 4770 static void
 4771 key_timehandler(void *arg)
 4772 {
 4773         VNET_ITERATOR_DECL(vnet_iter);
 4774         time_t now = time_second;
 4775 
 4776         VNET_LIST_RLOCK_NOSLEEP();
 4777         VNET_FOREACH(vnet_iter) {
 4778                 CURVNET_SET(vnet_iter);
 4779                 key_flush_spd(now);
 4780                 key_flush_sad(now);
 4781                 key_flush_acq(now);
 4782                 key_flush_spacq(now);
 4783                 CURVNET_RESTORE();
 4784         }
 4785         VNET_LIST_RUNLOCK_NOSLEEP();
 4786 
 4787 #ifndef IPSEC_DEBUG2
 4788         /* do exchange to tick time !! */
 4789         callout_schedule(&key_timer, hz);
 4790 #endif /* IPSEC_DEBUG2 */
 4791 }
 4792 
 4793 u_long
 4794 key_random(void)
 4795 {
 4796         u_long value;
 4797 
 4798         arc4random_buf(&value, sizeof(value));
 4799         return value;
 4800 }
 4801 
 4802 /*
 4803  * map SADB_SATYPE_* to IPPROTO_*.
 4804  * if satype == SADB_SATYPE then satype is mapped to ~0.
 4805  * OUT:
 4806  *      0: invalid satype.
 4807  */
 4808 static uint8_t
 4809 key_satype2proto(uint8_t satype)
 4810 {
 4811         switch (satype) {
 4812         case SADB_SATYPE_UNSPEC:
 4813                 return IPSEC_PROTO_ANY;
 4814         case SADB_SATYPE_AH:
 4815                 return IPPROTO_AH;
 4816         case SADB_SATYPE_ESP:
 4817                 return IPPROTO_ESP;
 4818         case SADB_X_SATYPE_IPCOMP:
 4819                 return IPPROTO_IPCOMP;
 4820         case SADB_X_SATYPE_TCPSIGNATURE:
 4821                 return IPPROTO_TCP;
 4822         default:
 4823                 return 0;
 4824         }
 4825         /* NOTREACHED */
 4826 }
 4827 
 4828 /*
 4829  * map IPPROTO_* to SADB_SATYPE_*
 4830  * OUT:
 4831  *      0: invalid protocol type.
 4832  */
 4833 static uint8_t
 4834 key_proto2satype(uint8_t proto)
 4835 {
 4836         switch (proto) {
 4837         case IPPROTO_AH:
 4838                 return SADB_SATYPE_AH;
 4839         case IPPROTO_ESP:
 4840                 return SADB_SATYPE_ESP;
 4841         case IPPROTO_IPCOMP:
 4842                 return SADB_X_SATYPE_IPCOMP;
 4843         case IPPROTO_TCP:
 4844                 return SADB_X_SATYPE_TCPSIGNATURE;
 4845         default:
 4846                 return 0;
 4847         }
 4848         /* NOTREACHED */
 4849 }
 4850 
 4851 /* %%% PF_KEY */
 4852 /*
 4853  * SADB_GETSPI processing is to receive
 4854  *      <base, (SA2), src address, dst address, (SPI range)>
 4855  * from the IKMPd, to assign a unique spi value, to hang on the INBOUND
 4856  * tree with the status of LARVAL, and send
 4857  *      <base, SA(*), address(SD)>
 4858  * to the IKMPd.
 4859  *
 4860  * IN:  mhp: pointer to the pointer to each header.
 4861  * OUT: NULL if fail.
 4862  *      other if success, return pointer to the message to send.
 4863  */
 4864 static int
 4865 key_getspi(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 4866 {
 4867         struct secasindex saidx;
 4868         struct sadb_address *src0, *dst0;
 4869         struct secasvar *sav;
 4870         uint32_t reqid, spi;
 4871         int error;
 4872         uint8_t mode, proto;
 4873 
 4874         IPSEC_ASSERT(so != NULL, ("null socket"));
 4875         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 4876         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 4877         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 4878 
 4879         if (SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_SRC) ||
 4880             SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_DST)
 4881 #ifdef PFKEY_STRICT_CHECKS
 4882             || SADB_CHECKHDR(mhp, SADB_EXT_SPIRANGE)
 4883 #endif
 4884             ) {
 4885                 ipseclog((LOG_DEBUG,
 4886                     "%s: invalid message: missing required header.\n",
 4887                     __func__));
 4888                 error = EINVAL;
 4889                 goto fail;
 4890         }
 4891         if (SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_SRC) ||
 4892             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_DST)
 4893 #ifdef PFKEY_STRICT_CHECKS
 4894             || SADB_CHECKLEN(mhp, SADB_EXT_SPIRANGE)
 4895 #endif
 4896             ) {
 4897                 ipseclog((LOG_DEBUG,
 4898                     "%s: invalid message: wrong header size.\n", __func__));
 4899                 error = EINVAL;
 4900                 goto fail;
 4901         }
 4902         if (SADB_CHECKHDR(mhp, SADB_X_EXT_SA2)) {
 4903                 mode = IPSEC_MODE_ANY;
 4904                 reqid = 0;
 4905         } else {
 4906                 if (SADB_CHECKLEN(mhp, SADB_X_EXT_SA2)) {
 4907                         ipseclog((LOG_DEBUG,
 4908                             "%s: invalid message: wrong header size.\n",
 4909                             __func__));
 4910                         error = EINVAL;
 4911                         goto fail;
 4912                 }
 4913                 mode = ((struct sadb_x_sa2 *)
 4914                     mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_mode;
 4915                 reqid = ((struct sadb_x_sa2 *)
 4916                     mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_reqid;
 4917         }
 4918 
 4919         src0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_SRC]);
 4920         dst0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_DST]);
 4921 
 4922         /* map satype to proto */
 4923         if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) {
 4924                 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n",
 4925                         __func__));
 4926                 error = EINVAL;
 4927                 goto fail;
 4928         }
 4929         error = key_checksockaddrs((struct sockaddr *)(src0 + 1),
 4930             (struct sockaddr *)(dst0 + 1));
 4931         if (error != 0) {
 4932                 ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
 4933                 error = EINVAL;
 4934                 goto fail;
 4935         }
 4936         KEY_SETSECASIDX(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
 4937 
 4938         /* SPI allocation */
 4939         SPI_ALLOC_LOCK();
 4940         spi = key_do_getnewspi(
 4941             (struct sadb_spirange *)mhp->ext[SADB_EXT_SPIRANGE], &saidx);
 4942         if (spi == 0) {
 4943                 /*
 4944                  * Requested SPI or SPI range is not available or
 4945                  * already used.
 4946                  */
 4947                 SPI_ALLOC_UNLOCK();
 4948                 error = EEXIST;
 4949                 goto fail;
 4950         }
 4951         sav = key_newsav(mhp, &saidx, spi, &error);
 4952         SPI_ALLOC_UNLOCK();
 4953         if (sav == NULL)
 4954                 goto fail;
 4955 
 4956         if (sav->seq != 0) {
 4957                 /*
 4958                  * RFC2367:
 4959                  * If the SADB_GETSPI message is in response to a
 4960                  * kernel-generated SADB_ACQUIRE, the sadb_msg_seq
 4961                  * MUST be the same as the SADB_ACQUIRE message.
 4962                  *
 4963                  * XXXAE: However it doesn't definethe behaviour how to
 4964                  * check this and what to do if it doesn't match.
 4965                  * Also what we should do if it matches?
 4966                  *
 4967                  * We can compare saidx used in SADB_ACQUIRE with saidx
 4968                  * used in SADB_GETSPI, but this probably can break
 4969                  * existing software. For now just warn if it doesn't match.
 4970                  *
 4971                  * XXXAE: anyway it looks useless.
 4972                  */
 4973                 key_acqdone(&saidx, sav->seq);
 4974         }
 4975         KEYDBG(KEY_STAMP,
 4976             printf("%s: SA(%p)\n", __func__, sav));
 4977         KEYDBG(KEY_DATA, kdebug_secasv(sav));
 4978 
 4979     {
 4980         struct mbuf *n, *nn;
 4981         struct sadb_sa *m_sa;
 4982         struct sadb_msg *newmsg;
 4983         int off, len;
 4984 
 4985         /* create new sadb_msg to reply. */
 4986         len = PFKEY_ALIGN8(sizeof(struct sadb_msg)) +
 4987             PFKEY_ALIGN8(sizeof(struct sadb_sa));
 4988 
 4989         n = key_mget(len);
 4990         if (n == NULL) {
 4991                 error = ENOBUFS;
 4992                 goto fail;
 4993         }
 4994 
 4995         n->m_len = len;
 4996         n->m_next = NULL;
 4997         off = 0;
 4998 
 4999         m_copydata(m, 0, sizeof(struct sadb_msg), mtod(n, caddr_t) + off);
 5000         off += PFKEY_ALIGN8(sizeof(struct sadb_msg));
 5001 
 5002         m_sa = (struct sadb_sa *)(mtod(n, caddr_t) + off);
 5003         m_sa->sadb_sa_len = PFKEY_UNIT64(sizeof(struct sadb_sa));
 5004         m_sa->sadb_sa_exttype = SADB_EXT_SA;
 5005         m_sa->sadb_sa_spi = spi; /* SPI is already in network byte order */
 5006         off += PFKEY_ALIGN8(sizeof(struct sadb_sa));
 5007 
 5008         IPSEC_ASSERT(off == len,
 5009                 ("length inconsistency (off %u len %u)", off, len));
 5010 
 5011         n->m_next = key_gather_mbuf(m, mhp, 0, 2, SADB_EXT_ADDRESS_SRC,
 5012             SADB_EXT_ADDRESS_DST);
 5013         if (!n->m_next) {
 5014                 m_freem(n);
 5015                 error = ENOBUFS;
 5016                 goto fail;
 5017         }
 5018 
 5019         if (n->m_len < sizeof(struct sadb_msg)) {
 5020                 n = m_pullup(n, sizeof(struct sadb_msg));
 5021                 if (n == NULL)
 5022                         return key_sendup_mbuf(so, m, KEY_SENDUP_ONE);
 5023         }
 5024 
 5025         n->m_pkthdr.len = 0;
 5026         for (nn = n; nn; nn = nn->m_next)
 5027                 n->m_pkthdr.len += nn->m_len;
 5028 
 5029         newmsg = mtod(n, struct sadb_msg *);
 5030         newmsg->sadb_msg_seq = sav->seq;
 5031         newmsg->sadb_msg_errno = 0;
 5032         newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len);
 5033 
 5034         m_freem(m);
 5035         return key_sendup_mbuf(so, n, KEY_SENDUP_ONE);
 5036     }
 5037 
 5038 fail:
 5039         return (key_senderror(so, m, error));
 5040 }
 5041 
 5042 /*
 5043  * allocating new SPI
 5044  * called by key_getspi().
 5045  * OUT:
 5046  *      0:      failure.
 5047  *      others: success, SPI in network byte order.
 5048  */
 5049 static uint32_t
 5050 key_do_getnewspi(struct sadb_spirange *spirange, struct secasindex *saidx)
 5051 {
 5052         uint32_t min, max, newspi, t;
 5053         int tries, limit;
 5054 
 5055         SPI_ALLOC_LOCK_ASSERT();
 5056 
 5057         /* set spi range to allocate */
 5058         if (spirange != NULL) {
 5059                 min = spirange->sadb_spirange_min;
 5060                 max = spirange->sadb_spirange_max;
 5061         } else {
 5062                 min = V_key_spi_minval;
 5063                 max = V_key_spi_maxval;
 5064         }
 5065         /* IPCOMP needs 2-byte SPI */
 5066         if (saidx->proto == IPPROTO_IPCOMP) {
 5067                 if (min >= 0x10000)
 5068                         min = 0xffff;
 5069                 if (max >= 0x10000)
 5070                         max = 0xffff;
 5071                 if (min > max) {
 5072                         t = min; min = max; max = t;
 5073                 }
 5074         }
 5075 
 5076         if (min == max) {
 5077                 if (key_checkspidup(htonl(min))) {
 5078                         ipseclog((LOG_DEBUG, "%s: SPI %u exists already.\n",
 5079                             __func__, min));
 5080                         return 0;
 5081                 }
 5082 
 5083                 tries = 1;
 5084                 newspi = min;
 5085         } else {
 5086                 /* init SPI */
 5087                 newspi = 0;
 5088 
 5089                 limit = atomic_load_int(&V_key_spi_trycnt);
 5090                 /* when requesting to allocate spi ranged */
 5091                 for (tries = 0; tries < limit; tries++) {
 5092                         /* generate pseudo-random SPI value ranged. */
 5093                         newspi = min + (key_random() % (max - min + 1));
 5094                         if (!key_checkspidup(htonl(newspi)))
 5095                                 break;
 5096                 }
 5097 
 5098                 if (tries == limit || newspi == 0) {
 5099                         ipseclog((LOG_DEBUG,
 5100                             "%s: failed to allocate SPI.\n", __func__));
 5101                         return 0;
 5102                 }
 5103         }
 5104 
 5105         /* statistics */
 5106         keystat.getspi_count =
 5107             (keystat.getspi_count + tries) / 2;
 5108 
 5109         return (htonl(newspi));
 5110 }
 5111 
 5112 /*
 5113  * Find TCP-MD5 SA with corresponding secasindex.
 5114  * If not found, return NULL and fill SPI with usable value if needed.
 5115  */
 5116 static struct secasvar *
 5117 key_getsav_tcpmd5(struct secasindex *saidx, uint32_t *spi)
 5118 {
 5119         SAHTREE_RLOCK_TRACKER;
 5120         struct secashead *sah;
 5121         struct secasvar *sav;
 5122 
 5123         IPSEC_ASSERT(saidx->proto == IPPROTO_TCP, ("wrong proto"));
 5124         SAHTREE_RLOCK();
 5125         LIST_FOREACH(sah, SAHADDRHASH_HASH(saidx), addrhash) {
 5126                 if (sah->saidx.proto != IPPROTO_TCP)
 5127                         continue;
 5128                 if (!key_sockaddrcmp(&saidx->dst.sa, &sah->saidx.dst.sa, 0) &&
 5129                     !key_sockaddrcmp(&saidx->src.sa, &sah->saidx.src.sa, 0))
 5130                         break;
 5131         }
 5132         if (sah != NULL) {
 5133                 if (V_key_preferred_oldsa)
 5134                         sav = TAILQ_LAST(&sah->savtree_alive, secasvar_queue);
 5135                 else
 5136                         sav = TAILQ_FIRST(&sah->savtree_alive);
 5137                 if (sav != NULL) {
 5138                         SAV_ADDREF(sav);
 5139                         SAHTREE_RUNLOCK();
 5140                         return (sav);
 5141                 }
 5142         }
 5143         if (spi == NULL) {
 5144                 /* No SPI required */
 5145                 SAHTREE_RUNLOCK();
 5146                 return (NULL);
 5147         }
 5148         /* Check that SPI is unique */
 5149         LIST_FOREACH(sav, SAVHASH_HASH(*spi), spihash) {
 5150                 if (sav->spi == *spi)
 5151                         break;
 5152         }
 5153         if (sav == NULL) {
 5154                 SAHTREE_RUNLOCK();
 5155                 /* SPI is already unique */
 5156                 return (NULL);
 5157         }
 5158         SAHTREE_RUNLOCK();
 5159         /* XXX: not optimal */
 5160         *spi = key_do_getnewspi(NULL, saidx);
 5161         return (NULL);
 5162 }
 5163 
 5164 static int
 5165 key_updateaddresses(struct socket *so, struct mbuf *m,
 5166     const struct sadb_msghdr *mhp, struct secasvar *sav,
 5167     struct secasindex *saidx)
 5168 {
 5169         struct sockaddr *newaddr;
 5170         struct secashead *sah;
 5171         struct secasvar *newsav, *tmp;
 5172         struct mbuf *n;
 5173         int error, isnew;
 5174 
 5175         /* Check that we need to change SAH */
 5176         if (!SADB_CHECKHDR(mhp, SADB_X_EXT_NEW_ADDRESS_SRC)) {
 5177                 newaddr = (struct sockaddr *)(
 5178                     ((struct sadb_address *)
 5179                     mhp->ext[SADB_X_EXT_NEW_ADDRESS_SRC]) + 1);
 5180                 bcopy(newaddr, &saidx->src, newaddr->sa_len);
 5181                 key_porttosaddr(&saidx->src.sa, 0);
 5182         }
 5183         if (!SADB_CHECKHDR(mhp, SADB_X_EXT_NEW_ADDRESS_DST)) {
 5184                 newaddr = (struct sockaddr *)(
 5185                     ((struct sadb_address *)
 5186                     mhp->ext[SADB_X_EXT_NEW_ADDRESS_DST]) + 1);
 5187                 bcopy(newaddr, &saidx->dst, newaddr->sa_len);
 5188                 key_porttosaddr(&saidx->dst.sa, 0);
 5189         }
 5190         if (!SADB_CHECKHDR(mhp, SADB_X_EXT_NEW_ADDRESS_SRC) ||
 5191             !SADB_CHECKHDR(mhp, SADB_X_EXT_NEW_ADDRESS_DST)) {
 5192                 error = key_checksockaddrs(&saidx->src.sa, &saidx->dst.sa);
 5193                 if (error != 0) {
 5194                         ipseclog((LOG_DEBUG, "%s: invalid new sockaddr.\n",
 5195                             __func__));
 5196                         return (error);
 5197                 }
 5198 
 5199                 sah = key_getsah(saidx);
 5200                 if (sah == NULL) {
 5201                         /* create a new SA index */
 5202                         sah = key_newsah(saidx);
 5203                         if (sah == NULL) {
 5204                                 ipseclog((LOG_DEBUG,
 5205                                     "%s: No more memory.\n", __func__));
 5206                                 return (ENOBUFS);
 5207                         }
 5208                         isnew = 2; /* SAH is new */
 5209                 } else
 5210                         isnew = 1; /* existing SAH is referenced */
 5211         } else {
 5212                 /*
 5213                  * src and dst addresses are still the same.
 5214                  * Do we want to change NAT-T config?
 5215                  */
 5216                 if (sav->sah->saidx.proto != IPPROTO_ESP ||
 5217                     SADB_CHECKHDR(mhp, SADB_X_EXT_NAT_T_TYPE) ||
 5218                     SADB_CHECKHDR(mhp, SADB_X_EXT_NAT_T_SPORT) ||
 5219                     SADB_CHECKHDR(mhp, SADB_X_EXT_NAT_T_DPORT)) {
 5220                         ipseclog((LOG_DEBUG,
 5221                             "%s: invalid message: missing required header.\n",
 5222                             __func__));
 5223                         return (EINVAL);
 5224                 }
 5225                 /* We hold reference to SA, thus SAH will be referenced too. */
 5226                 sah = sav->sah;
 5227                 isnew = 0;
 5228         }
 5229 
 5230         newsav = malloc(sizeof(struct secasvar), M_IPSEC_SA,
 5231             M_NOWAIT | M_ZERO);
 5232         if (newsav == NULL) {
 5233                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 5234                 error = ENOBUFS;
 5235                 goto fail;
 5236         }
 5237 
 5238         /* Clone SA's content into newsav */
 5239         SAV_INITREF(newsav);
 5240         bcopy(sav, newsav, offsetof(struct secasvar, chain));
 5241         /*
 5242          * We create new NAT-T config if it is needed.
 5243          * Old NAT-T config will be freed by key_cleansav() when
 5244          * last reference to SA will be released.
 5245          */
 5246         newsav->natt = NULL;
 5247         newsav->sah = sah;
 5248         newsav->state = SADB_SASTATE_MATURE;
 5249         error = key_setnatt(newsav, mhp);
 5250         if (error != 0)
 5251                 goto fail;
 5252 
 5253         SAHTREE_WLOCK();
 5254         /* Check that SA is still alive */
 5255         if (sav->state == SADB_SASTATE_DEAD) {
 5256                 /* SA was unlinked */
 5257                 SAHTREE_WUNLOCK();
 5258                 error = ESRCH;
 5259                 goto fail;
 5260         }
 5261 
 5262         /* Unlink SA from SAH and SPI hash */
 5263         IPSEC_ASSERT((sav->flags & SADB_X_EXT_F_CLONED) == 0,
 5264             ("SA is already cloned"));
 5265         IPSEC_ASSERT(sav->state == SADB_SASTATE_MATURE ||
 5266             sav->state == SADB_SASTATE_DYING,
 5267             ("Wrong SA state %u\n", sav->state));
 5268         TAILQ_REMOVE(&sav->sah->savtree_alive, sav, chain);
 5269         LIST_REMOVE(sav, spihash);
 5270         sav->state = SADB_SASTATE_DEAD;
 5271 
 5272         /*
 5273          * Link new SA with SAH. Keep SAs ordered by
 5274          * create time (newer are first).
 5275          */
 5276         TAILQ_FOREACH(tmp, &sah->savtree_alive, chain) {
 5277                 if (newsav->created > tmp->created) {
 5278                         TAILQ_INSERT_BEFORE(tmp, newsav, chain);
 5279                         break;
 5280                 }
 5281         }
 5282         if (tmp == NULL)
 5283                 TAILQ_INSERT_TAIL(&sah->savtree_alive, newsav, chain);
 5284 
 5285         /* Add new SA into SPI hash. */
 5286         LIST_INSERT_HEAD(SAVHASH_HASH(newsav->spi), newsav, spihash);
 5287 
 5288         /* Add new SAH into SADB. */
 5289         if (isnew == 2) {
 5290                 TAILQ_INSERT_HEAD(&V_sahtree, sah, chain);
 5291                 LIST_INSERT_HEAD(SAHADDRHASH_HASH(saidx), sah, addrhash);
 5292                 sah->state = SADB_SASTATE_MATURE;
 5293                 SAH_ADDREF(sah); /* newsav references new SAH */
 5294         }
 5295         /*
 5296          * isnew == 1 -> @sah was referenced by key_getsah().
 5297          * isnew == 0 -> we use the same @sah, that was used by @sav,
 5298          *      and we use its reference for @newsav.
 5299          */
 5300         SECASVAR_WLOCK(sav);
 5301         /* XXX: replace cntr with pointer? */
 5302         newsav->cntr = sav->cntr;
 5303         sav->flags |= SADB_X_EXT_F_CLONED;
 5304         SECASVAR_WUNLOCK(sav);
 5305 
 5306         SAHTREE_WUNLOCK();
 5307 
 5308         KEYDBG(KEY_STAMP,
 5309             printf("%s: SA(%p) cloned into SA(%p)\n",
 5310             __func__, sav, newsav));
 5311         KEYDBG(KEY_DATA, kdebug_secasv(newsav));
 5312 
 5313         key_freesav(&sav); /* release last reference */
 5314 
 5315         /* set msg buf from mhp */
 5316         n = key_getmsgbuf_x1(m, mhp);
 5317         if (n == NULL) {
 5318                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 5319                 return (ENOBUFS);
 5320         }
 5321         m_freem(m);
 5322         key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
 5323         return (0);
 5324 fail:
 5325         if (isnew != 0)
 5326                 key_freesah(&sah);
 5327         if (newsav != NULL) {
 5328                 if (newsav->natt != NULL)
 5329                         free(newsav->natt, M_IPSEC_MISC);
 5330                 free(newsav, M_IPSEC_SA);
 5331         }
 5332         return (error);
 5333 }
 5334 
 5335 /*
 5336  * SADB_UPDATE processing
 5337  * receive
 5338  *   <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
 5339  *       key(AE), (identity(SD),) (sensitivity)>
 5340  * from the ikmpd, and update a secasvar entry whose status is SADB_SASTATE_LARVAL.
 5341  * and send
 5342  *   <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
 5343  *       (identity(SD),) (sensitivity)>
 5344  * to the ikmpd.
 5345  *
 5346  * m will always be freed.
 5347  */
 5348 static int
 5349 key_update(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 5350 {
 5351         struct secasindex saidx;
 5352         struct sadb_address *src0, *dst0;
 5353         struct sadb_sa *sa0;
 5354         struct secasvar *sav;
 5355         uint32_t reqid;
 5356         int error;
 5357         uint8_t mode, proto;
 5358 
 5359         IPSEC_ASSERT(so != NULL, ("null socket"));
 5360         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 5361         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 5362         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 5363 
 5364         /* map satype to proto */
 5365         if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) {
 5366                 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n",
 5367                     __func__));
 5368                 return key_senderror(so, m, EINVAL);
 5369         }
 5370 
 5371         if (SADB_CHECKHDR(mhp, SADB_EXT_SA) ||
 5372             SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_SRC) ||
 5373             SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_DST) ||
 5374             (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD) &&
 5375                 !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT)) ||
 5376             (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT) &&
 5377                 !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD))) {
 5378                 ipseclog((LOG_DEBUG,
 5379                     "%s: invalid message: missing required header.\n",
 5380                     __func__));
 5381                 return key_senderror(so, m, EINVAL);
 5382         }
 5383         if (SADB_CHECKLEN(mhp, SADB_EXT_SA) ||
 5384             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_SRC) ||
 5385             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_DST)) {
 5386                 ipseclog((LOG_DEBUG,
 5387                     "%s: invalid message: wrong header size.\n", __func__));
 5388                 return key_senderror(so, m, EINVAL);
 5389         }
 5390         if (SADB_CHECKHDR(mhp, SADB_X_EXT_SA2)) {
 5391                 mode = IPSEC_MODE_ANY;
 5392                 reqid = 0;
 5393         } else {
 5394                 if (SADB_CHECKLEN(mhp, SADB_X_EXT_SA2)) {
 5395                         ipseclog((LOG_DEBUG,
 5396                             "%s: invalid message: wrong header size.\n",
 5397                             __func__));
 5398                         return key_senderror(so, m, EINVAL);
 5399                 }
 5400                 mode = ((struct sadb_x_sa2 *)
 5401                     mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_mode;
 5402                 reqid = ((struct sadb_x_sa2 *)
 5403                     mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_reqid;
 5404         }
 5405 
 5406         sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA];
 5407         src0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_SRC]);
 5408         dst0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_DST]);
 5409 
 5410         /*
 5411          * Only SADB_SASTATE_MATURE SAs may be submitted in an
 5412          * SADB_UPDATE message.
 5413          */
 5414         if (sa0->sadb_sa_state != SADB_SASTATE_MATURE) {
 5415                 ipseclog((LOG_DEBUG, "%s: invalid state.\n", __func__));
 5416 #ifdef PFKEY_STRICT_CHECKS
 5417                 return key_senderror(so, m, EINVAL);
 5418 #endif
 5419         }
 5420         error = key_checksockaddrs((struct sockaddr *)(src0 + 1),
 5421             (struct sockaddr *)(dst0 + 1));
 5422         if (error != 0) {
 5423                 ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
 5424                 return key_senderror(so, m, error);
 5425         }
 5426         KEY_SETSECASIDX(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
 5427         sav = key_getsavbyspi(sa0->sadb_sa_spi);
 5428         if (sav == NULL) {
 5429                 ipseclog((LOG_DEBUG, "%s: no SA found for SPI %u\n",
 5430                     __func__, ntohl(sa0->sadb_sa_spi)));
 5431                 return key_senderror(so, m, EINVAL);
 5432         }
 5433         /*
 5434          * Check that SADB_UPDATE issued by the same process that did
 5435          * SADB_GETSPI or SADB_ADD.
 5436          */
 5437         if (sav->pid != mhp->msg->sadb_msg_pid) {
 5438                 ipseclog((LOG_DEBUG,
 5439                     "%s: pid mismatched (SPI %u, pid %u vs. %u)\n", __func__,
 5440                     ntohl(sav->spi), sav->pid, mhp->msg->sadb_msg_pid));
 5441                 key_freesav(&sav);
 5442                 return key_senderror(so, m, EINVAL);
 5443         }
 5444         /* saidx should match with SA. */
 5445         if (key_cmpsaidx(&sav->sah->saidx, &saidx, CMP_MODE_REQID) == 0) {
 5446                 ipseclog((LOG_DEBUG, "%s: saidx mismatched for SPI %u\n",
 5447                     __func__, ntohl(sav->spi)));
 5448                 key_freesav(&sav);
 5449                 return key_senderror(so, m, ESRCH);
 5450         }
 5451 
 5452         if (sav->state == SADB_SASTATE_LARVAL) {
 5453                 if ((mhp->msg->sadb_msg_satype == SADB_SATYPE_ESP &&
 5454                     SADB_CHECKHDR(mhp, SADB_EXT_KEY_ENCRYPT)) ||
 5455                     (mhp->msg->sadb_msg_satype == SADB_SATYPE_AH &&
 5456                     SADB_CHECKHDR(mhp, SADB_EXT_KEY_AUTH))) {
 5457                         ipseclog((LOG_DEBUG,
 5458                             "%s: invalid message: missing required header.\n",
 5459                             __func__));
 5460                         key_freesav(&sav);
 5461                         return key_senderror(so, m, EINVAL);
 5462                 }
 5463                 /*
 5464                  * We can set any values except src, dst and SPI.
 5465                  */
 5466                 error = key_setsaval(sav, mhp);
 5467                 if (error != 0) {
 5468                         key_freesav(&sav);
 5469                         return (key_senderror(so, m, error));
 5470                 }
 5471                 /* Change SA state to MATURE */
 5472                 SAHTREE_WLOCK();
 5473                 if (sav->state != SADB_SASTATE_LARVAL) {
 5474                         /* SA was deleted or another thread made it MATURE. */
 5475                         SAHTREE_WUNLOCK();
 5476                         key_freesav(&sav);
 5477                         return (key_senderror(so, m, ESRCH));
 5478                 }
 5479                 /*
 5480                  * NOTE: we keep SAs in savtree_alive ordered by created
 5481                  * time. When SA's state changed from LARVAL to MATURE,
 5482                  * we update its created time in key_setsaval() and move
 5483                  * it into head of savtree_alive.
 5484                  */
 5485                 TAILQ_REMOVE(&sav->sah->savtree_larval, sav, chain);
 5486                 TAILQ_INSERT_HEAD(&sav->sah->savtree_alive, sav, chain);
 5487                 sav->state = SADB_SASTATE_MATURE;
 5488                 SAHTREE_WUNLOCK();
 5489         } else {
 5490                 /*
 5491                  * For DYING and MATURE SA we can change only state
 5492                  * and lifetimes. Report EINVAL if something else attempted
 5493                  * to change.
 5494                  */
 5495                 if (!SADB_CHECKHDR(mhp, SADB_EXT_KEY_ENCRYPT) ||
 5496                     !SADB_CHECKHDR(mhp, SADB_EXT_KEY_AUTH)) {
 5497                         key_freesav(&sav);
 5498                         return (key_senderror(so, m, EINVAL));
 5499                 }
 5500                 error = key_updatelifetimes(sav, mhp);
 5501                 if (error != 0) {
 5502                         key_freesav(&sav);
 5503                         return (key_senderror(so, m, error));
 5504                 }
 5505                 /*
 5506                  * This is FreeBSD extension to RFC2367.
 5507                  * IKEd can specify SADB_X_EXT_NEW_ADDRESS_SRC and/or
 5508                  * SADB_X_EXT_NEW_ADDRESS_DST when it wants to change
 5509                  * SA addresses (for example to implement MOBIKE protocol
 5510                  * as described in RFC4555). Also we allow to change
 5511                  * NAT-T config.
 5512                  */
 5513                 if (!SADB_CHECKHDR(mhp, SADB_X_EXT_NEW_ADDRESS_SRC) ||
 5514                     !SADB_CHECKHDR(mhp, SADB_X_EXT_NEW_ADDRESS_DST) ||
 5515                     !SADB_CHECKHDR(mhp, SADB_X_EXT_NAT_T_TYPE) ||
 5516                     sav->natt != NULL) {
 5517                         error = key_updateaddresses(so, m, mhp, sav, &saidx);
 5518                         key_freesav(&sav);
 5519                         if (error != 0)
 5520                                 return (key_senderror(so, m, error));
 5521                         return (0);
 5522                 }
 5523                 /* Check that SA is still alive */
 5524                 SAHTREE_WLOCK();
 5525                 if (sav->state == SADB_SASTATE_DEAD) {
 5526                         /* SA was unlinked */
 5527                         SAHTREE_WUNLOCK();
 5528                         key_freesav(&sav);
 5529                         return (key_senderror(so, m, ESRCH));
 5530                 }
 5531                 /*
 5532                  * NOTE: there is possible state moving from DYING to MATURE,
 5533                  * but this doesn't change created time, so we won't reorder
 5534                  * this SA.
 5535                  */
 5536                 sav->state = SADB_SASTATE_MATURE;
 5537                 SAHTREE_WUNLOCK();
 5538         }
 5539         KEYDBG(KEY_STAMP,
 5540             printf("%s: SA(%p)\n", __func__, sav));
 5541         KEYDBG(KEY_DATA, kdebug_secasv(sav));
 5542         key_freesav(&sav);
 5543 
 5544     {
 5545         struct mbuf *n;
 5546 
 5547         /* set msg buf from mhp */
 5548         n = key_getmsgbuf_x1(m, mhp);
 5549         if (n == NULL) {
 5550                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 5551                 return key_senderror(so, m, ENOBUFS);
 5552         }
 5553 
 5554         m_freem(m);
 5555         return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
 5556     }
 5557 }
 5558 
 5559 /*
 5560  * SADB_ADD processing
 5561  * add an entry to SA database, when received
 5562  *   <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
 5563  *       key(AE), (identity(SD),) (sensitivity)>
 5564  * from the ikmpd,
 5565  * and send
 5566  *   <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
 5567  *       (identity(SD),) (sensitivity)>
 5568  * to the ikmpd.
 5569  *
 5570  * IGNORE identity and sensitivity messages.
 5571  *
 5572  * m will always be freed.
 5573  */
 5574 static int
 5575 key_add(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 5576 {
 5577         struct secasindex saidx;
 5578         struct sadb_address *src0, *dst0;
 5579         struct sadb_sa *sa0;
 5580         struct secasvar *sav;
 5581         uint32_t reqid, spi;
 5582         uint8_t mode, proto;
 5583         int error;
 5584 
 5585         IPSEC_ASSERT(so != NULL, ("null socket"));
 5586         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 5587         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 5588         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 5589 
 5590         /* map satype to proto */
 5591         if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) {
 5592                 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n",
 5593                     __func__));
 5594                 return key_senderror(so, m, EINVAL);
 5595         }
 5596 
 5597         if (SADB_CHECKHDR(mhp, SADB_EXT_SA) ||
 5598             SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_SRC) ||
 5599             SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_DST) ||
 5600             (mhp->msg->sadb_msg_satype == SADB_SATYPE_ESP && (
 5601                 SADB_CHECKHDR(mhp, SADB_EXT_KEY_ENCRYPT) ||
 5602                 SADB_CHECKLEN(mhp, SADB_EXT_KEY_ENCRYPT))) ||
 5603             (mhp->msg->sadb_msg_satype == SADB_SATYPE_AH && (
 5604                 SADB_CHECKHDR(mhp, SADB_EXT_KEY_AUTH) ||
 5605                 SADB_CHECKLEN(mhp, SADB_EXT_KEY_AUTH))) ||
 5606             (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD) &&
 5607                 !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT)) ||
 5608             (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT) &&
 5609                 !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD))) {
 5610                 ipseclog((LOG_DEBUG,
 5611                     "%s: invalid message: missing required header.\n",
 5612                     __func__));
 5613                 return key_senderror(so, m, EINVAL);
 5614         }
 5615         if (SADB_CHECKLEN(mhp, SADB_EXT_SA) ||
 5616             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_SRC) ||
 5617             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_DST)) {
 5618                 ipseclog((LOG_DEBUG,
 5619                     "%s: invalid message: wrong header size.\n", __func__));
 5620                 return key_senderror(so, m, EINVAL);
 5621         }
 5622         if (SADB_CHECKHDR(mhp, SADB_X_EXT_SA2)) {
 5623                 mode = IPSEC_MODE_ANY;
 5624                 reqid = 0;
 5625         } else {
 5626                 if (SADB_CHECKLEN(mhp, SADB_X_EXT_SA2)) {
 5627                         ipseclog((LOG_DEBUG,
 5628                             "%s: invalid message: wrong header size.\n",
 5629                             __func__));
 5630                         return key_senderror(so, m, EINVAL);
 5631                 }
 5632                 mode = ((struct sadb_x_sa2 *)
 5633                     mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_mode;
 5634                 reqid = ((struct sadb_x_sa2 *)
 5635                     mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_reqid;
 5636         }
 5637 
 5638         sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA];
 5639         src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC];
 5640         dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST];
 5641 
 5642         /*
 5643          * Only SADB_SASTATE_MATURE SAs may be submitted in an
 5644          * SADB_ADD message.
 5645          */
 5646         if (sa0->sadb_sa_state != SADB_SASTATE_MATURE) {
 5647                 ipseclog((LOG_DEBUG, "%s: invalid state.\n", __func__));
 5648 #ifdef PFKEY_STRICT_CHECKS
 5649                 return key_senderror(so, m, EINVAL);
 5650 #endif
 5651         }
 5652         error = key_checksockaddrs((struct sockaddr *)(src0 + 1),
 5653             (struct sockaddr *)(dst0 + 1));
 5654         if (error != 0) {
 5655                 ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
 5656                 return key_senderror(so, m, error);
 5657         }
 5658         KEY_SETSECASIDX(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
 5659         spi = sa0->sadb_sa_spi;
 5660         /*
 5661          * For TCP-MD5 SAs we don't use SPI. Check the uniqueness using
 5662          * secasindex.
 5663          * XXXAE: IPComp seems also doesn't use SPI.
 5664          */
 5665         SPI_ALLOC_LOCK();
 5666         if (proto == IPPROTO_TCP) {
 5667                 sav = key_getsav_tcpmd5(&saidx, &spi);
 5668                 if (sav == NULL && spi == 0) {
 5669                         SPI_ALLOC_UNLOCK();
 5670                         /* Failed to allocate SPI */
 5671                         ipseclog((LOG_DEBUG, "%s: SA already exists.\n",
 5672                             __func__));
 5673                         return key_senderror(so, m, EEXIST);
 5674                 }
 5675                 /* XXX: SPI that we report back can have another value */
 5676         } else {
 5677                 /* We can create new SA only if SPI is different. */
 5678                 sav = key_getsavbyspi(spi);
 5679         }
 5680         if (sav != NULL) {
 5681                 SPI_ALLOC_UNLOCK();
 5682                 key_freesav(&sav);
 5683                 ipseclog((LOG_DEBUG, "%s: SA already exists.\n", __func__));
 5684                 return key_senderror(so, m, EEXIST);
 5685         }
 5686 
 5687         sav = key_newsav(mhp, &saidx, spi, &error);
 5688         SPI_ALLOC_UNLOCK();
 5689         if (sav == NULL)
 5690                 return key_senderror(so, m, error);
 5691         KEYDBG(KEY_STAMP,
 5692             printf("%s: return SA(%p)\n", __func__, sav));
 5693         KEYDBG(KEY_DATA, kdebug_secasv(sav));
 5694         /*
 5695          * If SADB_ADD was in response to SADB_ACQUIRE, we need to schedule
 5696          * ACQ for deletion.
 5697          */
 5698         if (sav->seq != 0)
 5699                 key_acqdone(&saidx, sav->seq);
 5700 
 5701     {
 5702         /*
 5703          * Don't call key_freesav() on error here, as we would like to
 5704          * keep the SA in the database.
 5705          */
 5706         struct mbuf *n;
 5707 
 5708         /* set msg buf from mhp */
 5709         n = key_getmsgbuf_x1(m, mhp);
 5710         if (n == NULL) {
 5711                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 5712                 return key_senderror(so, m, ENOBUFS);
 5713         }
 5714 
 5715         m_freem(m);
 5716         return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
 5717     }
 5718 }
 5719 
 5720 /*
 5721  * NAT-T support.
 5722  * IKEd may request the use ESP in UDP encapsulation when it detects the
 5723  * presence of NAT. It uses NAT-T extension headers for such SAs to specify
 5724  * parameters needed for encapsulation and decapsulation. These PF_KEY
 5725  * extension headers are not standardized, so this comment addresses our
 5726  * implementation.
 5727  * SADB_X_EXT_NAT_T_TYPE specifies type of encapsulation, we support only
 5728  * UDP_ENCAP_ESPINUDP as described in RFC3948.
 5729  * SADB_X_EXT_NAT_T_SPORT/DPORT specifies source and destination ports for
 5730  * UDP header. We use these ports in UDP encapsulation procedure, also we
 5731  * can check them in UDP decapsulation procedure.
 5732  * SADB_X_EXT_NAT_T_OA[IR] specifies original address of initiator or
 5733  * responder. These addresses can be used for transport mode to adjust
 5734  * checksum after decapsulation and decryption. Since original IP addresses
 5735  * used by peer usually different (we detected presence of NAT), TCP/UDP
 5736  * pseudo header checksum and IP header checksum was calculated using original
 5737  * addresses. After decapsulation and decryption we need to adjust checksum
 5738  * to have correct datagram.
 5739  *
 5740  * We expect presence of NAT-T extension headers only in SADB_ADD and
 5741  * SADB_UPDATE messages. We report NAT-T extension headers in replies
 5742  * to SADB_ADD, SADB_UPDATE, SADB_GET, and SADB_DUMP messages.
 5743  */
 5744 static int
 5745 key_setnatt(struct secasvar *sav, const struct sadb_msghdr *mhp)
 5746 {
 5747         struct sadb_x_nat_t_port *port;
 5748         struct sadb_x_nat_t_type *type;
 5749         struct sadb_address *oai, *oar;
 5750         struct sockaddr *sa;
 5751         uint32_t addr;
 5752         uint16_t cksum;
 5753 
 5754         IPSEC_ASSERT(sav->natt == NULL, ("natt is already initialized"));
 5755         /*
 5756          * Ignore NAT-T headers if sproto isn't ESP.
 5757          */
 5758         if (sav->sah->saidx.proto != IPPROTO_ESP)
 5759                 return (0);
 5760 
 5761         if (!SADB_CHECKHDR(mhp, SADB_X_EXT_NAT_T_TYPE) &&
 5762             !SADB_CHECKHDR(mhp, SADB_X_EXT_NAT_T_SPORT) &&
 5763             !SADB_CHECKHDR(mhp, SADB_X_EXT_NAT_T_DPORT)) {
 5764                 if (SADB_CHECKLEN(mhp, SADB_X_EXT_NAT_T_TYPE) ||
 5765                     SADB_CHECKLEN(mhp, SADB_X_EXT_NAT_T_SPORT) ||
 5766                     SADB_CHECKLEN(mhp, SADB_X_EXT_NAT_T_DPORT)) {
 5767                         ipseclog((LOG_DEBUG,
 5768                             "%s: invalid message: wrong header size.\n",
 5769                             __func__));
 5770                         return (EINVAL);
 5771                 }
 5772         } else
 5773                 return (0);
 5774 
 5775         type = (struct sadb_x_nat_t_type *)mhp->ext[SADB_X_EXT_NAT_T_TYPE];
 5776         if (type->sadb_x_nat_t_type_type != UDP_ENCAP_ESPINUDP) {
 5777                 ipseclog((LOG_DEBUG, "%s: unsupported NAT-T type %u.\n",
 5778                     __func__, type->sadb_x_nat_t_type_type));
 5779                 return (EINVAL);
 5780         }
 5781         /*
 5782          * Allocate storage for NAT-T config.
 5783          * On error it will be released by key_cleansav().
 5784          */
 5785         sav->natt = malloc(sizeof(struct secnatt), M_IPSEC_MISC,
 5786             M_NOWAIT | M_ZERO);
 5787         if (sav->natt == NULL) {
 5788                 PFKEYSTAT_INC(in_nomem);
 5789                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 5790                 return (ENOBUFS);
 5791         }
 5792         port = (struct sadb_x_nat_t_port *)mhp->ext[SADB_X_EXT_NAT_T_SPORT];
 5793         if (port->sadb_x_nat_t_port_port == 0) {
 5794                 ipseclog((LOG_DEBUG, "%s: invalid NAT-T sport specified.\n",
 5795                     __func__));
 5796                 return (EINVAL);
 5797         }
 5798         sav->natt->sport = port->sadb_x_nat_t_port_port;
 5799         port = (struct sadb_x_nat_t_port *)mhp->ext[SADB_X_EXT_NAT_T_DPORT];
 5800         if (port->sadb_x_nat_t_port_port == 0) {
 5801                 ipseclog((LOG_DEBUG, "%s: invalid NAT-T dport specified.\n",
 5802                     __func__));
 5803                 return (EINVAL);
 5804         }
 5805         sav->natt->dport = port->sadb_x_nat_t_port_port;
 5806 
 5807         /*
 5808          * SADB_X_EXT_NAT_T_OAI and SADB_X_EXT_NAT_T_OAR are optional
 5809          * and needed only for transport mode IPsec.
 5810          * Usually NAT translates only one address, but it is possible,
 5811          * that both addresses could be translated.
 5812          * NOTE: Value of SADB_X_EXT_NAT_T_OAI is equal to SADB_X_EXT_NAT_T_OA.
 5813          */
 5814         if (!SADB_CHECKHDR(mhp, SADB_X_EXT_NAT_T_OAI)) {
 5815                 if (SADB_CHECKLEN(mhp, SADB_X_EXT_NAT_T_OAI)) {
 5816                         ipseclog((LOG_DEBUG,
 5817                             "%s: invalid message: wrong header size.\n",
 5818                             __func__));
 5819                         return (EINVAL);
 5820                 }
 5821                 oai = (struct sadb_address *)mhp->ext[SADB_X_EXT_NAT_T_OAI];
 5822         } else
 5823                 oai = NULL;
 5824         if (!SADB_CHECKHDR(mhp, SADB_X_EXT_NAT_T_OAR)) {
 5825                 if (SADB_CHECKLEN(mhp, SADB_X_EXT_NAT_T_OAR)) {
 5826                         ipseclog((LOG_DEBUG,
 5827                             "%s: invalid message: wrong header size.\n",
 5828                             __func__));
 5829                         return (EINVAL);
 5830                 }
 5831                 oar = (struct sadb_address *)mhp->ext[SADB_X_EXT_NAT_T_OAR];
 5832         } else
 5833                 oar = NULL;
 5834 
 5835         /* Initialize addresses only for transport mode */
 5836         if (sav->sah->saidx.mode != IPSEC_MODE_TUNNEL) {
 5837                 cksum = 0;
 5838                 if (oai != NULL) {
 5839                         /* Currently we support only AF_INET */
 5840                         sa = (struct sockaddr *)(oai + 1);
 5841                         if (sa->sa_family != AF_INET ||
 5842                             sa->sa_len != sizeof(struct sockaddr_in)) {
 5843                                 ipseclog((LOG_DEBUG,
 5844                                     "%s: wrong NAT-OAi header.\n",
 5845                                     __func__));
 5846                                 return (EINVAL);
 5847                         }
 5848                         /* Ignore address if it the same */
 5849                         if (((struct sockaddr_in *)sa)->sin_addr.s_addr !=
 5850                             sav->sah->saidx.src.sin.sin_addr.s_addr) {
 5851                                 bcopy(sa, &sav->natt->oai.sa, sa->sa_len);
 5852                                 sav->natt->flags |= IPSEC_NATT_F_OAI;
 5853                                 /* Calculate checksum delta */
 5854                                 addr = sav->sah->saidx.src.sin.sin_addr.s_addr;
 5855                                 cksum = in_addword(cksum, ~addr >> 16);
 5856                                 cksum = in_addword(cksum, ~addr & 0xffff);
 5857                                 addr = sav->natt->oai.sin.sin_addr.s_addr;
 5858                                 cksum = in_addword(cksum, addr >> 16);
 5859                                 cksum = in_addword(cksum, addr & 0xffff);
 5860                         }
 5861                 }
 5862                 if (oar != NULL) {
 5863                         /* Currently we support only AF_INET */
 5864                         sa = (struct sockaddr *)(oar + 1);
 5865                         if (sa->sa_family != AF_INET ||
 5866                             sa->sa_len != sizeof(struct sockaddr_in)) {
 5867                                 ipseclog((LOG_DEBUG,
 5868                                     "%s: wrong NAT-OAr header.\n",
 5869                                     __func__));
 5870                                 return (EINVAL);
 5871                         }
 5872                         /* Ignore address if it the same */
 5873                         if (((struct sockaddr_in *)sa)->sin_addr.s_addr !=
 5874                             sav->sah->saidx.dst.sin.sin_addr.s_addr) {
 5875                                 bcopy(sa, &sav->natt->oar.sa, sa->sa_len);
 5876                                 sav->natt->flags |= IPSEC_NATT_F_OAR;
 5877                                 /* Calculate checksum delta */
 5878                                 addr = sav->sah->saidx.dst.sin.sin_addr.s_addr;
 5879                                 cksum = in_addword(cksum, ~addr >> 16);
 5880                                 cksum = in_addword(cksum, ~addr & 0xffff);
 5881                                 addr = sav->natt->oar.sin.sin_addr.s_addr;
 5882                                 cksum = in_addword(cksum, addr >> 16);
 5883                                 cksum = in_addword(cksum, addr & 0xffff);
 5884                         }
 5885                 }
 5886                 sav->natt->cksum = cksum;
 5887         }
 5888         return (0);
 5889 }
 5890 
 5891 static int
 5892 key_setident(struct secashead *sah, const struct sadb_msghdr *mhp)
 5893 {
 5894         const struct sadb_ident *idsrc, *iddst;
 5895 
 5896         IPSEC_ASSERT(sah != NULL, ("null secashead"));
 5897         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 5898         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 5899 
 5900         /* don't make buffer if not there */
 5901         if (SADB_CHECKHDR(mhp, SADB_EXT_IDENTITY_SRC) &&
 5902             SADB_CHECKHDR(mhp, SADB_EXT_IDENTITY_DST)) {
 5903                 sah->idents = NULL;
 5904                 sah->identd = NULL;
 5905                 return (0);
 5906         }
 5907 
 5908         if (SADB_CHECKHDR(mhp, SADB_EXT_IDENTITY_SRC) ||
 5909             SADB_CHECKHDR(mhp, SADB_EXT_IDENTITY_DST)) {
 5910                 ipseclog((LOG_DEBUG, "%s: invalid identity.\n", __func__));
 5911                 return (EINVAL);
 5912         }
 5913 
 5914         idsrc = (const struct sadb_ident *)mhp->ext[SADB_EXT_IDENTITY_SRC];
 5915         iddst = (const struct sadb_ident *)mhp->ext[SADB_EXT_IDENTITY_DST];
 5916 
 5917         /* validity check */
 5918         if (idsrc->sadb_ident_type != iddst->sadb_ident_type) {
 5919                 ipseclog((LOG_DEBUG, "%s: ident type mismatch.\n", __func__));
 5920                 return EINVAL;
 5921         }
 5922 
 5923         switch (idsrc->sadb_ident_type) {
 5924         case SADB_IDENTTYPE_PREFIX:
 5925         case SADB_IDENTTYPE_FQDN:
 5926         case SADB_IDENTTYPE_USERFQDN:
 5927         default:
 5928                 /* XXX do nothing */
 5929                 sah->idents = NULL;
 5930                 sah->identd = NULL;
 5931                 return 0;
 5932         }
 5933 
 5934         /* make structure */
 5935         sah->idents = malloc(sizeof(struct secident), M_IPSEC_MISC, M_NOWAIT);
 5936         if (sah->idents == NULL) {
 5937                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 5938                 return ENOBUFS;
 5939         }
 5940         sah->identd = malloc(sizeof(struct secident), M_IPSEC_MISC, M_NOWAIT);
 5941         if (sah->identd == NULL) {
 5942                 free(sah->idents, M_IPSEC_MISC);
 5943                 sah->idents = NULL;
 5944                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 5945                 return ENOBUFS;
 5946         }
 5947         sah->idents->type = idsrc->sadb_ident_type;
 5948         sah->idents->id = idsrc->sadb_ident_id;
 5949 
 5950         sah->identd->type = iddst->sadb_ident_type;
 5951         sah->identd->id = iddst->sadb_ident_id;
 5952 
 5953         return 0;
 5954 }
 5955 
 5956 /*
 5957  * m will not be freed on return.
 5958  * it is caller's responsibility to free the result.
 5959  *
 5960  * Called from SADB_ADD and SADB_UPDATE. Reply will contain headers
 5961  * from the request in defined order.
 5962  */
 5963 static struct mbuf *
 5964 key_getmsgbuf_x1(struct mbuf *m, const struct sadb_msghdr *mhp)
 5965 {
 5966         struct mbuf *n;
 5967 
 5968         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 5969         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 5970         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 5971 
 5972         /* create new sadb_msg to reply. */
 5973         n = key_gather_mbuf(m, mhp, 1, 16, SADB_EXT_RESERVED,
 5974             SADB_EXT_SA, SADB_X_EXT_SA2,
 5975             SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST,
 5976             SADB_EXT_LIFETIME_HARD, SADB_EXT_LIFETIME_SOFT,
 5977             SADB_EXT_IDENTITY_SRC, SADB_EXT_IDENTITY_DST,
 5978             SADB_X_EXT_NAT_T_TYPE, SADB_X_EXT_NAT_T_SPORT,
 5979             SADB_X_EXT_NAT_T_DPORT, SADB_X_EXT_NAT_T_OAI,
 5980             SADB_X_EXT_NAT_T_OAR, SADB_X_EXT_NEW_ADDRESS_SRC,
 5981             SADB_X_EXT_NEW_ADDRESS_DST);
 5982         if (!n)
 5983                 return NULL;
 5984 
 5985         if (n->m_len < sizeof(struct sadb_msg)) {
 5986                 n = m_pullup(n, sizeof(struct sadb_msg));
 5987                 if (n == NULL)
 5988                         return NULL;
 5989         }
 5990         mtod(n, struct sadb_msg *)->sadb_msg_errno = 0;
 5991         mtod(n, struct sadb_msg *)->sadb_msg_len =
 5992             PFKEY_UNIT64(n->m_pkthdr.len);
 5993 
 5994         return n;
 5995 }
 5996 
 5997 /*
 5998  * SADB_DELETE processing
 5999  * receive
 6000  *   <base, SA(*), address(SD)>
 6001  * from the ikmpd, and set SADB_SASTATE_DEAD,
 6002  * and send,
 6003  *   <base, SA(*), address(SD)>
 6004  * to the ikmpd.
 6005  *
 6006  * m will always be freed.
 6007  */
 6008 static int
 6009 key_delete(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 6010 {
 6011         struct secasindex saidx;
 6012         struct sadb_address *src0, *dst0;
 6013         struct secasvar *sav;
 6014         struct sadb_sa *sa0;
 6015         uint8_t proto;
 6016 
 6017         IPSEC_ASSERT(so != NULL, ("null socket"));
 6018         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 6019         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 6020         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 6021 
 6022         /* map satype to proto */
 6023         if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) {
 6024                 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n",
 6025                     __func__));
 6026                 return key_senderror(so, m, EINVAL);
 6027         }
 6028 
 6029         if (SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_SRC) ||
 6030             SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_DST) ||
 6031             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_SRC) ||
 6032             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_DST)) {
 6033                 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n",
 6034                     __func__));
 6035                 return key_senderror(so, m, EINVAL);
 6036         }
 6037 
 6038         src0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_SRC]);
 6039         dst0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_DST]);
 6040 
 6041         if (key_checksockaddrs((struct sockaddr *)(src0 + 1),
 6042             (struct sockaddr *)(dst0 + 1)) != 0) {
 6043                 ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
 6044                 return (key_senderror(so, m, EINVAL));
 6045         }
 6046         KEY_SETSECASIDX(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1, &saidx);
 6047         if (SADB_CHECKHDR(mhp, SADB_EXT_SA)) {
 6048                 /*
 6049                  * Caller wants us to delete all non-LARVAL SAs
 6050                  * that match the src/dst.  This is used during
 6051                  * IKE INITIAL-CONTACT.
 6052                  * XXXAE: this looks like some extension to RFC2367.
 6053                  */
 6054                 ipseclog((LOG_DEBUG, "%s: doing delete all.\n", __func__));
 6055                 return (key_delete_all(so, m, mhp, &saidx));
 6056         }
 6057         if (SADB_CHECKLEN(mhp, SADB_EXT_SA)) {
 6058                 ipseclog((LOG_DEBUG,
 6059                     "%s: invalid message: wrong header size.\n", __func__));
 6060                 return (key_senderror(so, m, EINVAL));
 6061         }
 6062         sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA];
 6063         SPI_ALLOC_LOCK();
 6064         if (proto == IPPROTO_TCP)
 6065                 sav = key_getsav_tcpmd5(&saidx, NULL);
 6066         else
 6067                 sav = key_getsavbyspi(sa0->sadb_sa_spi);
 6068         SPI_ALLOC_UNLOCK();
 6069         if (sav == NULL) {
 6070                 ipseclog((LOG_DEBUG, "%s: no SA found for SPI %u.\n",
 6071                     __func__, ntohl(sa0->sadb_sa_spi)));
 6072                 return (key_senderror(so, m, ESRCH));
 6073         }
 6074         if (key_cmpsaidx(&sav->sah->saidx, &saidx, CMP_HEAD) == 0) {
 6075                 ipseclog((LOG_DEBUG, "%s: saidx mismatched for SPI %u.\n",
 6076                     __func__, ntohl(sav->spi)));
 6077                 key_freesav(&sav);
 6078                 return (key_senderror(so, m, ESRCH));
 6079         }
 6080         KEYDBG(KEY_STAMP,
 6081             printf("%s: SA(%p)\n", __func__, sav));
 6082         KEYDBG(KEY_DATA, kdebug_secasv(sav));
 6083         key_unlinksav(sav);
 6084         key_freesav(&sav);
 6085 
 6086     {
 6087         struct mbuf *n;
 6088         struct sadb_msg *newmsg;
 6089 
 6090         /* create new sadb_msg to reply. */
 6091         n = key_gather_mbuf(m, mhp, 1, 4, SADB_EXT_RESERVED,
 6092             SADB_EXT_SA, SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST);
 6093         if (!n)
 6094                 return key_senderror(so, m, ENOBUFS);
 6095 
 6096         if (n->m_len < sizeof(struct sadb_msg)) {
 6097                 n = m_pullup(n, sizeof(struct sadb_msg));
 6098                 if (n == NULL)
 6099                         return key_senderror(so, m, ENOBUFS);
 6100         }
 6101         newmsg = mtod(n, struct sadb_msg *);
 6102         newmsg->sadb_msg_errno = 0;
 6103         newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len);
 6104 
 6105         m_freem(m);
 6106         return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
 6107     }
 6108 }
 6109 
 6110 /*
 6111  * delete all SAs for src/dst.  Called from key_delete().
 6112  */
 6113 static int
 6114 key_delete_all(struct socket *so, struct mbuf *m,
 6115     const struct sadb_msghdr *mhp, struct secasindex *saidx)
 6116 {
 6117         struct secasvar_queue drainq;
 6118         struct secashead *sah;
 6119         struct secasvar *sav, *nextsav;
 6120 
 6121         TAILQ_INIT(&drainq);
 6122         SAHTREE_WLOCK();
 6123         LIST_FOREACH(sah, SAHADDRHASH_HASH(saidx), addrhash) {
 6124                 if (key_cmpsaidx(&sah->saidx, saidx, CMP_HEAD) == 0)
 6125                         continue;
 6126                 /* Move all ALIVE SAs into drainq */
 6127                 TAILQ_CONCAT(&drainq, &sah->savtree_alive, chain);
 6128         }
 6129         /* Unlink all queued SAs from SPI hash */
 6130         TAILQ_FOREACH(sav, &drainq, chain) {
 6131                 sav->state = SADB_SASTATE_DEAD;
 6132                 LIST_REMOVE(sav, spihash);
 6133         }
 6134         SAHTREE_WUNLOCK();
 6135         /* Now we can release reference for all SAs in drainq */
 6136         sav = TAILQ_FIRST(&drainq);
 6137         while (sav != NULL) {
 6138                 KEYDBG(KEY_STAMP,
 6139                     printf("%s: SA(%p)\n", __func__, sav));
 6140                 KEYDBG(KEY_DATA, kdebug_secasv(sav));
 6141                 nextsav = TAILQ_NEXT(sav, chain);
 6142                 key_freesah(&sav->sah); /* release reference from SAV */
 6143                 key_freesav(&sav); /* release last reference */
 6144                 sav = nextsav;
 6145         }
 6146 
 6147     {
 6148         struct mbuf *n;
 6149         struct sadb_msg *newmsg;
 6150 
 6151         /* create new sadb_msg to reply. */
 6152         n = key_gather_mbuf(m, mhp, 1, 3, SADB_EXT_RESERVED,
 6153             SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST);
 6154         if (!n)
 6155                 return key_senderror(so, m, ENOBUFS);
 6156 
 6157         if (n->m_len < sizeof(struct sadb_msg)) {
 6158                 n = m_pullup(n, sizeof(struct sadb_msg));
 6159                 if (n == NULL)
 6160                         return key_senderror(so, m, ENOBUFS);
 6161         }
 6162         newmsg = mtod(n, struct sadb_msg *);
 6163         newmsg->sadb_msg_errno = 0;
 6164         newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len);
 6165 
 6166         m_freem(m);
 6167         return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
 6168     }
 6169 }
 6170 
 6171 /*
 6172  * Delete all alive SAs for corresponding xform.
 6173  * Larval SAs have not initialized tdb_xform, so it is safe to leave them
 6174  * here when xform disappears.
 6175  */
 6176 void
 6177 key_delete_xform(const struct xformsw *xsp)
 6178 {
 6179         struct secasvar_queue drainq;
 6180         struct secashead *sah;
 6181         struct secasvar *sav, *nextsav;
 6182 
 6183         TAILQ_INIT(&drainq);
 6184         SAHTREE_WLOCK();
 6185         TAILQ_FOREACH(sah, &V_sahtree, chain) {
 6186                 sav = TAILQ_FIRST(&sah->savtree_alive);
 6187                 if (sav == NULL)
 6188                         continue;
 6189                 if (sav->tdb_xform != xsp)
 6190                         continue;
 6191                 /*
 6192                  * It is supposed that all SAs in the chain are related to
 6193                  * one xform.
 6194                  */
 6195                 TAILQ_CONCAT(&drainq, &sah->savtree_alive, chain);
 6196         }
 6197         /* Unlink all queued SAs from SPI hash */
 6198         TAILQ_FOREACH(sav, &drainq, chain) {
 6199                 sav->state = SADB_SASTATE_DEAD;
 6200                 LIST_REMOVE(sav, spihash);
 6201         }
 6202         SAHTREE_WUNLOCK();
 6203 
 6204         /* Now we can release reference for all SAs in drainq */
 6205         sav = TAILQ_FIRST(&drainq);
 6206         while (sav != NULL) {
 6207                 KEYDBG(KEY_STAMP,
 6208                     printf("%s: SA(%p)\n", __func__, sav));
 6209                 KEYDBG(KEY_DATA, kdebug_secasv(sav));
 6210                 nextsav = TAILQ_NEXT(sav, chain);
 6211                 key_freesah(&sav->sah); /* release reference from SAV */
 6212                 key_freesav(&sav); /* release last reference */
 6213                 sav = nextsav;
 6214         }
 6215 }
 6216 
 6217 /*
 6218  * SADB_GET processing
 6219  * receive
 6220  *   <base, SA(*), address(SD)>
 6221  * from the ikmpd, and get a SP and a SA to respond,
 6222  * and send,
 6223  *   <base, SA, (lifetime(HSC),) address(SD), (address(P),) key(AE),
 6224  *       (identity(SD),) (sensitivity)>
 6225  * to the ikmpd.
 6226  *
 6227  * m will always be freed.
 6228  */
 6229 static int
 6230 key_get(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 6231 {
 6232         struct secasindex saidx;
 6233         struct sadb_address *src0, *dst0;
 6234         struct sadb_sa *sa0;
 6235         struct secasvar *sav;
 6236         uint8_t proto;
 6237 
 6238         IPSEC_ASSERT(so != NULL, ("null socket"));
 6239         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 6240         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 6241         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 6242 
 6243         /* map satype to proto */
 6244         if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) {
 6245                 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n",
 6246                         __func__));
 6247                 return key_senderror(so, m, EINVAL);
 6248         }
 6249 
 6250         if (SADB_CHECKHDR(mhp, SADB_EXT_SA) ||
 6251             SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_SRC) ||
 6252             SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_DST)) {
 6253                 ipseclog((LOG_DEBUG,
 6254                     "%s: invalid message: missing required header.\n",
 6255                     __func__));
 6256                 return key_senderror(so, m, EINVAL);
 6257         }
 6258         if (SADB_CHECKLEN(mhp, SADB_EXT_SA) ||
 6259             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_SRC) ||
 6260             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_DST)) {
 6261                 ipseclog((LOG_DEBUG,
 6262                     "%s: invalid message: wrong header size.\n", __func__));
 6263                 return key_senderror(so, m, EINVAL);
 6264         }
 6265 
 6266         sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA];
 6267         src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC];
 6268         dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST];
 6269 
 6270         if (key_checksockaddrs((struct sockaddr *)(src0 + 1),
 6271             (struct sockaddr *)(dst0 + 1)) != 0) {
 6272                 ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
 6273                 return key_senderror(so, m, EINVAL);
 6274         }
 6275         KEY_SETSECASIDX(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1, &saidx);
 6276 
 6277         SPI_ALLOC_LOCK();
 6278         if (proto == IPPROTO_TCP)
 6279                 sav = key_getsav_tcpmd5(&saidx, NULL);
 6280         else
 6281                 sav = key_getsavbyspi(sa0->sadb_sa_spi);
 6282         SPI_ALLOC_UNLOCK();
 6283         if (sav == NULL) {
 6284                 ipseclog((LOG_DEBUG, "%s: no SA found.\n", __func__));
 6285                 return key_senderror(so, m, ESRCH);
 6286         }
 6287         if (key_cmpsaidx(&sav->sah->saidx, &saidx, CMP_HEAD) == 0) {
 6288                 ipseclog((LOG_DEBUG, "%s: saidx mismatched for SPI %u.\n",
 6289                     __func__, ntohl(sa0->sadb_sa_spi)));
 6290                 key_freesav(&sav);
 6291                 return (key_senderror(so, m, ESRCH));
 6292         }
 6293 
 6294     {
 6295         struct mbuf *n;
 6296         uint8_t satype;
 6297 
 6298         /* map proto to satype */
 6299         if ((satype = key_proto2satype(sav->sah->saidx.proto)) == 0) {
 6300                 ipseclog((LOG_DEBUG, "%s: there was invalid proto in SAD.\n",
 6301                     __func__));
 6302                 key_freesav(&sav);
 6303                 return key_senderror(so, m, EINVAL);
 6304         }
 6305 
 6306         /* create new sadb_msg to reply. */
 6307         n = key_setdumpsa(sav, SADB_GET, satype, mhp->msg->sadb_msg_seq,
 6308             mhp->msg->sadb_msg_pid);
 6309 
 6310         key_freesav(&sav);
 6311         if (!n)
 6312                 return key_senderror(so, m, ENOBUFS);
 6313 
 6314         m_freem(m);
 6315         return key_sendup_mbuf(so, n, KEY_SENDUP_ONE);
 6316     }
 6317 }
 6318 
 6319 /* XXX make it sysctl-configurable? */
 6320 static void
 6321 key_getcomb_setlifetime(struct sadb_comb *comb)
 6322 {
 6323 
 6324         comb->sadb_comb_soft_allocations = 1;
 6325         comb->sadb_comb_hard_allocations = 1;
 6326         comb->sadb_comb_soft_bytes = 0;
 6327         comb->sadb_comb_hard_bytes = 0;
 6328         comb->sadb_comb_hard_addtime = 86400;   /* 1 day */
 6329         comb->sadb_comb_soft_addtime = comb->sadb_comb_soft_addtime * 80 / 100;
 6330         comb->sadb_comb_soft_usetime = 28800;   /* 8 hours */
 6331         comb->sadb_comb_hard_usetime = comb->sadb_comb_hard_usetime * 80 / 100;
 6332 }
 6333 
 6334 /*
 6335  * XXX reorder combinations by preference
 6336  * XXX no idea if the user wants ESP authentication or not
 6337  */
 6338 static struct mbuf *
 6339 key_getcomb_ealg(void)
 6340 {
 6341         struct sadb_comb *comb;
 6342         const struct enc_xform *algo;
 6343         struct mbuf *result = NULL, *m, *n;
 6344         int encmin;
 6345         int i, off, o;
 6346         int totlen;
 6347         const int l = PFKEY_ALIGN8(sizeof(struct sadb_comb));
 6348 
 6349         m = NULL;
 6350         for (i = 1; i <= SADB_EALG_MAX; i++) {
 6351                 algo = enc_algorithm_lookup(i);
 6352                 if (algo == NULL)
 6353                         continue;
 6354 
 6355                 /* discard algorithms with key size smaller than system min */
 6356                 if (_BITS(algo->maxkey) < V_ipsec_esp_keymin)
 6357                         continue;
 6358                 if (_BITS(algo->minkey) < V_ipsec_esp_keymin)
 6359                         encmin = V_ipsec_esp_keymin;
 6360                 else
 6361                         encmin = _BITS(algo->minkey);
 6362 
 6363                 if (V_ipsec_esp_auth)
 6364                         m = key_getcomb_ah();
 6365                 else {
 6366                         IPSEC_ASSERT(l <= MLEN,
 6367                                 ("l=%u > MLEN=%lu", l, (u_long) MLEN));
 6368                         MGET(m, M_NOWAIT, MT_DATA);
 6369                         if (m) {
 6370                                 M_ALIGN(m, l);
 6371                                 m->m_len = l;
 6372                                 m->m_next = NULL;
 6373                                 bzero(mtod(m, caddr_t), m->m_len);
 6374                         }
 6375                 }
 6376                 if (!m)
 6377                         goto fail;
 6378 
 6379                 totlen = 0;
 6380                 for (n = m; n; n = n->m_next)
 6381                         totlen += n->m_len;
 6382                 IPSEC_ASSERT((totlen % l) == 0, ("totlen=%u, l=%u", totlen, l));
 6383 
 6384                 for (off = 0; off < totlen; off += l) {
 6385                         n = m_pulldown(m, off, l, &o);
 6386                         if (!n) {
 6387                                 /* m is already freed */
 6388                                 goto fail;
 6389                         }
 6390                         comb = (struct sadb_comb *)(mtod(n, caddr_t) + o);
 6391                         bzero(comb, sizeof(*comb));
 6392                         key_getcomb_setlifetime(comb);
 6393                         comb->sadb_comb_encrypt = i;
 6394                         comb->sadb_comb_encrypt_minbits = encmin;
 6395                         comb->sadb_comb_encrypt_maxbits = _BITS(algo->maxkey);
 6396                 }
 6397 
 6398                 if (!result)
 6399                         result = m;
 6400                 else
 6401                         m_cat(result, m);
 6402         }
 6403 
 6404         return result;
 6405 
 6406  fail:
 6407         if (result)
 6408                 m_freem(result);
 6409         return NULL;
 6410 }
 6411 
 6412 static void
 6413 key_getsizes_ah(const struct auth_hash *ah, int alg, u_int16_t* min,
 6414     u_int16_t* max)
 6415 {
 6416 
 6417         *min = *max = ah->hashsize;
 6418         if (ah->keysize == 0) {
 6419                 /*
 6420                  * Transform takes arbitrary key size but algorithm
 6421                  * key size is restricted.  Enforce this here.
 6422                  */
 6423                 switch (alg) {
 6424                 case SADB_X_AALG_NULL:  *min = 1; *max = 256; break;
 6425                 case SADB_X_AALG_SHA2_256: *min = *max = 32; break;
 6426                 case SADB_X_AALG_SHA2_384: *min = *max = 48; break;
 6427                 case SADB_X_AALG_SHA2_512: *min = *max = 64; break;
 6428                 default:
 6429                         DPRINTF(("%s: unknown AH algorithm %u\n",
 6430                                 __func__, alg));
 6431                         break;
 6432                 }
 6433         }
 6434 }
 6435 
 6436 /*
 6437  * XXX reorder combinations by preference
 6438  */
 6439 static struct mbuf *
 6440 key_getcomb_ah(void)
 6441 {
 6442         const struct auth_hash *algo;
 6443         struct sadb_comb *comb;
 6444         struct mbuf *m;
 6445         u_int16_t minkeysize, maxkeysize;
 6446         int i;
 6447         const int l = PFKEY_ALIGN8(sizeof(struct sadb_comb));
 6448 
 6449         m = NULL;
 6450         for (i = 1; i <= SADB_AALG_MAX; i++) {
 6451 #if 1
 6452                 /* we prefer HMAC algorithms, not old algorithms */
 6453                 if (i != SADB_AALG_SHA1HMAC &&
 6454                     i != SADB_X_AALG_SHA2_256 &&
 6455                     i != SADB_X_AALG_SHA2_384 &&
 6456                     i != SADB_X_AALG_SHA2_512)
 6457                         continue;
 6458 #endif
 6459                 algo = auth_algorithm_lookup(i);
 6460                 if (!algo)
 6461                         continue;
 6462                 key_getsizes_ah(algo, i, &minkeysize, &maxkeysize);
 6463                 /* discard algorithms with key size smaller than system min */
 6464                 if (_BITS(minkeysize) < V_ipsec_ah_keymin)
 6465                         continue;
 6466 
 6467                 if (!m) {
 6468                         IPSEC_ASSERT(l <= MLEN,
 6469                                 ("l=%u > MLEN=%lu", l, (u_long) MLEN));
 6470                         MGET(m, M_NOWAIT, MT_DATA);
 6471                         if (m) {
 6472                                 M_ALIGN(m, l);
 6473                                 m->m_len = l;
 6474                                 m->m_next = NULL;
 6475                         }
 6476                 } else
 6477                         M_PREPEND(m, l, M_NOWAIT);
 6478                 if (!m)
 6479                         return NULL;
 6480 
 6481                 comb = mtod(m, struct sadb_comb *);
 6482                 bzero(comb, sizeof(*comb));
 6483                 key_getcomb_setlifetime(comb);
 6484                 comb->sadb_comb_auth = i;
 6485                 comb->sadb_comb_auth_minbits = _BITS(minkeysize);
 6486                 comb->sadb_comb_auth_maxbits = _BITS(maxkeysize);
 6487         }
 6488 
 6489         return m;
 6490 }
 6491 
 6492 /*
 6493  * not really an official behavior.  discussed in pf_key@inner.net in Sep2000.
 6494  * XXX reorder combinations by preference
 6495  */
 6496 static struct mbuf *
 6497 key_getcomb_ipcomp(void)
 6498 {
 6499         const struct comp_algo *algo;
 6500         struct sadb_comb *comb;
 6501         struct mbuf *m;
 6502         int i;
 6503         const int l = PFKEY_ALIGN8(sizeof(struct sadb_comb));
 6504 
 6505         m = NULL;
 6506         for (i = 1; i <= SADB_X_CALG_MAX; i++) {
 6507                 algo = comp_algorithm_lookup(i);
 6508                 if (!algo)
 6509                         continue;
 6510 
 6511                 if (!m) {
 6512                         IPSEC_ASSERT(l <= MLEN,
 6513                                 ("l=%u > MLEN=%lu", l, (u_long) MLEN));
 6514                         MGET(m, M_NOWAIT, MT_DATA);
 6515                         if (m) {
 6516                                 M_ALIGN(m, l);
 6517                                 m->m_len = l;
 6518                                 m->m_next = NULL;
 6519                         }
 6520                 } else
 6521                         M_PREPEND(m, l, M_NOWAIT);
 6522                 if (!m)
 6523                         return NULL;
 6524 
 6525                 comb = mtod(m, struct sadb_comb *);
 6526                 bzero(comb, sizeof(*comb));
 6527                 key_getcomb_setlifetime(comb);
 6528                 comb->sadb_comb_encrypt = i;
 6529                 /* what should we set into sadb_comb_*_{min,max}bits? */
 6530         }
 6531 
 6532         return m;
 6533 }
 6534 
 6535 /*
 6536  * XXX no way to pass mode (transport/tunnel) to userland
 6537  * XXX replay checking?
 6538  * XXX sysctl interface to ipsec_{ah,esp}_keymin
 6539  */
 6540 static struct mbuf *
 6541 key_getprop(const struct secasindex *saidx)
 6542 {
 6543         struct sadb_prop *prop;
 6544         struct mbuf *m, *n;
 6545         const int l = PFKEY_ALIGN8(sizeof(struct sadb_prop));
 6546         int totlen;
 6547 
 6548         switch (saidx->proto)  {
 6549         case IPPROTO_ESP:
 6550                 m = key_getcomb_ealg();
 6551                 break;
 6552         case IPPROTO_AH:
 6553                 m = key_getcomb_ah();
 6554                 break;
 6555         case IPPROTO_IPCOMP:
 6556                 m = key_getcomb_ipcomp();
 6557                 break;
 6558         default:
 6559                 return NULL;
 6560         }
 6561 
 6562         if (!m)
 6563                 return NULL;
 6564         M_PREPEND(m, l, M_NOWAIT);
 6565         if (!m)
 6566                 return NULL;
 6567 
 6568         totlen = 0;
 6569         for (n = m; n; n = n->m_next)
 6570                 totlen += n->m_len;
 6571 
 6572         prop = mtod(m, struct sadb_prop *);
 6573         bzero(prop, sizeof(*prop));
 6574         prop->sadb_prop_len = PFKEY_UNIT64(totlen);
 6575         prop->sadb_prop_exttype = SADB_EXT_PROPOSAL;
 6576         prop->sadb_prop_replay = 32;    /* XXX */
 6577 
 6578         return m;
 6579 }
 6580 
 6581 /*
 6582  * SADB_ACQUIRE processing called by key_checkrequest() and key_acquire2().
 6583  * send
 6584  *   <base, SA, address(SD), (address(P)), x_policy,
 6585  *       (identity(SD),) (sensitivity,) proposal>
 6586  * to KMD, and expect to receive
 6587  *   <base> with SADB_ACQUIRE if error occurred,
 6588  * or
 6589  *   <base, src address, dst address, (SPI range)> with SADB_GETSPI
 6590  * from KMD by PF_KEY.
 6591  *
 6592  * XXX x_policy is outside of RFC2367 (KAME extension).
 6593  * XXX sensitivity is not supported.
 6594  * XXX for ipcomp, RFC2367 does not define how to fill in proposal.
 6595  * see comment for key_getcomb_ipcomp().
 6596  *
 6597  * OUT:
 6598  *    0     : succeed
 6599  *    others: error number
 6600  */
 6601 static int
 6602 key_acquire(const struct secasindex *saidx, struct secpolicy *sp)
 6603 {
 6604         union sockaddr_union addr;
 6605         struct mbuf *result, *m;
 6606         uint32_t seq;
 6607         int error;
 6608         uint16_t ul_proto;
 6609         uint8_t mask, satype;
 6610 
 6611         IPSEC_ASSERT(saidx != NULL, ("null saidx"));
 6612         satype = key_proto2satype(saidx->proto);
 6613         IPSEC_ASSERT(satype != 0, ("null satype, protocol %u", saidx->proto));
 6614 
 6615         error = -1;
 6616         result = NULL;
 6617         ul_proto = IPSEC_ULPROTO_ANY;
 6618 
 6619         /* Get seq number to check whether sending message or not. */
 6620         seq = key_getacq(saidx, &error);
 6621         if (seq == 0)
 6622                 return (error);
 6623 
 6624         m = key_setsadbmsg(SADB_ACQUIRE, 0, satype, seq, 0, 0);
 6625         if (!m) {
 6626                 error = ENOBUFS;
 6627                 goto fail;
 6628         }
 6629         result = m;
 6630 
 6631         /*
 6632          * set sadb_address for saidx's.
 6633          *
 6634          * Note that if sp is supplied, then we're being called from
 6635          * key_allocsa_policy() and should supply port and protocol
 6636          * information.
 6637          * XXXAE: why only TCP and UDP? ICMP and SCTP looks applicable too.
 6638          * XXXAE: probably we can handle this in the ipsec[46]_allocsa().
 6639          * XXXAE: it looks like we should save this info in the ACQ entry.
 6640          */
 6641         if (sp != NULL && (sp->spidx.ul_proto == IPPROTO_TCP ||
 6642             sp->spidx.ul_proto == IPPROTO_UDP))
 6643                 ul_proto = sp->spidx.ul_proto;
 6644 
 6645         addr = saidx->src;
 6646         mask = FULLMASK;
 6647         if (ul_proto != IPSEC_ULPROTO_ANY) {
 6648                 switch (sp->spidx.src.sa.sa_family) {
 6649                 case AF_INET:
 6650                         if (sp->spidx.src.sin.sin_port != IPSEC_PORT_ANY) {
 6651                                 addr.sin.sin_port = sp->spidx.src.sin.sin_port;
 6652                                 mask = sp->spidx.prefs;
 6653                         }
 6654                         break;
 6655                 case AF_INET6:
 6656                         if (sp->spidx.src.sin6.sin6_port != IPSEC_PORT_ANY) {
 6657                                 addr.sin6.sin6_port =
 6658                                     sp->spidx.src.sin6.sin6_port;
 6659                                 mask = sp->spidx.prefs;
 6660                         }
 6661                         break;
 6662                 default:
 6663                         break;
 6664                 }
 6665         }
 6666         m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, &addr.sa, mask, ul_proto);
 6667         if (!m) {
 6668                 error = ENOBUFS;
 6669                 goto fail;
 6670         }
 6671         m_cat(result, m);
 6672 
 6673         addr = saidx->dst;
 6674         mask = FULLMASK;
 6675         if (ul_proto != IPSEC_ULPROTO_ANY) {
 6676                 switch (sp->spidx.dst.sa.sa_family) {
 6677                 case AF_INET:
 6678                         if (sp->spidx.dst.sin.sin_port != IPSEC_PORT_ANY) {
 6679                                 addr.sin.sin_port = sp->spidx.dst.sin.sin_port;
 6680                                 mask = sp->spidx.prefd;
 6681                         }
 6682                         break;
 6683                 case AF_INET6:
 6684                         if (sp->spidx.dst.sin6.sin6_port != IPSEC_PORT_ANY) {
 6685                                 addr.sin6.sin6_port =
 6686                                     sp->spidx.dst.sin6.sin6_port;
 6687                                 mask = sp->spidx.prefd;
 6688                         }
 6689                         break;
 6690                 default:
 6691                         break;
 6692                 }
 6693         }
 6694         m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, &addr.sa, mask, ul_proto);
 6695         if (!m) {
 6696                 error = ENOBUFS;
 6697                 goto fail;
 6698         }
 6699         m_cat(result, m);
 6700 
 6701         /* XXX proxy address (optional) */
 6702 
 6703         /*
 6704          * Set sadb_x_policy. This is KAME extension to RFC2367.
 6705          */
 6706         if (sp != NULL) {
 6707                 m = key_setsadbxpolicy(sp->policy, sp->spidx.dir, sp->id,
 6708                     sp->priority);
 6709                 if (!m) {
 6710                         error = ENOBUFS;
 6711                         goto fail;
 6712                 }
 6713                 m_cat(result, m);
 6714         }
 6715 
 6716         /*
 6717          * Set sadb_x_sa2 extension if saidx->reqid is not zero.
 6718          * This is FreeBSD extension to RFC2367.
 6719          */
 6720         if (saidx->reqid != 0) {
 6721                 m = key_setsadbxsa2(saidx->mode, 0, saidx->reqid);
 6722                 if (m == NULL) {
 6723                         error = ENOBUFS;
 6724                         goto fail;
 6725                 }
 6726                 m_cat(result, m);
 6727         }
 6728         /* XXX identity (optional) */
 6729 #if 0
 6730         if (idexttype && fqdn) {
 6731                 /* create identity extension (FQDN) */
 6732                 struct sadb_ident *id;
 6733                 int fqdnlen;
 6734 
 6735                 fqdnlen = strlen(fqdn) + 1;     /* +1 for terminating-NUL */
 6736                 id = (struct sadb_ident *)p;
 6737                 bzero(id, sizeof(*id) + PFKEY_ALIGN8(fqdnlen));
 6738                 id->sadb_ident_len = PFKEY_UNIT64(sizeof(*id) + PFKEY_ALIGN8(fqdnlen));
 6739                 id->sadb_ident_exttype = idexttype;
 6740                 id->sadb_ident_type = SADB_IDENTTYPE_FQDN;
 6741                 bcopy(fqdn, id + 1, fqdnlen);
 6742                 p += sizeof(struct sadb_ident) + PFKEY_ALIGN8(fqdnlen);
 6743         }
 6744 
 6745         if (idexttype) {
 6746                 /* create identity extension (USERFQDN) */
 6747                 struct sadb_ident *id;
 6748                 int userfqdnlen;
 6749 
 6750                 if (userfqdn) {
 6751                         /* +1 for terminating-NUL */
 6752                         userfqdnlen = strlen(userfqdn) + 1;
 6753                 } else
 6754                         userfqdnlen = 0;
 6755                 id = (struct sadb_ident *)p;
 6756                 bzero(id, sizeof(*id) + PFKEY_ALIGN8(userfqdnlen));
 6757                 id->sadb_ident_len = PFKEY_UNIT64(sizeof(*id) + PFKEY_ALIGN8(userfqdnlen));
 6758                 id->sadb_ident_exttype = idexttype;
 6759                 id->sadb_ident_type = SADB_IDENTTYPE_USERFQDN;
 6760                 /* XXX is it correct? */
 6761                 if (curproc && curproc->p_cred)
 6762                         id->sadb_ident_id = curproc->p_cred->p_ruid;
 6763                 if (userfqdn && userfqdnlen)
 6764                         bcopy(userfqdn, id + 1, userfqdnlen);
 6765                 p += sizeof(struct sadb_ident) + PFKEY_ALIGN8(userfqdnlen);
 6766         }
 6767 #endif
 6768 
 6769         /* XXX sensitivity (optional) */
 6770 
 6771         /* create proposal/combination extension */
 6772         m = key_getprop(saidx);
 6773 #if 0
 6774         /*
 6775          * spec conformant: always attach proposal/combination extension,
 6776          * the problem is that we have no way to attach it for ipcomp,
 6777          * due to the way sadb_comb is declared in RFC2367.
 6778          */
 6779         if (!m) {
 6780                 error = ENOBUFS;
 6781                 goto fail;
 6782         }
 6783         m_cat(result, m);
 6784 #else
 6785         /*
 6786          * outside of spec; make proposal/combination extension optional.
 6787          */
 6788         if (m)
 6789                 m_cat(result, m);
 6790 #endif
 6791 
 6792         if ((result->m_flags & M_PKTHDR) == 0) {
 6793                 error = EINVAL;
 6794                 goto fail;
 6795         }
 6796 
 6797         if (result->m_len < sizeof(struct sadb_msg)) {
 6798                 result = m_pullup(result, sizeof(struct sadb_msg));
 6799                 if (result == NULL) {
 6800                         error = ENOBUFS;
 6801                         goto fail;
 6802                 }
 6803         }
 6804 
 6805         result->m_pkthdr.len = 0;
 6806         for (m = result; m; m = m->m_next)
 6807                 result->m_pkthdr.len += m->m_len;
 6808 
 6809         mtod(result, struct sadb_msg *)->sadb_msg_len =
 6810             PFKEY_UNIT64(result->m_pkthdr.len);
 6811 
 6812         KEYDBG(KEY_STAMP,
 6813             printf("%s: SP(%p)\n", __func__, sp));
 6814         KEYDBG(KEY_DATA, kdebug_secasindex(saidx, NULL));
 6815 
 6816         return key_sendup_mbuf(NULL, result, KEY_SENDUP_REGISTERED);
 6817 
 6818  fail:
 6819         if (result)
 6820                 m_freem(result);
 6821         return error;
 6822 }
 6823 
 6824 static uint32_t
 6825 key_newacq(const struct secasindex *saidx, int *perror)
 6826 {
 6827         struct secacq *acq;
 6828         uint32_t seq;
 6829 
 6830         acq = malloc(sizeof(*acq), M_IPSEC_SAQ, M_NOWAIT | M_ZERO);
 6831         if (acq == NULL) {
 6832                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 6833                 *perror = ENOBUFS;
 6834                 return (0);
 6835         }
 6836 
 6837         /* copy secindex */
 6838         bcopy(saidx, &acq->saidx, sizeof(acq->saidx));
 6839         acq->created = time_second;
 6840         acq->count = 0;
 6841 
 6842         /* add to acqtree */
 6843         ACQ_LOCK();
 6844         seq = acq->seq = (V_acq_seq == ~0 ? 1 : ++V_acq_seq);
 6845         LIST_INSERT_HEAD(&V_acqtree, acq, chain);
 6846         LIST_INSERT_HEAD(ACQADDRHASH_HASH(saidx), acq, addrhash);
 6847         LIST_INSERT_HEAD(ACQSEQHASH_HASH(seq), acq, seqhash);
 6848         ACQ_UNLOCK();
 6849         *perror = 0;
 6850         return (seq);
 6851 }
 6852 
 6853 static uint32_t
 6854 key_getacq(const struct secasindex *saidx, int *perror)
 6855 {
 6856         struct secacq *acq;
 6857         uint32_t seq;
 6858 
 6859         ACQ_LOCK();
 6860         LIST_FOREACH(acq, ACQADDRHASH_HASH(saidx), addrhash) {
 6861                 if (key_cmpsaidx(&acq->saidx, saidx, CMP_EXACTLY)) {
 6862                         if (acq->count > V_key_blockacq_count) {
 6863                                 /*
 6864                                  * Reset counter and send message.
 6865                                  * Also reset created time to keep ACQ for
 6866                                  * this saidx.
 6867                                  */
 6868                                 acq->created = time_second;
 6869                                 acq->count = 0;
 6870                                 seq = acq->seq;
 6871                         } else {
 6872                                 /*
 6873                                  * Increment counter and do nothing.
 6874                                  * We send SADB_ACQUIRE message only
 6875                                  * for each V_key_blockacq_count packet.
 6876                                  */
 6877                                 acq->count++;
 6878                                 seq = 0;
 6879                         }
 6880                         break;
 6881                 }
 6882         }
 6883         ACQ_UNLOCK();
 6884         if (acq != NULL) {
 6885                 *perror = 0;
 6886                 return (seq);
 6887         }
 6888         /* allocate new  entry */
 6889         return (key_newacq(saidx, perror));
 6890 }
 6891 
 6892 static int
 6893 key_acqreset(uint32_t seq)
 6894 {
 6895         struct secacq *acq;
 6896 
 6897         ACQ_LOCK();
 6898         LIST_FOREACH(acq, ACQSEQHASH_HASH(seq), seqhash) {
 6899                 if (acq->seq == seq) {
 6900                         acq->count = 0;
 6901                         acq->created = time_second;
 6902                         break;
 6903                 }
 6904         }
 6905         ACQ_UNLOCK();
 6906         if (acq == NULL)
 6907                 return (ESRCH);
 6908         return (0);
 6909 }
 6910 /*
 6911  * Mark ACQ entry as stale to remove it in key_flush_acq().
 6912  * Called after successful SADB_GETSPI message.
 6913  */
 6914 static int
 6915 key_acqdone(const struct secasindex *saidx, uint32_t seq)
 6916 {
 6917         struct secacq *acq;
 6918 
 6919         ACQ_LOCK();
 6920         LIST_FOREACH(acq, ACQSEQHASH_HASH(seq), seqhash) {
 6921                 if (acq->seq == seq)
 6922                         break;
 6923         }
 6924         if (acq != NULL) {
 6925                 if (key_cmpsaidx(&acq->saidx, saidx, CMP_EXACTLY) == 0) {
 6926                         ipseclog((LOG_DEBUG,
 6927                             "%s: Mismatched saidx for ACQ %u\n", __func__, seq));
 6928                         acq = NULL;
 6929                 } else {
 6930                         acq->created = 0;
 6931                 }
 6932         } else {
 6933                 ipseclog((LOG_DEBUG,
 6934                     "%s: ACQ %u is not found.\n", __func__, seq));
 6935         }
 6936         ACQ_UNLOCK();
 6937         if (acq == NULL)
 6938                 return (ESRCH);
 6939         return (0);
 6940 }
 6941 
 6942 static struct secspacq *
 6943 key_newspacq(struct secpolicyindex *spidx)
 6944 {
 6945         struct secspacq *acq;
 6946 
 6947         /* get new entry */
 6948         acq = malloc(sizeof(struct secspacq), M_IPSEC_SAQ, M_NOWAIT|M_ZERO);
 6949         if (acq == NULL) {
 6950                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 6951                 return NULL;
 6952         }
 6953 
 6954         /* copy secindex */
 6955         bcopy(spidx, &acq->spidx, sizeof(acq->spidx));
 6956         acq->created = time_second;
 6957         acq->count = 0;
 6958 
 6959         /* add to spacqtree */
 6960         SPACQ_LOCK();
 6961         LIST_INSERT_HEAD(&V_spacqtree, acq, chain);
 6962         SPACQ_UNLOCK();
 6963 
 6964         return acq;
 6965 }
 6966 
 6967 static struct secspacq *
 6968 key_getspacq(struct secpolicyindex *spidx)
 6969 {
 6970         struct secspacq *acq;
 6971 
 6972         SPACQ_LOCK();
 6973         LIST_FOREACH(acq, &V_spacqtree, chain) {
 6974                 if (key_cmpspidx_exactly(spidx, &acq->spidx)) {
 6975                         /* NB: return holding spacq_lock */
 6976                         return acq;
 6977                 }
 6978         }
 6979         SPACQ_UNLOCK();
 6980 
 6981         return NULL;
 6982 }
 6983 
 6984 /*
 6985  * SADB_ACQUIRE processing,
 6986  * in first situation, is receiving
 6987  *   <base>
 6988  * from the ikmpd, and clear sequence of its secasvar entry.
 6989  *
 6990  * In second situation, is receiving
 6991  *   <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal>
 6992  * from a user land process, and return
 6993  *   <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal>
 6994  * to the socket.
 6995  *
 6996  * m will always be freed.
 6997  */
 6998 static int
 6999 key_acquire2(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 7000 {
 7001         SAHTREE_RLOCK_TRACKER;
 7002         struct sadb_address *src0, *dst0;
 7003         struct secasindex saidx;
 7004         struct secashead *sah;
 7005         uint32_t reqid;
 7006         int error;
 7007         uint8_t mode, proto;
 7008 
 7009         IPSEC_ASSERT(so != NULL, ("null socket"));
 7010         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 7011         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 7012         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 7013 
 7014         /*
 7015          * Error message from KMd.
 7016          * We assume that if error was occurred in IKEd, the length of PFKEY
 7017          * message is equal to the size of sadb_msg structure.
 7018          * We do not raise error even if error occurred in this function.
 7019          */
 7020         if (mhp->msg->sadb_msg_len == PFKEY_UNIT64(sizeof(struct sadb_msg))) {
 7021                 /* check sequence number */
 7022                 if (mhp->msg->sadb_msg_seq == 0 ||
 7023                     mhp->msg->sadb_msg_errno == 0) {
 7024                         ipseclog((LOG_DEBUG, "%s: must specify sequence "
 7025                                 "number and errno.\n", __func__));
 7026                 } else {
 7027                         /*
 7028                          * IKEd reported that error occurred.
 7029                          * XXXAE: what it expects from the kernel?
 7030                          * Probably we should send SADB_ACQUIRE again?
 7031                          * If so, reset ACQ's state.
 7032                          * XXXAE: it looks useless.
 7033                          */
 7034                         key_acqreset(mhp->msg->sadb_msg_seq);
 7035                 }
 7036                 m_freem(m);
 7037                 return (0);
 7038         }
 7039 
 7040         /*
 7041          * This message is from user land.
 7042          */
 7043 
 7044         /* map satype to proto */
 7045         if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) {
 7046                 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n",
 7047                     __func__));
 7048                 return key_senderror(so, m, EINVAL);
 7049         }
 7050 
 7051         if (SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_SRC) ||
 7052             SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_DST) ||
 7053             SADB_CHECKHDR(mhp, SADB_EXT_PROPOSAL)) {
 7054                 ipseclog((LOG_DEBUG,
 7055                     "%s: invalid message: missing required header.\n",
 7056                     __func__));
 7057                 return key_senderror(so, m, EINVAL);
 7058         }
 7059         if (SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_SRC) ||
 7060             SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_DST) ||
 7061             SADB_CHECKLEN(mhp, SADB_EXT_PROPOSAL)) {
 7062                 ipseclog((LOG_DEBUG,
 7063                     "%s: invalid message: wrong header size.\n", __func__));
 7064                 return key_senderror(so, m, EINVAL);
 7065         }
 7066 
 7067         if (SADB_CHECKHDR(mhp, SADB_X_EXT_SA2)) {
 7068                 mode = IPSEC_MODE_ANY;
 7069                 reqid = 0;
 7070         } else {
 7071                 if (SADB_CHECKLEN(mhp, SADB_X_EXT_SA2)) {
 7072                         ipseclog((LOG_DEBUG,
 7073                             "%s: invalid message: wrong header size.\n",
 7074                             __func__));
 7075                         return key_senderror(so, m, EINVAL);
 7076                 }
 7077                 mode = ((struct sadb_x_sa2 *)
 7078                     mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_mode;
 7079                 reqid = ((struct sadb_x_sa2 *)
 7080                     mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_reqid;
 7081         }
 7082 
 7083         src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC];
 7084         dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST];
 7085 
 7086         error = key_checksockaddrs((struct sockaddr *)(src0 + 1),
 7087             (struct sockaddr *)(dst0 + 1));
 7088         if (error != 0) {
 7089                 ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
 7090                 return key_senderror(so, m, EINVAL);
 7091         }
 7092         KEY_SETSECASIDX(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
 7093 
 7094         /* get a SA index */
 7095         SAHTREE_RLOCK();
 7096         LIST_FOREACH(sah, SAHADDRHASH_HASH(&saidx), addrhash) {
 7097                 if (key_cmpsaidx(&sah->saidx, &saidx, CMP_MODE_REQID))
 7098                         break;
 7099         }
 7100         SAHTREE_RUNLOCK();
 7101         if (sah != NULL) {
 7102                 ipseclog((LOG_DEBUG, "%s: a SA exists already.\n", __func__));
 7103                 return key_senderror(so, m, EEXIST);
 7104         }
 7105 
 7106         error = key_acquire(&saidx, NULL);
 7107         if (error != 0) {
 7108                 ipseclog((LOG_DEBUG,
 7109                     "%s: error %d returned from key_acquire()\n",
 7110                         __func__, error));
 7111                 return key_senderror(so, m, error);
 7112         }
 7113         m_freem(m);
 7114         return (0);
 7115 }
 7116 
 7117 /*
 7118  * SADB_REGISTER processing.
 7119  * If SATYPE_UNSPEC has been passed as satype, only return sabd_supported.
 7120  * receive
 7121  *   <base>
 7122  * from the ikmpd, and register a socket to send PF_KEY messages,
 7123  * and send
 7124  *   <base, supported>
 7125  * to KMD by PF_KEY.
 7126  * If socket is detached, must free from regnode.
 7127  *
 7128  * m will always be freed.
 7129  */
 7130 static int
 7131 key_register(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 7132 {
 7133         struct secreg *reg, *newreg = NULL;
 7134 
 7135         IPSEC_ASSERT(so != NULL, ("null socket"));
 7136         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 7137         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 7138         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 7139 
 7140         /* check for invalid register message */
 7141         if (mhp->msg->sadb_msg_satype >= sizeof(V_regtree)/sizeof(V_regtree[0]))
 7142                 return key_senderror(so, m, EINVAL);
 7143 
 7144         /* When SATYPE_UNSPEC is specified, only return sabd_supported. */
 7145         if (mhp->msg->sadb_msg_satype == SADB_SATYPE_UNSPEC)
 7146                 goto setmsg;
 7147 
 7148         /* check whether existing or not */
 7149         REGTREE_LOCK();
 7150         LIST_FOREACH(reg, &V_regtree[mhp->msg->sadb_msg_satype], chain) {
 7151                 if (reg->so == so) {
 7152                         REGTREE_UNLOCK();
 7153                         ipseclog((LOG_DEBUG, "%s: socket exists already.\n",
 7154                                 __func__));
 7155                         return key_senderror(so, m, EEXIST);
 7156                 }
 7157         }
 7158 
 7159         /* create regnode */
 7160         newreg =  malloc(sizeof(struct secreg), M_IPSEC_SAR, M_NOWAIT|M_ZERO);
 7161         if (newreg == NULL) {
 7162                 REGTREE_UNLOCK();
 7163                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 7164                 return key_senderror(so, m, ENOBUFS);
 7165         }
 7166 
 7167         newreg->so = so;
 7168         ((struct keycb *)(so->so_pcb))->kp_registered++;
 7169 
 7170         /* add regnode to regtree. */
 7171         LIST_INSERT_HEAD(&V_regtree[mhp->msg->sadb_msg_satype], newreg, chain);
 7172         REGTREE_UNLOCK();
 7173 
 7174   setmsg:
 7175     {
 7176         struct mbuf *n;
 7177         struct sadb_msg *newmsg;
 7178         struct sadb_supported *sup;
 7179         u_int len, alen, elen;
 7180         int off;
 7181         int i;
 7182         struct sadb_alg *alg;
 7183 
 7184         /* create new sadb_msg to reply. */
 7185         alen = 0;
 7186         for (i = 1; i <= SADB_AALG_MAX; i++) {
 7187                 if (auth_algorithm_lookup(i))
 7188                         alen += sizeof(struct sadb_alg);
 7189         }
 7190         if (alen)
 7191                 alen += sizeof(struct sadb_supported);
 7192         elen = 0;
 7193         for (i = 1; i <= SADB_EALG_MAX; i++) {
 7194                 if (enc_algorithm_lookup(i))
 7195                         elen += sizeof(struct sadb_alg);
 7196         }
 7197         if (elen)
 7198                 elen += sizeof(struct sadb_supported);
 7199 
 7200         len = sizeof(struct sadb_msg) + alen + elen;
 7201 
 7202         if (len > MCLBYTES)
 7203                 return key_senderror(so, m, ENOBUFS);
 7204 
 7205         n = key_mget(len);
 7206         if (n == NULL)
 7207                 return key_senderror(so, m, ENOBUFS);
 7208 
 7209         n->m_pkthdr.len = n->m_len = len;
 7210         n->m_next = NULL;
 7211         off = 0;
 7212 
 7213         m_copydata(m, 0, sizeof(struct sadb_msg), mtod(n, caddr_t) + off);
 7214         newmsg = mtod(n, struct sadb_msg *);
 7215         newmsg->sadb_msg_errno = 0;
 7216         newmsg->sadb_msg_len = PFKEY_UNIT64(len);
 7217         off += PFKEY_ALIGN8(sizeof(struct sadb_msg));
 7218 
 7219         /* for authentication algorithm */
 7220         if (alen) {
 7221                 sup = (struct sadb_supported *)(mtod(n, caddr_t) + off);
 7222                 sup->sadb_supported_len = PFKEY_UNIT64(alen);
 7223                 sup->sadb_supported_exttype = SADB_EXT_SUPPORTED_AUTH;
 7224                 off += PFKEY_ALIGN8(sizeof(*sup));
 7225 
 7226                 for (i = 1; i <= SADB_AALG_MAX; i++) {
 7227                         const struct auth_hash *aalgo;
 7228                         u_int16_t minkeysize, maxkeysize;
 7229 
 7230                         aalgo = auth_algorithm_lookup(i);
 7231                         if (!aalgo)
 7232                                 continue;
 7233                         alg = (struct sadb_alg *)(mtod(n, caddr_t) + off);
 7234                         alg->sadb_alg_id = i;
 7235                         alg->sadb_alg_ivlen = 0;
 7236                         key_getsizes_ah(aalgo, i, &minkeysize, &maxkeysize);
 7237                         alg->sadb_alg_minbits = _BITS(minkeysize);
 7238                         alg->sadb_alg_maxbits = _BITS(maxkeysize);
 7239                         off += PFKEY_ALIGN8(sizeof(*alg));
 7240                 }
 7241         }
 7242 
 7243         /* for encryption algorithm */
 7244         if (elen) {
 7245                 sup = (struct sadb_supported *)(mtod(n, caddr_t) + off);
 7246                 sup->sadb_supported_len = PFKEY_UNIT64(elen);
 7247                 sup->sadb_supported_exttype = SADB_EXT_SUPPORTED_ENCRYPT;
 7248                 off += PFKEY_ALIGN8(sizeof(*sup));
 7249 
 7250                 for (i = 1; i <= SADB_EALG_MAX; i++) {
 7251                         const struct enc_xform *ealgo;
 7252 
 7253                         ealgo = enc_algorithm_lookup(i);
 7254                         if (!ealgo)
 7255                                 continue;
 7256                         alg = (struct sadb_alg *)(mtod(n, caddr_t) + off);
 7257                         alg->sadb_alg_id = i;
 7258                         alg->sadb_alg_ivlen = ealgo->ivsize;
 7259                         alg->sadb_alg_minbits = _BITS(ealgo->minkey);
 7260                         alg->sadb_alg_maxbits = _BITS(ealgo->maxkey);
 7261                         off += PFKEY_ALIGN8(sizeof(struct sadb_alg));
 7262                 }
 7263         }
 7264 
 7265         IPSEC_ASSERT(off == len,
 7266                 ("length assumption failed (off %u len %u)", off, len));
 7267 
 7268         m_freem(m);
 7269         return key_sendup_mbuf(so, n, KEY_SENDUP_REGISTERED);
 7270     }
 7271 }
 7272 
 7273 /*
 7274  * free secreg entry registered.
 7275  * XXX: I want to do free a socket marked done SADB_RESIGER to socket.
 7276  */
 7277 void
 7278 key_freereg(struct socket *so)
 7279 {
 7280         struct secreg *reg;
 7281         int i;
 7282 
 7283         IPSEC_ASSERT(so != NULL, ("NULL so"));
 7284 
 7285         /*
 7286          * check whether existing or not.
 7287          * check all type of SA, because there is a potential that
 7288          * one socket is registered to multiple type of SA.
 7289          */
 7290         REGTREE_LOCK();
 7291         for (i = 0; i <= SADB_SATYPE_MAX; i++) {
 7292                 LIST_FOREACH(reg, &V_regtree[i], chain) {
 7293                         if (reg->so == so && __LIST_CHAINED(reg)) {
 7294                                 LIST_REMOVE(reg, chain);
 7295                                 free(reg, M_IPSEC_SAR);
 7296                                 break;
 7297                         }
 7298                 }
 7299         }
 7300         REGTREE_UNLOCK();
 7301 }
 7302 
 7303 /*
 7304  * SADB_EXPIRE processing
 7305  * send
 7306  *   <base, SA, SA2, lifetime(C and one of HS), address(SD)>
 7307  * to KMD by PF_KEY.
 7308  * NOTE: We send only soft lifetime extension.
 7309  *
 7310  * OUT: 0       : succeed
 7311  *      others  : error number
 7312  */
 7313 static int
 7314 key_expire(struct secasvar *sav, int hard)
 7315 {
 7316         struct mbuf *result = NULL, *m;
 7317         struct sadb_lifetime *lt;
 7318         uint32_t replay_count;
 7319         int error, len;
 7320         uint8_t satype;
 7321 
 7322         SECASVAR_RLOCK_TRACKER;
 7323 
 7324         IPSEC_ASSERT (sav != NULL, ("null sav"));
 7325         IPSEC_ASSERT (sav->sah != NULL, ("null sa header"));
 7326 
 7327         KEYDBG(KEY_STAMP,
 7328             printf("%s: SA(%p) expired %s lifetime\n", __func__,
 7329                 sav, hard ? "hard": "soft"));
 7330         KEYDBG(KEY_DATA, kdebug_secasv(sav));
 7331         /* set msg header */
 7332         satype = key_proto2satype(sav->sah->saidx.proto);
 7333         IPSEC_ASSERT(satype != 0, ("invalid proto, satype %u", satype));
 7334         m = key_setsadbmsg(SADB_EXPIRE, 0, satype, sav->seq, 0, sav->refcnt);
 7335         if (!m) {
 7336                 error = ENOBUFS;
 7337                 goto fail;
 7338         }
 7339         result = m;
 7340 
 7341         /* create SA extension */
 7342         m = key_setsadbsa(sav);
 7343         if (!m) {
 7344                 error = ENOBUFS;
 7345                 goto fail;
 7346         }
 7347         m_cat(result, m);
 7348 
 7349         /* create SA extension */
 7350         SECASVAR_RLOCK(sav);
 7351         replay_count = sav->replay ? sav->replay->count : 0;
 7352         SECASVAR_RUNLOCK(sav);
 7353 
 7354         m = key_setsadbxsa2(sav->sah->saidx.mode, replay_count,
 7355                         sav->sah->saidx.reqid);
 7356         if (!m) {
 7357                 error = ENOBUFS;
 7358                 goto fail;
 7359         }
 7360         m_cat(result, m);
 7361 
 7362         if (sav->replay && sav->replay->wsize > UINT8_MAX) {
 7363                 m = key_setsadbxsareplay(sav->replay->wsize);
 7364                 if (!m) {
 7365                         error = ENOBUFS;
 7366                         goto fail;
 7367                 }
 7368                 m_cat(result, m);
 7369         }
 7370 
 7371         /* create lifetime extension (current and soft) */
 7372         len = PFKEY_ALIGN8(sizeof(*lt)) * 2;
 7373         m = m_get2(len, M_NOWAIT, MT_DATA, 0);
 7374         if (m == NULL) {
 7375                 error = ENOBUFS;
 7376                 goto fail;
 7377         }
 7378         m_align(m, len);
 7379         m->m_len = len;
 7380         bzero(mtod(m, caddr_t), len);
 7381         lt = mtod(m, struct sadb_lifetime *);
 7382         lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime));
 7383         lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT;
 7384         lt->sadb_lifetime_allocations =
 7385             (uint32_t)counter_u64_fetch(sav->lft_c_allocations);
 7386         lt->sadb_lifetime_bytes =
 7387             counter_u64_fetch(sav->lft_c_bytes);
 7388         lt->sadb_lifetime_addtime = sav->created;
 7389         lt->sadb_lifetime_usetime = sav->firstused;
 7390         lt = (struct sadb_lifetime *)(mtod(m, caddr_t) + len / 2);
 7391         lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime));
 7392         if (hard) {
 7393                 lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD;
 7394                 lt->sadb_lifetime_allocations = sav->lft_h->allocations;
 7395                 lt->sadb_lifetime_bytes = sav->lft_h->bytes;
 7396                 lt->sadb_lifetime_addtime = sav->lft_h->addtime;
 7397                 lt->sadb_lifetime_usetime = sav->lft_h->usetime;
 7398         } else {
 7399                 lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT;
 7400                 lt->sadb_lifetime_allocations = sav->lft_s->allocations;
 7401                 lt->sadb_lifetime_bytes = sav->lft_s->bytes;
 7402                 lt->sadb_lifetime_addtime = sav->lft_s->addtime;
 7403                 lt->sadb_lifetime_usetime = sav->lft_s->usetime;
 7404         }
 7405         m_cat(result, m);
 7406 
 7407         /* set sadb_address for source */
 7408         m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC,
 7409             &sav->sah->saidx.src.sa,
 7410             FULLMASK, IPSEC_ULPROTO_ANY);
 7411         if (!m) {
 7412                 error = ENOBUFS;
 7413                 goto fail;
 7414         }
 7415         m_cat(result, m);
 7416 
 7417         /* set sadb_address for destination */
 7418         m = key_setsadbaddr(SADB_EXT_ADDRESS_DST,
 7419             &sav->sah->saidx.dst.sa,
 7420             FULLMASK, IPSEC_ULPROTO_ANY);
 7421         if (!m) {
 7422                 error = ENOBUFS;
 7423                 goto fail;
 7424         }
 7425         m_cat(result, m);
 7426 
 7427         /*
 7428          * XXX-BZ Handle NAT-T extensions here.
 7429          * XXXAE: it doesn't seem quite useful. IKEs should not depend on
 7430          * this information, we report only significant SA fields.
 7431          */
 7432 
 7433         if ((result->m_flags & M_PKTHDR) == 0) {
 7434                 error = EINVAL;
 7435                 goto fail;
 7436         }
 7437 
 7438         if (result->m_len < sizeof(struct sadb_msg)) {
 7439                 result = m_pullup(result, sizeof(struct sadb_msg));
 7440                 if (result == NULL) {
 7441                         error = ENOBUFS;
 7442                         goto fail;
 7443                 }
 7444         }
 7445 
 7446         result->m_pkthdr.len = 0;
 7447         for (m = result; m; m = m->m_next)
 7448                 result->m_pkthdr.len += m->m_len;
 7449 
 7450         mtod(result, struct sadb_msg *)->sadb_msg_len =
 7451             PFKEY_UNIT64(result->m_pkthdr.len);
 7452 
 7453         return key_sendup_mbuf(NULL, result, KEY_SENDUP_REGISTERED);
 7454 
 7455  fail:
 7456         if (result)
 7457                 m_freem(result);
 7458         return error;
 7459 }
 7460 
 7461 static void
 7462 key_freesah_flushed(struct secashead_queue *flushq)
 7463 {
 7464         struct secashead *sah, *nextsah;
 7465         struct secasvar *sav, *nextsav;
 7466 
 7467         sah = TAILQ_FIRST(flushq);
 7468         while (sah != NULL) {
 7469                 sav = TAILQ_FIRST(&sah->savtree_larval);
 7470                 while (sav != NULL) {
 7471                         nextsav = TAILQ_NEXT(sav, chain);
 7472                         TAILQ_REMOVE(&sah->savtree_larval, sav, chain);
 7473                         key_freesav(&sav); /* release last reference */
 7474                         key_freesah(&sah); /* release reference from SAV */
 7475                         sav = nextsav;
 7476                 }
 7477                 sav = TAILQ_FIRST(&sah->savtree_alive);
 7478                 while (sav != NULL) {
 7479                         nextsav = TAILQ_NEXT(sav, chain);
 7480                         TAILQ_REMOVE(&sah->savtree_alive, sav, chain);
 7481                         key_freesav(&sav); /* release last reference */
 7482                         key_freesah(&sah); /* release reference from SAV */
 7483                         sav = nextsav;
 7484                 }
 7485                 nextsah = TAILQ_NEXT(sah, chain);
 7486                 key_freesah(&sah);      /* release last reference */
 7487                 sah = nextsah;
 7488         }
 7489 }
 7490 
 7491 /*
 7492  * SADB_FLUSH processing
 7493  * receive
 7494  *   <base>
 7495  * from the ikmpd, and free all entries in secastree.
 7496  * and send,
 7497  *   <base>
 7498  * to the ikmpd.
 7499  * NOTE: to do is only marking SADB_SASTATE_DEAD.
 7500  *
 7501  * m will always be freed.
 7502  */
 7503 static int
 7504 key_flush(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 7505 {
 7506         struct secashead_queue flushq;
 7507         struct sadb_msg *newmsg;
 7508         struct secashead *sah, *nextsah;
 7509         struct secasvar *sav;
 7510         uint8_t proto;
 7511         int i;
 7512 
 7513         IPSEC_ASSERT(so != NULL, ("null socket"));
 7514         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 7515         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 7516 
 7517         /* map satype to proto */
 7518         if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) {
 7519                 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n",
 7520                         __func__));
 7521                 return key_senderror(so, m, EINVAL);
 7522         }
 7523         KEYDBG(KEY_STAMP,
 7524             printf("%s: proto %u\n", __func__, proto));
 7525 
 7526         TAILQ_INIT(&flushq);
 7527         if (proto == IPSEC_PROTO_ANY) {
 7528                 /* no SATYPE specified, i.e. flushing all SA. */
 7529                 SAHTREE_WLOCK();
 7530                 /* Move all SAHs into flushq */
 7531                 TAILQ_CONCAT(&flushq, &V_sahtree, chain);
 7532                 /* Flush all buckets in SPI hash */
 7533                 for (i = 0; i < V_savhash_mask + 1; i++)
 7534                         LIST_INIT(&V_savhashtbl[i]);
 7535                 /* Flush all buckets in SAHADDRHASH */
 7536                 for (i = 0; i < V_sahaddrhash_mask + 1; i++)
 7537                         LIST_INIT(&V_sahaddrhashtbl[i]);
 7538                 /* Mark all SAHs as unlinked */
 7539                 TAILQ_FOREACH(sah, &flushq, chain) {
 7540                         sah->state = SADB_SASTATE_DEAD;
 7541                         /*
 7542                          * Callout handler makes its job using
 7543                          * RLOCK and drain queues. In case, when this
 7544                          * function will be called just before it
 7545                          * acquires WLOCK, we need to mark SAs as
 7546                          * unlinked to prevent second unlink.
 7547                          */
 7548                         TAILQ_FOREACH(sav, &sah->savtree_larval, chain) {
 7549                                 sav->state = SADB_SASTATE_DEAD;
 7550                         }
 7551                         TAILQ_FOREACH(sav, &sah->savtree_alive, chain) {
 7552                                 sav->state = SADB_SASTATE_DEAD;
 7553                         }
 7554                 }
 7555                 SAHTREE_WUNLOCK();
 7556         } else {
 7557                 SAHTREE_WLOCK();
 7558                 sah = TAILQ_FIRST(&V_sahtree);
 7559                 while (sah != NULL) {
 7560                         IPSEC_ASSERT(sah->state != SADB_SASTATE_DEAD,
 7561                             ("DEAD SAH %p in SADB_FLUSH", sah));
 7562                         nextsah = TAILQ_NEXT(sah, chain);
 7563                         if (sah->saidx.proto != proto) {
 7564                                 sah = nextsah;
 7565                                 continue;
 7566                         }
 7567                         sah->state = SADB_SASTATE_DEAD;
 7568                         TAILQ_REMOVE(&V_sahtree, sah, chain);
 7569                         LIST_REMOVE(sah, addrhash);
 7570                         /* Unlink all SAs from SPI hash */
 7571                         TAILQ_FOREACH(sav, &sah->savtree_larval, chain) {
 7572                                 LIST_REMOVE(sav, spihash);
 7573                                 sav->state = SADB_SASTATE_DEAD;
 7574                         }
 7575                         TAILQ_FOREACH(sav, &sah->savtree_alive, chain) {
 7576                                 LIST_REMOVE(sav, spihash);
 7577                                 sav->state = SADB_SASTATE_DEAD;
 7578                         }
 7579                         /* Add SAH into flushq */
 7580                         TAILQ_INSERT_HEAD(&flushq, sah, chain);
 7581                         sah = nextsah;
 7582                 }
 7583                 SAHTREE_WUNLOCK();
 7584         }
 7585 
 7586         key_freesah_flushed(&flushq);
 7587         /* Free all queued SAs and SAHs */
 7588         if (m->m_len < sizeof(struct sadb_msg) ||
 7589             sizeof(struct sadb_msg) > m->m_len + M_TRAILINGSPACE(m)) {
 7590                 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__));
 7591                 return key_senderror(so, m, ENOBUFS);
 7592         }
 7593 
 7594         if (m->m_next)
 7595                 m_freem(m->m_next);
 7596         m->m_next = NULL;
 7597         m->m_pkthdr.len = m->m_len = sizeof(struct sadb_msg);
 7598         newmsg = mtod(m, struct sadb_msg *);
 7599         newmsg->sadb_msg_errno = 0;
 7600         newmsg->sadb_msg_len = PFKEY_UNIT64(m->m_pkthdr.len);
 7601 
 7602         return key_sendup_mbuf(so, m, KEY_SENDUP_ALL);
 7603 }
 7604 
 7605 /*
 7606  * SADB_DUMP processing
 7607  * dump all entries including status of DEAD in SAD.
 7608  * receive
 7609  *   <base>
 7610  * from the ikmpd, and dump all secasvar leaves
 7611  * and send,
 7612  *   <base> .....
 7613  * to the ikmpd.
 7614  *
 7615  * m will always be freed.
 7616  */
 7617 static int
 7618 key_dump(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 7619 {
 7620         SAHTREE_RLOCK_TRACKER;
 7621         struct secashead *sah;
 7622         struct secasvar *sav;
 7623         struct mbuf *n;
 7624         uint32_t cnt;
 7625         uint8_t proto, satype;
 7626 
 7627         IPSEC_ASSERT(so != NULL, ("null socket"));
 7628         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 7629         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 7630         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 7631 
 7632         /* map satype to proto */
 7633         if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) {
 7634                 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n",
 7635                     __func__));
 7636                 return key_senderror(so, m, EINVAL);
 7637         }
 7638 
 7639         /* count sav entries to be sent to the userland. */
 7640         cnt = 0;
 7641         SAHTREE_RLOCK();
 7642         TAILQ_FOREACH(sah, &V_sahtree, chain) {
 7643                 if (mhp->msg->sadb_msg_satype != SADB_SATYPE_UNSPEC &&
 7644                     proto != sah->saidx.proto)
 7645                         continue;
 7646 
 7647                 TAILQ_FOREACH(sav, &sah->savtree_larval, chain)
 7648                         cnt++;
 7649                 TAILQ_FOREACH(sav, &sah->savtree_alive, chain)
 7650                         cnt++;
 7651         }
 7652 
 7653         if (cnt == 0) {
 7654                 SAHTREE_RUNLOCK();
 7655                 return key_senderror(so, m, ENOENT);
 7656         }
 7657 
 7658         /* send this to the userland, one at a time. */
 7659         TAILQ_FOREACH(sah, &V_sahtree, chain) {
 7660                 if (mhp->msg->sadb_msg_satype != SADB_SATYPE_UNSPEC &&
 7661                     proto != sah->saidx.proto)
 7662                         continue;
 7663 
 7664                 /* map proto to satype */
 7665                 if ((satype = key_proto2satype(sah->saidx.proto)) == 0) {
 7666                         SAHTREE_RUNLOCK();
 7667                         ipseclog((LOG_DEBUG, "%s: there was invalid proto in "
 7668                             "SAD.\n", __func__));
 7669                         return key_senderror(so, m, EINVAL);
 7670                 }
 7671                 TAILQ_FOREACH(sav, &sah->savtree_larval, chain) {
 7672                         n = key_setdumpsa(sav, SADB_DUMP, satype,
 7673                             --cnt, mhp->msg->sadb_msg_pid);
 7674                         if (n == NULL) {
 7675                                 SAHTREE_RUNLOCK();
 7676                                 return key_senderror(so, m, ENOBUFS);
 7677                         }
 7678                         key_sendup_mbuf(so, n, KEY_SENDUP_ONE);
 7679                 }
 7680                 TAILQ_FOREACH(sav, &sah->savtree_alive, chain) {
 7681                         n = key_setdumpsa(sav, SADB_DUMP, satype,
 7682                             --cnt, mhp->msg->sadb_msg_pid);
 7683                         if (n == NULL) {
 7684                                 SAHTREE_RUNLOCK();
 7685                                 return key_senderror(so, m, ENOBUFS);
 7686                         }
 7687                         key_sendup_mbuf(so, n, KEY_SENDUP_ONE);
 7688                 }
 7689         }
 7690         SAHTREE_RUNLOCK();
 7691         m_freem(m);
 7692         return (0);
 7693 }
 7694 /*
 7695  * SADB_X_PROMISC processing
 7696  *
 7697  * m will always be freed.
 7698  */
 7699 static int
 7700 key_promisc(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 7701 {
 7702         int olen;
 7703 
 7704         IPSEC_ASSERT(so != NULL, ("null socket"));
 7705         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 7706         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 7707         IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
 7708 
 7709         olen = PFKEY_UNUNIT64(mhp->msg->sadb_msg_len);
 7710 
 7711         if (olen < sizeof(struct sadb_msg)) {
 7712 #if 1
 7713                 return key_senderror(so, m, EINVAL);
 7714 #else
 7715                 m_freem(m);
 7716                 return 0;
 7717 #endif
 7718         } else if (olen == sizeof(struct sadb_msg)) {
 7719                 /* enable/disable promisc mode */
 7720                 struct keycb *kp;
 7721 
 7722                 if ((kp = so->so_pcb) == NULL)
 7723                         return key_senderror(so, m, EINVAL);
 7724                 mhp->msg->sadb_msg_errno = 0;
 7725                 switch (mhp->msg->sadb_msg_satype) {
 7726                 case 0:
 7727                 case 1:
 7728                         kp->kp_promisc = mhp->msg->sadb_msg_satype;
 7729                         break;
 7730                 default:
 7731                         return key_senderror(so, m, EINVAL);
 7732                 }
 7733 
 7734                 /* send the original message back to everyone */
 7735                 mhp->msg->sadb_msg_errno = 0;
 7736                 return key_sendup_mbuf(so, m, KEY_SENDUP_ALL);
 7737         } else {
 7738                 /* send packet as is */
 7739 
 7740                 m_adj(m, PFKEY_ALIGN8(sizeof(struct sadb_msg)));
 7741 
 7742                 /* TODO: if sadb_msg_seq is specified, send to specific pid */
 7743                 return key_sendup_mbuf(so, m, KEY_SENDUP_ALL);
 7744         }
 7745 }
 7746 
 7747 static int (*key_typesw[])(struct socket *, struct mbuf *,
 7748                 const struct sadb_msghdr *) = {
 7749         NULL,           /* SADB_RESERVED */
 7750         key_getspi,     /* SADB_GETSPI */
 7751         key_update,     /* SADB_UPDATE */
 7752         key_add,        /* SADB_ADD */
 7753         key_delete,     /* SADB_DELETE */
 7754         key_get,        /* SADB_GET */
 7755         key_acquire2,   /* SADB_ACQUIRE */
 7756         key_register,   /* SADB_REGISTER */
 7757         NULL,           /* SADB_EXPIRE */
 7758         key_flush,      /* SADB_FLUSH */
 7759         key_dump,       /* SADB_DUMP */
 7760         key_promisc,    /* SADB_X_PROMISC */
 7761         NULL,           /* SADB_X_PCHANGE */
 7762         key_spdadd,     /* SADB_X_SPDUPDATE */
 7763         key_spdadd,     /* SADB_X_SPDADD */
 7764         key_spddelete,  /* SADB_X_SPDDELETE */
 7765         key_spdget,     /* SADB_X_SPDGET */
 7766         NULL,           /* SADB_X_SPDACQUIRE */
 7767         key_spddump,    /* SADB_X_SPDDUMP */
 7768         key_spdflush,   /* SADB_X_SPDFLUSH */
 7769         key_spdadd,     /* SADB_X_SPDSETIDX */
 7770         NULL,           /* SADB_X_SPDEXPIRE */
 7771         key_spddelete2, /* SADB_X_SPDDELETE2 */
 7772 };
 7773 
 7774 /*
 7775  * parse sadb_msg buffer to process PFKEYv2,
 7776  * and create a data to response if needed.
 7777  * I think to be dealed with mbuf directly.
 7778  * IN:
 7779  *     msgp  : pointer to pointer to a received buffer pulluped.
 7780  *             This is rewrited to response.
 7781  *     so    : pointer to socket.
 7782  * OUT:
 7783  *    length for buffer to send to user process.
 7784  */
 7785 int
 7786 key_parse(struct mbuf *m, struct socket *so)
 7787 {
 7788         struct sadb_msg *msg;
 7789         struct sadb_msghdr mh;
 7790         u_int orglen;
 7791         int error;
 7792         int target;
 7793 
 7794         IPSEC_ASSERT(so != NULL, ("null socket"));
 7795         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 7796 
 7797         if (m->m_len < sizeof(struct sadb_msg)) {
 7798                 m = m_pullup(m, sizeof(struct sadb_msg));
 7799                 if (!m)
 7800                         return ENOBUFS;
 7801         }
 7802         msg = mtod(m, struct sadb_msg *);
 7803         orglen = PFKEY_UNUNIT64(msg->sadb_msg_len);
 7804         target = KEY_SENDUP_ONE;
 7805 
 7806         if ((m->m_flags & M_PKTHDR) == 0 || m->m_pkthdr.len != orglen) {
 7807                 ipseclog((LOG_DEBUG, "%s: invalid message length.\n",__func__));
 7808                 PFKEYSTAT_INC(out_invlen);
 7809                 error = EINVAL;
 7810                 goto senderror;
 7811         }
 7812 
 7813         if (msg->sadb_msg_version != PF_KEY_V2) {
 7814                 ipseclog((LOG_DEBUG, "%s: PF_KEY version %u is mismatched.\n",
 7815                     __func__, msg->sadb_msg_version));
 7816                 PFKEYSTAT_INC(out_invver);
 7817                 error = EINVAL;
 7818                 goto senderror;
 7819         }
 7820 
 7821         if (msg->sadb_msg_type > SADB_MAX) {
 7822                 ipseclog((LOG_DEBUG, "%s: invalid type %u is passed.\n",
 7823                     __func__, msg->sadb_msg_type));
 7824                 PFKEYSTAT_INC(out_invmsgtype);
 7825                 error = EINVAL;
 7826                 goto senderror;
 7827         }
 7828 
 7829         /* for old-fashioned code - should be nuked */
 7830         if (m->m_pkthdr.len > MCLBYTES) {
 7831                 m_freem(m);
 7832                 return ENOBUFS;
 7833         }
 7834         if (m->m_next) {
 7835                 struct mbuf *n;
 7836 
 7837                 n = key_mget(m->m_pkthdr.len);
 7838                 if (n == NULL) {
 7839                         m_freem(m);
 7840                         return ENOBUFS;
 7841                 }
 7842                 m_copydata(m, 0, m->m_pkthdr.len, mtod(n, caddr_t));
 7843                 n->m_pkthdr.len = n->m_len = m->m_pkthdr.len;
 7844                 n->m_next = NULL;
 7845                 m_freem(m);
 7846                 m = n;
 7847         }
 7848 
 7849         /* align the mbuf chain so that extensions are in contiguous region. */
 7850         error = key_align(m, &mh);
 7851         if (error)
 7852                 return error;
 7853 
 7854         msg = mh.msg;
 7855 
 7856         /* We use satype as scope mask for spddump */
 7857         if (msg->sadb_msg_type == SADB_X_SPDDUMP) {
 7858                 switch (msg->sadb_msg_satype) {
 7859                 case IPSEC_POLICYSCOPE_ANY:
 7860                 case IPSEC_POLICYSCOPE_GLOBAL:
 7861                 case IPSEC_POLICYSCOPE_IFNET:
 7862                 case IPSEC_POLICYSCOPE_PCB:
 7863                         break;
 7864                 default:
 7865                         ipseclog((LOG_DEBUG, "%s: illegal satype=%u\n",
 7866                             __func__, msg->sadb_msg_type));
 7867                         PFKEYSTAT_INC(out_invsatype);
 7868                         error = EINVAL;
 7869                         goto senderror;
 7870                 }
 7871         } else {
 7872                 switch (msg->sadb_msg_satype) { /* check SA type */
 7873                 case SADB_SATYPE_UNSPEC:
 7874                         switch (msg->sadb_msg_type) {
 7875                         case SADB_GETSPI:
 7876                         case SADB_UPDATE:
 7877                         case SADB_ADD:
 7878                         case SADB_DELETE:
 7879                         case SADB_GET:
 7880                         case SADB_ACQUIRE:
 7881                         case SADB_EXPIRE:
 7882                                 ipseclog((LOG_DEBUG, "%s: must specify satype "
 7883                                     "when msg type=%u.\n", __func__,
 7884                                     msg->sadb_msg_type));
 7885                                 PFKEYSTAT_INC(out_invsatype);
 7886                                 error = EINVAL;
 7887                                 goto senderror;
 7888                         }
 7889                         break;
 7890                 case SADB_SATYPE_AH:
 7891                 case SADB_SATYPE_ESP:
 7892                 case SADB_X_SATYPE_IPCOMP:
 7893                 case SADB_X_SATYPE_TCPSIGNATURE:
 7894                         switch (msg->sadb_msg_type) {
 7895                         case SADB_X_SPDADD:
 7896                         case SADB_X_SPDDELETE:
 7897                         case SADB_X_SPDGET:
 7898                         case SADB_X_SPDFLUSH:
 7899                         case SADB_X_SPDSETIDX:
 7900                         case SADB_X_SPDUPDATE:
 7901                         case SADB_X_SPDDELETE2:
 7902                                 ipseclog((LOG_DEBUG, "%s: illegal satype=%u\n",
 7903                                     __func__, msg->sadb_msg_type));
 7904                                 PFKEYSTAT_INC(out_invsatype);
 7905                                 error = EINVAL;
 7906                                 goto senderror;
 7907                         }
 7908                         break;
 7909                 case SADB_SATYPE_RSVP:
 7910                 case SADB_SATYPE_OSPFV2:
 7911                 case SADB_SATYPE_RIPV2:
 7912                 case SADB_SATYPE_MIP:
 7913                         ipseclog((LOG_DEBUG, "%s: type %u isn't supported.\n",
 7914                             __func__, msg->sadb_msg_satype));
 7915                         PFKEYSTAT_INC(out_invsatype);
 7916                         error = EOPNOTSUPP;
 7917                         goto senderror;
 7918                 case 1: /* XXX: What does it do? */
 7919                         if (msg->sadb_msg_type == SADB_X_PROMISC)
 7920                                 break;
 7921                         /*FALLTHROUGH*/
 7922                 default:
 7923                         ipseclog((LOG_DEBUG, "%s: invalid type %u is passed.\n",
 7924                             __func__, msg->sadb_msg_satype));
 7925                         PFKEYSTAT_INC(out_invsatype);
 7926                         error = EINVAL;
 7927                         goto senderror;
 7928                 }
 7929         }
 7930 
 7931         /* check field of upper layer protocol and address family */
 7932         if (mh.ext[SADB_EXT_ADDRESS_SRC] != NULL
 7933          && mh.ext[SADB_EXT_ADDRESS_DST] != NULL) {
 7934                 struct sadb_address *src0, *dst0;
 7935                 u_int plen;
 7936 
 7937                 src0 = (struct sadb_address *)(mh.ext[SADB_EXT_ADDRESS_SRC]);
 7938                 dst0 = (struct sadb_address *)(mh.ext[SADB_EXT_ADDRESS_DST]);
 7939 
 7940                 /* check upper layer protocol */
 7941                 if (src0->sadb_address_proto != dst0->sadb_address_proto) {
 7942                         ipseclog((LOG_DEBUG, "%s: upper layer protocol "
 7943                                 "mismatched.\n", __func__));
 7944                         PFKEYSTAT_INC(out_invaddr);
 7945                         error = EINVAL;
 7946                         goto senderror;
 7947                 }
 7948 
 7949                 /* check family */
 7950                 if (PFKEY_ADDR_SADDR(src0)->sa_family !=
 7951                     PFKEY_ADDR_SADDR(dst0)->sa_family) {
 7952                         ipseclog((LOG_DEBUG, "%s: address family mismatched.\n",
 7953                                 __func__));
 7954                         PFKEYSTAT_INC(out_invaddr);
 7955                         error = EINVAL;
 7956                         goto senderror;
 7957                 }
 7958                 if (PFKEY_ADDR_SADDR(src0)->sa_len !=
 7959                     PFKEY_ADDR_SADDR(dst0)->sa_len) {
 7960                         ipseclog((LOG_DEBUG, "%s: address struct size "
 7961                                 "mismatched.\n", __func__));
 7962                         PFKEYSTAT_INC(out_invaddr);
 7963                         error = EINVAL;
 7964                         goto senderror;
 7965                 }
 7966 
 7967                 switch (PFKEY_ADDR_SADDR(src0)->sa_family) {
 7968                 case AF_INET:
 7969                         if (PFKEY_ADDR_SADDR(src0)->sa_len !=
 7970                             sizeof(struct sockaddr_in)) {
 7971                                 PFKEYSTAT_INC(out_invaddr);
 7972                                 error = EINVAL;
 7973                                 goto senderror;
 7974                         }
 7975                         break;
 7976                 case AF_INET6:
 7977                         if (PFKEY_ADDR_SADDR(src0)->sa_len !=
 7978                             sizeof(struct sockaddr_in6)) {
 7979                                 PFKEYSTAT_INC(out_invaddr);
 7980                                 error = EINVAL;
 7981                                 goto senderror;
 7982                         }
 7983                         break;
 7984                 default:
 7985                         ipseclog((LOG_DEBUG, "%s: unsupported address family\n",
 7986                                 __func__));
 7987                         PFKEYSTAT_INC(out_invaddr);
 7988                         error = EAFNOSUPPORT;
 7989                         goto senderror;
 7990                 }
 7991 
 7992                 switch (PFKEY_ADDR_SADDR(src0)->sa_family) {
 7993                 case AF_INET:
 7994                         plen = sizeof(struct in_addr) << 3;
 7995                         break;
 7996                 case AF_INET6:
 7997                         plen = sizeof(struct in6_addr) << 3;
 7998                         break;
 7999                 default:
 8000                         plen = 0;       /*fool gcc*/
 8001                         break;
 8002                 }
 8003 
 8004                 /* check max prefix length */
 8005                 if (src0->sadb_address_prefixlen > plen ||
 8006                     dst0->sadb_address_prefixlen > plen) {
 8007                         ipseclog((LOG_DEBUG, "%s: illegal prefixlen.\n",
 8008                                 __func__));
 8009                         PFKEYSTAT_INC(out_invaddr);
 8010                         error = EINVAL;
 8011                         goto senderror;
 8012                 }
 8013 
 8014                 /*
 8015                  * prefixlen == 0 is valid because there can be a case when
 8016                  * all addresses are matched.
 8017                  */
 8018         }
 8019 
 8020         if (msg->sadb_msg_type >= nitems(key_typesw) ||
 8021             key_typesw[msg->sadb_msg_type] == NULL) {
 8022                 PFKEYSTAT_INC(out_invmsgtype);
 8023                 error = EINVAL;
 8024                 goto senderror;
 8025         }
 8026 
 8027         return (*key_typesw[msg->sadb_msg_type])(so, m, &mh);
 8028 
 8029 senderror:
 8030         msg->sadb_msg_errno = error;
 8031         return key_sendup_mbuf(so, m, target);
 8032 }
 8033 
 8034 static int
 8035 key_senderror(struct socket *so, struct mbuf *m, int code)
 8036 {
 8037         struct sadb_msg *msg;
 8038 
 8039         IPSEC_ASSERT(m->m_len >= sizeof(struct sadb_msg),
 8040                 ("mbuf too small, len %u", m->m_len));
 8041 
 8042         msg = mtod(m, struct sadb_msg *);
 8043         msg->sadb_msg_errno = code;
 8044         return key_sendup_mbuf(so, m, KEY_SENDUP_ONE);
 8045 }
 8046 
 8047 /*
 8048  * set the pointer to each header into message buffer.
 8049  * m will be freed on error.
 8050  * XXX larger-than-MCLBYTES extension?
 8051  */
 8052 static int
 8053 key_align(struct mbuf *m, struct sadb_msghdr *mhp)
 8054 {
 8055         struct mbuf *n;
 8056         struct sadb_ext *ext;
 8057         size_t off, end;
 8058         int extlen;
 8059         int toff;
 8060 
 8061         IPSEC_ASSERT(m != NULL, ("null mbuf"));
 8062         IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
 8063         IPSEC_ASSERT(m->m_len >= sizeof(struct sadb_msg),
 8064                 ("mbuf too small, len %u", m->m_len));
 8065 
 8066         /* initialize */
 8067         bzero(mhp, sizeof(*mhp));
 8068 
 8069         mhp->msg = mtod(m, struct sadb_msg *);
 8070         mhp->ext[0] = (struct sadb_ext *)mhp->msg;      /*XXX backward compat */
 8071 
 8072         end = PFKEY_UNUNIT64(mhp->msg->sadb_msg_len);
 8073         extlen = end;   /*just in case extlen is not updated*/
 8074         for (off = sizeof(struct sadb_msg); off < end; off += extlen) {
 8075                 n = m_pulldown(m, off, sizeof(struct sadb_ext), &toff);
 8076                 if (!n) {
 8077                         /* m is already freed */
 8078                         return ENOBUFS;
 8079                 }
 8080                 ext = (struct sadb_ext *)(mtod(n, caddr_t) + toff);
 8081 
 8082                 /* set pointer */
 8083                 switch (ext->sadb_ext_type) {
 8084                 case SADB_EXT_SA:
 8085                 case SADB_EXT_ADDRESS_SRC:
 8086                 case SADB_EXT_ADDRESS_DST:
 8087                 case SADB_EXT_ADDRESS_PROXY:
 8088                 case SADB_EXT_LIFETIME_CURRENT:
 8089                 case SADB_EXT_LIFETIME_HARD:
 8090                 case SADB_EXT_LIFETIME_SOFT:
 8091                 case SADB_EXT_KEY_AUTH:
 8092                 case SADB_EXT_KEY_ENCRYPT:
 8093                 case SADB_EXT_IDENTITY_SRC:
 8094                 case SADB_EXT_IDENTITY_DST:
 8095                 case SADB_EXT_SENSITIVITY:
 8096                 case SADB_EXT_PROPOSAL:
 8097                 case SADB_EXT_SUPPORTED_AUTH:
 8098                 case SADB_EXT_SUPPORTED_ENCRYPT:
 8099                 case SADB_EXT_SPIRANGE:
 8100                 case SADB_X_EXT_POLICY:
 8101                 case SADB_X_EXT_SA2:
 8102                 case SADB_X_EXT_NAT_T_TYPE:
 8103                 case SADB_X_EXT_NAT_T_SPORT:
 8104                 case SADB_X_EXT_NAT_T_DPORT:
 8105                 case SADB_X_EXT_NAT_T_OAI:
 8106                 case SADB_X_EXT_NAT_T_OAR:
 8107                 case SADB_X_EXT_NAT_T_FRAG:
 8108                 case SADB_X_EXT_SA_REPLAY:
 8109                 case SADB_X_EXT_NEW_ADDRESS_SRC:
 8110                 case SADB_X_EXT_NEW_ADDRESS_DST:
 8111                         /* duplicate check */
 8112                         /*
 8113                          * XXX Are there duplication payloads of either
 8114                          * KEY_AUTH or KEY_ENCRYPT ?
 8115                          */
 8116                         if (mhp->ext[ext->sadb_ext_type] != NULL) {
 8117                                 ipseclog((LOG_DEBUG, "%s: duplicate ext_type "
 8118                                         "%u\n", __func__, ext->sadb_ext_type));
 8119                                 m_freem(m);
 8120                                 PFKEYSTAT_INC(out_dupext);
 8121                                 return EINVAL;
 8122                         }
 8123                         break;
 8124                 default:
 8125                         ipseclog((LOG_DEBUG, "%s: invalid ext_type %u\n",
 8126                                 __func__, ext->sadb_ext_type));
 8127                         m_freem(m);
 8128                         PFKEYSTAT_INC(out_invexttype);
 8129                         return EINVAL;
 8130                 }
 8131 
 8132                 extlen = PFKEY_UNUNIT64(ext->sadb_ext_len);
 8133 
 8134                 if (key_validate_ext(ext, extlen)) {
 8135                         m_freem(m);
 8136                         PFKEYSTAT_INC(out_invlen);
 8137                         return EINVAL;
 8138                 }
 8139 
 8140                 n = m_pulldown(m, off, extlen, &toff);
 8141                 if (!n) {
 8142                         /* m is already freed */
 8143                         return ENOBUFS;
 8144                 }
 8145                 ext = (struct sadb_ext *)(mtod(n, caddr_t) + toff);
 8146 
 8147                 mhp->ext[ext->sadb_ext_type] = ext;
 8148                 mhp->extoff[ext->sadb_ext_type] = off;
 8149                 mhp->extlen[ext->sadb_ext_type] = extlen;
 8150         }
 8151 
 8152         if (off != end) {
 8153                 m_freem(m);
 8154                 PFKEYSTAT_INC(out_invlen);
 8155                 return EINVAL;
 8156         }
 8157 
 8158         return 0;
 8159 }
 8160 
 8161 static int
 8162 key_validate_ext(const struct sadb_ext *ext, int len)
 8163 {
 8164         const struct sockaddr *sa;
 8165         enum { NONE, ADDR } checktype = NONE;
 8166         int baselen = 0;
 8167         const int sal = offsetof(struct sockaddr, sa_len) + sizeof(sa->sa_len);
 8168 
 8169         if (len != PFKEY_UNUNIT64(ext->sadb_ext_len))
 8170                 return EINVAL;
 8171 
 8172         /* if it does not match minimum/maximum length, bail */
 8173         if (ext->sadb_ext_type >= nitems(minsize) ||
 8174             ext->sadb_ext_type >= nitems(maxsize))
 8175                 return EINVAL;
 8176         if (!minsize[ext->sadb_ext_type] || len < minsize[ext->sadb_ext_type])
 8177                 return EINVAL;
 8178         if (maxsize[ext->sadb_ext_type] && len > maxsize[ext->sadb_ext_type])
 8179                 return EINVAL;
 8180 
 8181         /* more checks based on sadb_ext_type XXX need more */
 8182         switch (ext->sadb_ext_type) {
 8183         case SADB_EXT_ADDRESS_SRC:
 8184         case SADB_EXT_ADDRESS_DST:
 8185         case SADB_EXT_ADDRESS_PROXY:
 8186         case SADB_X_EXT_NAT_T_OAI:
 8187         case SADB_X_EXT_NAT_T_OAR:
 8188         case SADB_X_EXT_NEW_ADDRESS_SRC:
 8189         case SADB_X_EXT_NEW_ADDRESS_DST:
 8190                 baselen = PFKEY_ALIGN8(sizeof(struct sadb_address));
 8191                 checktype = ADDR;
 8192                 break;
 8193         case SADB_EXT_IDENTITY_SRC:
 8194         case SADB_EXT_IDENTITY_DST:
 8195                 if (((const struct sadb_ident *)ext)->sadb_ident_type ==
 8196                     SADB_X_IDENTTYPE_ADDR) {
 8197                         baselen = PFKEY_ALIGN8(sizeof(struct sadb_ident));
 8198                         checktype = ADDR;
 8199                 } else
 8200                         checktype = NONE;
 8201                 break;
 8202         default:
 8203                 checktype = NONE;
 8204                 break;
 8205         }
 8206 
 8207         switch (checktype) {
 8208         case NONE:
 8209                 break;
 8210         case ADDR:
 8211                 sa = (const struct sockaddr *)(((const u_int8_t*)ext)+baselen);
 8212                 if (len < baselen + sal)
 8213                         return EINVAL;
 8214                 if (baselen + PFKEY_ALIGN8(sa->sa_len) != len)
 8215                         return EINVAL;
 8216                 break;
 8217         }
 8218 
 8219         return 0;
 8220 }
 8221 
 8222 void
 8223 spdcache_init(void)
 8224 {
 8225         int i;
 8226 
 8227         TUNABLE_INT_FETCH("net.key.spdcache.maxentries",
 8228             &V_key_spdcache_maxentries);
 8229         TUNABLE_INT_FETCH("net.key.spdcache.threshold",
 8230             &V_key_spdcache_threshold);
 8231 
 8232         if (V_key_spdcache_maxentries) {
 8233                 V_key_spdcache_maxentries = MAX(V_key_spdcache_maxentries,
 8234                     SPDCACHE_MAX_ENTRIES_PER_HASH);
 8235                 V_spdcachehashtbl = hashinit(V_key_spdcache_maxentries /
 8236                     SPDCACHE_MAX_ENTRIES_PER_HASH,
 8237                     M_IPSEC_SPDCACHE, &V_spdcachehash_mask);
 8238                 V_key_spdcache_maxentries = (V_spdcachehash_mask + 1)
 8239                     * SPDCACHE_MAX_ENTRIES_PER_HASH;
 8240 
 8241                 V_spdcache_lock = malloc(sizeof(struct mtx) *
 8242                     (V_spdcachehash_mask + 1),
 8243                     M_IPSEC_SPDCACHE, M_WAITOK|M_ZERO);
 8244 
 8245                 for (i = 0; i < V_spdcachehash_mask + 1; ++i)
 8246                         SPDCACHE_LOCK_INIT(i);
 8247         }
 8248 }
 8249 
 8250 struct spdcache_entry *
 8251 spdcache_entry_alloc(const struct secpolicyindex *spidx, struct secpolicy *sp)
 8252 {
 8253         struct spdcache_entry *entry;
 8254 
 8255         entry = malloc(sizeof(struct spdcache_entry),
 8256                     M_IPSEC_SPDCACHE, M_NOWAIT|M_ZERO);
 8257         if (entry == NULL)
 8258                 return NULL;
 8259 
 8260         if (sp != NULL)
 8261                 SP_ADDREF(sp);
 8262 
 8263         entry->spidx = *spidx;
 8264         entry->sp = sp;
 8265 
 8266         return (entry);
 8267 }
 8268 
 8269 void
 8270 spdcache_entry_free(struct spdcache_entry *entry)
 8271 {
 8272 
 8273         if (entry->sp != NULL)
 8274                 key_freesp(&entry->sp);
 8275         free(entry, M_IPSEC_SPDCACHE);
 8276 }
 8277 
 8278 void
 8279 spdcache_clear(void)
 8280 {
 8281         struct spdcache_entry *entry;
 8282         int i;
 8283 
 8284         for (i = 0; i < V_spdcachehash_mask + 1; ++i) {
 8285                 SPDCACHE_LOCK(i);
 8286                 while (!LIST_EMPTY(&V_spdcachehashtbl[i])) {
 8287                         entry = LIST_FIRST(&V_spdcachehashtbl[i]);
 8288                         LIST_REMOVE(entry, chain);
 8289                         spdcache_entry_free(entry);
 8290                 }
 8291                 SPDCACHE_UNLOCK(i);
 8292         }
 8293 }
 8294 
 8295 #ifdef VIMAGE
 8296 void
 8297 spdcache_destroy(void)
 8298 {
 8299         int i;
 8300 
 8301         if (SPDCACHE_ENABLED()) {
 8302                 spdcache_clear();
 8303                 hashdestroy(V_spdcachehashtbl, M_IPSEC_SPDCACHE, V_spdcachehash_mask);
 8304 
 8305                 for (i = 0; i < V_spdcachehash_mask + 1; ++i)
 8306                         SPDCACHE_LOCK_DESTROY(i);
 8307 
 8308                 free(V_spdcache_lock, M_IPSEC_SPDCACHE);
 8309         }
 8310 }
 8311 #endif
 8312 
 8313 static void
 8314 key_vnet_init(void *arg __unused)
 8315 {
 8316         int i;
 8317 
 8318         for (i = 0; i < IPSEC_DIR_MAX; i++) {
 8319                 TAILQ_INIT(&V_sptree[i]);
 8320                 TAILQ_INIT(&V_sptree_ifnet[i]);
 8321         }
 8322 
 8323         TAILQ_INIT(&V_sahtree);
 8324         V_sphashtbl = hashinit(SPHASH_NHASH, M_IPSEC_SP, &V_sphash_mask);
 8325         V_savhashtbl = hashinit(SAVHASH_NHASH, M_IPSEC_SA, &V_savhash_mask);
 8326         V_sahaddrhashtbl = hashinit(SAHHASH_NHASH, M_IPSEC_SAH,
 8327             &V_sahaddrhash_mask);
 8328         V_acqaddrhashtbl = hashinit(ACQHASH_NHASH, M_IPSEC_SAQ,
 8329             &V_acqaddrhash_mask);
 8330         V_acqseqhashtbl = hashinit(ACQHASH_NHASH, M_IPSEC_SAQ,
 8331             &V_acqseqhash_mask);
 8332 
 8333         spdcache_init();
 8334 
 8335         for (i = 0; i <= SADB_SATYPE_MAX; i++)
 8336                 LIST_INIT(&V_regtree[i]);
 8337 
 8338         LIST_INIT(&V_acqtree);
 8339         LIST_INIT(&V_spacqtree);
 8340 }
 8341 VNET_SYSINIT(key_vnet_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_SECOND,
 8342     key_vnet_init, NULL);
 8343 
 8344 static void
 8345 key_init(void *arg __unused)
 8346 {
 8347 
 8348         ipsec_key_lft_zone = uma_zcreate("IPsec SA lft_c",
 8349             sizeof(uint64_t) * 2, NULL, NULL, NULL, NULL,
 8350             UMA_ALIGN_PTR, UMA_ZONE_PCPU);
 8351 
 8352         SPTREE_LOCK_INIT();
 8353         REGTREE_LOCK_INIT();
 8354         SAHTREE_LOCK_INIT();
 8355         ACQ_LOCK_INIT();
 8356         SPACQ_LOCK_INIT();
 8357         SPI_ALLOC_LOCK_INIT();
 8358 
 8359 #ifndef IPSEC_DEBUG2
 8360         callout_init(&key_timer, 1);
 8361         callout_reset(&key_timer, hz, key_timehandler, NULL);
 8362 #endif /*IPSEC_DEBUG2*/
 8363 
 8364         /* initialize key statistics */
 8365         keystat.getspi_count = 1;
 8366 
 8367         if (bootverbose)
 8368                 printf("IPsec: Initialized Security Association Processing.\n");
 8369 }
 8370 SYSINIT(key_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_FIRST, key_init, NULL);
 8371 
 8372 #ifdef VIMAGE
 8373 static void
 8374 key_vnet_destroy(void *arg __unused)
 8375 {
 8376         struct secashead_queue sahdrainq;
 8377         struct secpolicy_queue drainq;
 8378         struct secpolicy *sp, *nextsp;
 8379         struct secacq *acq, *nextacq;
 8380         struct secspacq *spacq, *nextspacq;
 8381         struct secashead *sah;
 8382         struct secasvar *sav;
 8383         struct secreg *reg;
 8384         int i;
 8385 
 8386         /*
 8387          * XXX: can we just call free() for each object without
 8388          * walking through safe way with releasing references?
 8389          */
 8390         TAILQ_INIT(&drainq);
 8391         SPTREE_WLOCK();
 8392         for (i = 0; i < IPSEC_DIR_MAX; i++) {
 8393                 TAILQ_CONCAT(&drainq, &V_sptree[i], chain);
 8394                 TAILQ_CONCAT(&drainq, &V_sptree_ifnet[i], chain);
 8395         }
 8396         for (i = 0; i < V_sphash_mask + 1; i++)
 8397                 LIST_INIT(&V_sphashtbl[i]);
 8398         SPTREE_WUNLOCK();
 8399         spdcache_destroy();
 8400 
 8401         sp = TAILQ_FIRST(&drainq);
 8402         while (sp != NULL) {
 8403                 nextsp = TAILQ_NEXT(sp, chain);
 8404                 key_freesp(&sp);
 8405                 sp = nextsp;
 8406         }
 8407 
 8408         TAILQ_INIT(&sahdrainq);
 8409         SAHTREE_WLOCK();
 8410         TAILQ_CONCAT(&sahdrainq, &V_sahtree, chain);
 8411         for (i = 0; i < V_savhash_mask + 1; i++)
 8412                 LIST_INIT(&V_savhashtbl[i]);
 8413         for (i = 0; i < V_sahaddrhash_mask + 1; i++)
 8414                 LIST_INIT(&V_sahaddrhashtbl[i]);
 8415         TAILQ_FOREACH(sah, &sahdrainq, chain) {
 8416                 sah->state = SADB_SASTATE_DEAD;
 8417                 TAILQ_FOREACH(sav, &sah->savtree_larval, chain) {
 8418                         sav->state = SADB_SASTATE_DEAD;
 8419                 }
 8420                 TAILQ_FOREACH(sav, &sah->savtree_alive, chain) {
 8421                         sav->state = SADB_SASTATE_DEAD;
 8422                 }
 8423         }
 8424         SAHTREE_WUNLOCK();
 8425 
 8426         key_freesah_flushed(&sahdrainq);
 8427         hashdestroy(V_sphashtbl, M_IPSEC_SP, V_sphash_mask);
 8428         hashdestroy(V_savhashtbl, M_IPSEC_SA, V_savhash_mask);
 8429         hashdestroy(V_sahaddrhashtbl, M_IPSEC_SAH, V_sahaddrhash_mask);
 8430 
 8431         REGTREE_LOCK();
 8432         for (i = 0; i <= SADB_SATYPE_MAX; i++) {
 8433                 LIST_FOREACH(reg, &V_regtree[i], chain) {
 8434                         if (__LIST_CHAINED(reg)) {
 8435                                 LIST_REMOVE(reg, chain);
 8436                                 free(reg, M_IPSEC_SAR);
 8437                                 break;
 8438                         }
 8439                 }
 8440         }
 8441         REGTREE_UNLOCK();
 8442 
 8443         ACQ_LOCK();
 8444         acq = LIST_FIRST(&V_acqtree);
 8445         while (acq != NULL) {
 8446                 nextacq = LIST_NEXT(acq, chain);
 8447                 LIST_REMOVE(acq, chain);
 8448                 free(acq, M_IPSEC_SAQ);
 8449                 acq = nextacq;
 8450         }
 8451         for (i = 0; i < V_acqaddrhash_mask + 1; i++)
 8452                 LIST_INIT(&V_acqaddrhashtbl[i]);
 8453         for (i = 0; i < V_acqseqhash_mask + 1; i++)
 8454                 LIST_INIT(&V_acqseqhashtbl[i]);
 8455         ACQ_UNLOCK();
 8456 
 8457         SPACQ_LOCK();
 8458         for (spacq = LIST_FIRST(&V_spacqtree); spacq != NULL;
 8459             spacq = nextspacq) {
 8460                 nextspacq = LIST_NEXT(spacq, chain);
 8461                 if (__LIST_CHAINED(spacq)) {
 8462                         LIST_REMOVE(spacq, chain);
 8463                         free(spacq, M_IPSEC_SAQ);
 8464                 }
 8465         }
 8466         SPACQ_UNLOCK();
 8467         hashdestroy(V_acqaddrhashtbl, M_IPSEC_SAQ, V_acqaddrhash_mask);
 8468         hashdestroy(V_acqseqhashtbl, M_IPSEC_SAQ, V_acqseqhash_mask);
 8469 }
 8470 VNET_SYSUNINIT(key_vnet_destroy, SI_SUB_PROTO_DOMAIN, SI_ORDER_SECOND,
 8471     key_vnet_destroy, NULL);
 8472 #endif
 8473 
 8474 /*
 8475  * XXX: as long as domains are not unloadable, this function is never called,
 8476  * provided for consistensy and future unload support.
 8477  */
 8478 static void
 8479 key_destroy(void *arg __unused)
 8480 {
 8481         uma_zdestroy(ipsec_key_lft_zone);
 8482 
 8483 #ifndef IPSEC_DEBUG2
 8484         callout_drain(&key_timer);
 8485 #endif
 8486         SPTREE_LOCK_DESTROY();
 8487         REGTREE_LOCK_DESTROY();
 8488         SAHTREE_LOCK_DESTROY();
 8489         ACQ_LOCK_DESTROY();
 8490         SPACQ_LOCK_DESTROY();
 8491         SPI_ALLOC_LOCK_DESTROY();
 8492 }
 8493 SYSUNINIT(key_destroy, SI_SUB_PROTO_DOMAIN, SI_ORDER_FIRST, key_destroy, NULL);
 8494 
 8495 /* record data transfer on SA, and update timestamps */
 8496 void
 8497 key_sa_recordxfer(struct secasvar *sav, struct mbuf *m)
 8498 {
 8499         IPSEC_ASSERT(sav != NULL, ("Null secasvar"));
 8500         IPSEC_ASSERT(m != NULL, ("Null mbuf"));
 8501 
 8502         /*
 8503          * XXX Currently, there is a difference of bytes size
 8504          * between inbound and outbound processing.
 8505          */
 8506         counter_u64_add(sav->lft_c_bytes, m->m_pkthdr.len);
 8507 
 8508         /*
 8509          * We use the number of packets as the unit of
 8510          * allocations.  We increment the variable
 8511          * whenever {esp,ah}_{in,out}put is called.
 8512          */
 8513         counter_u64_add(sav->lft_c_allocations, 1);
 8514 
 8515         /*
 8516          * NOTE: We record CURRENT usetime by using wall clock,
 8517          * in seconds.  HARD and SOFT lifetime are measured by the time
 8518          * difference (again in seconds) from usetime.
 8519          *
 8520          *      usetime
 8521          *      v     expire   expire
 8522          * -----+-----+--------+---> t
 8523          *      <--------------> HARD
 8524          *      <-----> SOFT
 8525          */
 8526         if (sav->firstused == 0)
 8527                 sav->firstused = time_second;
 8528 }
 8529 
 8530 /*
 8531  * Take one of the kernel's security keys and convert it into a PF_KEY
 8532  * structure within an mbuf, suitable for sending up to a waiting
 8533  * application in user land.
 8534  * 
 8535  * IN: 
 8536  *    src: A pointer to a kernel security key.
 8537  *    exttype: Which type of key this is. Refer to the PF_KEY data structures.
 8538  * OUT:
 8539  *    a valid mbuf or NULL indicating an error
 8540  *
 8541  */
 8542 
 8543 static struct mbuf *
 8544 key_setkey(struct seckey *src, uint16_t exttype) 
 8545 {
 8546         struct mbuf *m;
 8547         struct sadb_key *p;
 8548         int len;
 8549 
 8550         if (src == NULL)
 8551                 return NULL;
 8552 
 8553         len = PFKEY_ALIGN8(sizeof(struct sadb_key) + _KEYLEN(src));
 8554         m = m_get2(len, M_NOWAIT, MT_DATA, 0);
 8555         if (m == NULL)
 8556                 return NULL;
 8557         m_align(m, len);
 8558         m->m_len = len;
 8559         p = mtod(m, struct sadb_key *);
 8560         bzero(p, len);
 8561         p->sadb_key_len = PFKEY_UNIT64(len);
 8562         p->sadb_key_exttype = exttype;
 8563         p->sadb_key_bits = src->bits;
 8564         bcopy(src->key_data, _KEYBUF(p), _KEYLEN(src));
 8565 
 8566         return m;
 8567 }
 8568 
 8569 /*
 8570  * Take one of the kernel's lifetime data structures and convert it
 8571  * into a PF_KEY structure within an mbuf, suitable for sending up to
 8572  * a waiting application in user land.
 8573  * 
 8574  * IN: 
 8575  *    src: A pointer to a kernel lifetime structure.
 8576  *    exttype: Which type of lifetime this is. Refer to the PF_KEY 
 8577  *             data structures for more information.
 8578  * OUT:
 8579  *    a valid mbuf or NULL indicating an error
 8580  *
 8581  */
 8582 
 8583 static struct mbuf *
 8584 key_setlifetime(struct seclifetime *src, uint16_t exttype)
 8585 {
 8586         struct mbuf *m = NULL;
 8587         struct sadb_lifetime *p;
 8588         int len = PFKEY_ALIGN8(sizeof(struct sadb_lifetime));
 8589 
 8590         if (src == NULL)
 8591                 return NULL;
 8592 
 8593         m = m_get2(len, M_NOWAIT, MT_DATA, 0);
 8594         if (m == NULL)
 8595                 return m;
 8596         m_align(m, len);
 8597         m->m_len = len;
 8598         p = mtod(m, struct sadb_lifetime *);
 8599 
 8600         bzero(p, len);
 8601         p->sadb_lifetime_len = PFKEY_UNIT64(len);
 8602         p->sadb_lifetime_exttype = exttype;
 8603         p->sadb_lifetime_allocations = src->allocations;
 8604         p->sadb_lifetime_bytes = src->bytes;
 8605         p->sadb_lifetime_addtime = src->addtime;
 8606         p->sadb_lifetime_usetime = src->usetime;
 8607 
 8608         return m;
 8609 
 8610 }
 8611 
 8612 const struct enc_xform *
 8613 enc_algorithm_lookup(int alg)
 8614 {
 8615         int i;
 8616 
 8617         for (i = 0; i < nitems(supported_ealgs); i++)
 8618                 if (alg == supported_ealgs[i].sadb_alg)
 8619                         return (supported_ealgs[i].xform);
 8620         return (NULL);
 8621 }
 8622 
 8623 const struct auth_hash *
 8624 auth_algorithm_lookup(int alg)
 8625 {
 8626         int i;
 8627 
 8628         for (i = 0; i < nitems(supported_aalgs); i++)
 8629                 if (alg == supported_aalgs[i].sadb_alg)
 8630                         return (supported_aalgs[i].xform);
 8631         return (NULL);
 8632 }
 8633 
 8634 const struct comp_algo *
 8635 comp_algorithm_lookup(int alg)
 8636 {
 8637         int i;
 8638 
 8639         for (i = 0; i < nitems(supported_calgs); i++)
 8640                 if (alg == supported_calgs[i].sadb_alg)
 8641                         return (supported_calgs[i].xform);
 8642         return (NULL);
 8643 }

Cache object: 8d35262cbbd36b2ad3524b84ca2423e2


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.