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