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